2016-05-05 45 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); 
}