2016-05-05 70 views
0

當然,我正在執行一個ANTLR4生成BaseListener<Void>ANTLR4 - > Lexer符號訪問者訪問

當我需要檢查令牌是否是一個或另一個,我做喜歡的東西:

@Override 
public Void visitTerminal(TerminalNode node) { 

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

    return super.visitTerminal(node); 
} 

是否有某種方式來避免這些";"","? 我想出這樣的,因爲我已經聲明此令牌作爲我的語法詞法分析規則:

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

我可以寫類似Lexer.SCOL(...),或者Lexer.COMMA.equals(...)

回答

0

你可以得到詞法分析器類型從節點通過node.getSymbol()。getType();

+0

很抱歉,但我不是很能找出'node.getSymbol()。getType()''int'返回的值關係是根據'';''還是'''',''。什麼是'int'返回值?我怎樣才能用'node.getSymbol()。getType()'代替'「;」。equals(...)' – Jordi

+0

哦,我假定你知道詞法分析器從文本中產生詞法符號,因爲這是在使用解析器時學習的第一件事情之一。 –

0

Antlr4生成GrammLexer其中包含每個詞法規則:

所以,更換將是:

@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); 
} 

或者,

@Override 
public Void visitTerminal(TerminalNode node) { 

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

    return super.visitTerminal(node); 
}