我正在做 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

公平地说,我对它进行了一些修改。我的语法是这样的:
expr    : expr ( STAR | FSLASH | DIVIDE | MIDDOT ) expr     # MulDiv

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

    ID                      :   [a-zAZ]+ ;
    INT                     :   [0-9]+ ;
    STAR                    :   '*';

这适用于 grun 并且测试文件被正确地词法分析。但是,我认为我已经通过为 *.也就是说,我不希望 * 总是表示乘法,我也想将 MIDDOT '·' 解析为乘法。

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

这看起来像这样:
  *
 / \
a   b

其中 a、b 和 * 是 expr。所以我想要的是访问 * 作为某种 token ,我可以将其与 CalcParser.MUL 和 CalcParser.MIDDOT 等进行比较。

任何帮助,将不胜感激。

/杰森

最佳答案

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

expr    : expr op=( STAR | FSLASH | DIVIDE | MIDDOT ) expr     # MulDiv
//             ^
//             |
//             +--- this one

顺便说一句,我也看到你已经声明了一个 ID 如下:
[a-zAZ]+

也许你打算这样做:
[a-zA-Z]+

?

10-06 10:25