我正在从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。所以我想要的是访问*作为某种令牌,我可以比较angainst CalcParser.MUL和CalcParser.MIDDOT等。
任何帮助都将不胜感激。
/杰森
答案 0 :(得分:6)
它缺少op
属性(您可能已删除)的上下文。把它放回去你应该没问题:
expr : expr op=( STAR | FSLASH | DIVIDE | MIDDOT ) expr # MulDiv
// ^
// |
// +--- this one
顺便说一句,我也看到你宣布ID
如下:
[a-zAZ]+
也许你打算这样做:
[a-zA-Z]+