ANTLR4 - > Lexer符号访问者访问

时间:2016-05-05 06:40:51

标签: java antlr

Currecntly,我实现了生成Sys.unsetenv("R_LIBS") Sys.unsetenv("R_LIBS_USER") Sys.setenv(R_LIBS_SITE = "D:/R/libs/site") Sys.setenv(R_LIBS_USER = "D:/R/libs/user") Sys.setenv(R_LIBS = "D:/R/libs") 的ANTLR4。

当我需要检查令牌是否是一个或那个时,我做的事情如下:

BaseListener<Void>

有没有办法避免这些@Override public Void visitTerminal(TerminalNode node) { if (";".equals(node.getText())) this.prepareQuery(); else if (",".equals(node.getText())) this.prepareQuery(); return super.visitTerminal(node); } ";"? 我已经弄清楚了,因为我已经宣布这个令牌作为LEXER规则的语法:

","

我可以写一些类似SCOL : ';'; COMMA : ','; Lexer.SCOL(...)的内容吗?:

2 个答案:

答案 0 :(得分:0)

您可以通过node.getSymbol()。getType();从节点获取词法分析器类型。

答案 1 :(得分:0)

Antlr4生成GrammLexer,其中包含每个Lexer规则:

所以,替换将是:

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