ANTLR4:找不到符号op

J. *_*tin 3 antlr antlr4

我正在从ANTLRv4书中做Calc/Labeled Expression教程,当我编译时,我得到这个:

EvalVisitor.java:33: error: cannot find symbol
        if ( ctx.op.getType() == CalcParser.MUL || ctx.op.getType() == CalcParser.MIDDOT ) {
                ^
  symbol:   variable op
  location: variable ctx of type MulDivContext
Run Code Online (Sandbox Code Playgroud)

公平地说,我对它进行了一些修改.我的语法看起来像这样:

expr    : expr ( STAR | FSLASH | DIVIDE | MIDDOT ) expr     # MulDiv
Run Code Online (Sandbox Code Playgroud)

这些是在CommonLexer文件中定义的,如下所示:

lexer grammar CommonLexerRules;

    ID                      :   [a-zAZ]+ ;
    INT                     :   [0-9]+ ;
    STAR                    :   '*';
Run Code Online (Sandbox Code Playgroud)

这对grun工作正常,测试文件正确排列.但是,我认为通过为*定义一些替代方案,我已经改变了它的工作方式.也就是说,我不想*总是意味着乘法,我也想将MIDDOT'·'解析为乘法.

我的问题是,生成的代码中似乎没有任何".op"?

这看起来是这样的:

  *
 / \
a   b
Run Code Online (Sandbox Code Playgroud)

其中a,b和*为expr.所以我想要的是获取*作为某种令牌,我可以比较angainst CalcParser.MUL和CalcParser.MIDDOT等.

任何帮助,将不胜感激.

/杰森

Bar*_*ers 7

它缺少op属性的上下文(您可能已删除).把它放回去你应该没问题:

expr    : expr op=( STAR | FSLASH | DIVIDE | MIDDOT ) expr     # MulDiv
//             ^
//             |
//             +--- this one
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我也看到你宣布ID如下:

[a-zAZ]+
Run Code Online (Sandbox Code Playgroud)

也许你打算这样做:

[a-zA-Z]+
Run Code Online (Sandbox Code Playgroud)