ANTLR4:找不到符号op

ANTLR4:找不到符号op,antlr,antlr4,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: varia

我正在做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
  *
 / \
a   b
它们在CommonLexer文件中定义如下:

lexer grammar CommonLexerRules;

    ID                      :   [a-zAZ]+ ;
    INT                     :   [0-9]+ ;
    STAR                    :   '*';
这在grun中运行良好,测试文件的词法正确。然而,我想我已经改变了它的工作方式,为*定义了一些替代方案。也就是说,我不想总是指乘法,我还想将MIDDOT“·”解析为乘法

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

这看起来是这样的:

expr    : expr ( STAR | FSLASH | DIVIDE | MIDDOT ) expr     # MulDiv
  *
 / \
a   b
其中a、b和*是表达式。所以我想要的是访问*作为某种令牌,我可以比较angainst CalcParser.MUL和CalcParser.MIDDOT等

任何帮助都将不胜感激


/Jason

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

expr    : expr op=( STAR | FSLASH | DIVIDE | MIDDOT ) expr     # MulDiv
//             ^
//             |
//             +--- this one
顺便说一句,我还看到您声明了一个
ID
,如下所示:

[a-zAZ]+
也许你本打算这样做:

[a-zA-Z]+

天哪,我真不敢相信我错过了。你太牛了