Ast Parser

  • Themenstarter Themenstarter sunny71
  • Beginndatum Beginndatum
S

sunny71

Hallo,

Ich habe mit dem Demo-Tool AST-Explorer gespielt.
Es gibt die CompilationUnit.
Hier gibt es folgendes Attribut: ASTNode.NodeList types
in types werden alle Informationen zu der übergebenen Klasse gespeichert, also in so ner Art Baumstruktur angelegt.

Im Prinzip weiss ich wie die Knoten angelegt werden, doch fehlen mir noch Details.
Was ich bisher rausgefunden habe:

int act = START_STATE;
this.stateStackTop = -1;

//dem stack werden beispielsweise solche Values hinzugefügt
767, 1233, 8358, 9638, 734, 2105, dabei spielt dann stateStackTop eine Rolle.

this.stack[this.stateStackTop] = act;
mit act = tAction(act, this.currentToken);
// hier werden die oben genannten values ermittelt....wobei dann später entschieden wird,
// welcher if-zweig weiterbearbeitet wird.

Code:
if (act == ERROR_ACTION || this.restartRecovery) {
				
				int errorPos = this.scanner.currentPosition;
				if (!this.hasReportedError) {
					this.hasError = true;
				}
				if (resumeOnSyntaxError()) {
					if (act == ERROR_ACTION)
						this.lastErrorEndPosition = errorPos;
					act = START_STATE;
					this.stateStackTop = -1;
					this.currentToken = getFirstToken();
					continue ProcessTerminals;
				}
				act = ERROR_ACTION;
				break ProcessTerminals;
			}

oder in
Code:
if (act <= NUM_RULES) {
				System.out.println("if (act <= NUM_RULES)");
				this.stateStackTop--;
				System.out.println("stateStackTop:"+stateStackTop);

			} else if (act > ERROR_ACTION) { /* shift-reduce */
				consumeToken(this.currentToken);
				if (this.currentElement != null)
					this.recoveryTokenCheck();
				try {
					this.currentToken = this.scanner.getNextToken();
				} catch (InvalidInputException e) {
					if (!this.hasReportedError) {
						this.problemReporter().scannerError(this, e.getMessage());
						this.hasReportedError = true;
					}
					this.lastCheckPoint = this.scanner.currentPosition;
					this.restartRecovery = true;
				}
				if (this.statementRecoveryActivated) {
					jumpOverTypeAfterReduce = true;
				}
				act -= ERROR_ACTION;

			} else {
				if (act < ACCEPT_ACTION) { /* shift */

					System.out.println("Parser.parse() if (act < ACCEPT_ACTION) currentToken:"+this.currentToken);
					consumeToken(this.currentToken);

					if (this.currentElement != null)
						this.recoveryTokenCheck();
					try {
						this.currentToken = this.scanner.getNextToken();
					} catch (InvalidInputException e) {
						if (!this.hasReportedError) {
							this.problemReporter().scannerError(this, e.getMessage());
							this.hasReportedError = true;
						}
						this.lastCheckPoint = this.scanner.currentPosition;
						this.restartRecovery = true;
					}
					if (this.statementRecoveryActivated) {
						this.jumpOverType();
					}
					continue ProcessTerminals;
				}
				break ProcessTerminals;
			}

es gibt da eine Methode
Parser.initTables....in der folgende arrays term_action, term_check und base_action initialisiert werden.
Code:
lhs = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
rhs = readByteTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
term_action = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
term_check = readByteTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$

die Arrays werden aus "parser1.rsc" gefüllt.
In diesem Verzeichnis ...org.eclipse.jdt.core\src\org\eclipse\jdt\internal\compiler\parser\
Jetzt die Frage: weiß jemand etwas über die Dateien?:confused:

Vielen Dank im voraus
 
Hallo,

in org.eclipse.jdt.internal.compiler.parser.Parser steht folgender Komentar:
Java:
public final static void buildFilesFromLPG(String dataFilename, String dataFilename2) {

    //RUN THIS METHOD TO GENERATE PARSER*.RSC FILES

    //build from the lpg javadcl.java files that represents the parser tables
    //lhs check_table asb asr symbol_index

    //[org.eclipse.jdt.internal.compiler.parser.Parser.buildFilesFromLPG("d:/leapfrog/grammar/javadcl.java")]
...
anschließend werden die rsc Files eingelesen.

Siehe auch hier:
http://www.eclipse.org/jdt/core/howto/generate parser/generateParser.html
http://dev.eclipse.org/mhonarc/lists/jdt-core-dev/msg01535.html

Gruß Tom
 
Zurück