2016-05-05 5 views
0

Currently implementiere ich eine ANTLR4 generiert BaseListener<Void>.ANTLR4 -> Lexer Symbole Zugriff von Besuchern

Wenn ich brauche zu prüfen, ob ein Token eine oder andere ist, mache ich Dinge wie:

@Override 
public Void visitTerminal(TerminalNode node) { 

    if (";".equals(node.getText())) 
     this.prepareQuery(); 
    else if (",".equals(node.getText())) 
     this.prepareQuery(); 

    return super.visitTerminal(node); 
} 

Gibt es eine Möglichkeit diese ";", "," zu vermeiden? Ich bin so herausfinden, da ich erklärt habe dies als LEXER Regeln für meine Grammatik-Token:

SCOL : ';'; 
COMMA : ','; 

Kann ich so etwas wie Lexer.SCOL(...) schreiben oder Lexer.COMMA.equals(...):

Antwort

0

Sie können den Lexer-Typen erhalten vom Knoten über node.getSymbol(). getType();

+0

Sorry, aber ich bin nicht ganz in der Lage zu herauszufinden, was ist 'node.getSymbol(). getType()' 'int' zurückgegeben Wert Beziehung dort ist entsprechend' ";" oder '", "'. Was hat der Wert "int"? Wie kann ich "" ersetzen?. Equals (...) 'using' node.getSymbol(). GetType() ' – Jordi

+0

Oh, ich nahm an, Sie wissen, dass ein Lexer Lexer-Symbole aus dem Text generiert, wie dies ist eines der ersten Dinge, die Sie lernen, wenn Sie mit Parsern arbeiten. –

0

Antlr4 ein GrammLexer erzeugt, wo jede Lexer Rule enthält:

So würde der Ersatz sein:

@Override 
public Void visitTerminal(TerminalNode node) { 

    if (GrammLexer.SCOL == node.getSymbol().getType())) 
     this.prepareQuery(); 
    else if (GrammLexer.COMMA == node.getText().getType()) 
     this.prepareQuery(); 

    return super.visitTerminal(node); 
} 

Oder

@Override 
public Void visitTerminal(TerminalNode node) { 

    switch (node.getSymbol().getType()) 
    { 
     case GrammarLexer.SCOL: 
      break; 
     case GrammarLexer.COMMA: 
      break; 
    } 

    return super.visitTerminal(node); 
}