我正在尝试创建一个简单的现在只有整数算术表达式解析器。现在我有:
grammar MyExpr;
input: (expr NEWLINE)+;
expr: '(' expr ')'
| '-' expr
| <assoc = right> expr '^' expr
| expr ('*' | '/') expr
| expr ('+' | '-') expr
| ID '(' ExpressionList? ')'
| INT;
ExpressionList : expr (',' expr)*;
ID : [a-zA-Z]+;
INT : DIGIT+;
DIGIT: [0-9];
NEWLINE : '\r'?'\n';
WS : [\t]+ -> skip;
规则ExpressionList似乎会导致一些问题。如果我删除包含ExpressionList的所有内容,所有内容都会编译并且似乎运行正常。但是像上面一样,我得到的错误如下:
error(160): MyExpr.g4:14:17: reference to parser rule expr in lexer rule ExpressionList
error(126): MyExpr.g4:7:6: cannot create implicit token for string literal in non-combined grammar: '-'
我正在使用Eclipse和Antlr4插件。我试着按照antlr4-book中给出的cymbol语法进行定位。
有人能告诉我我的小语法出了什么问题吗?
答案 0 :(得分:5)
自己找到它:
以大写字母开头的规则是指Lexer规则。因此,我所要做的就是将ExpressionList重命名为expressionList。
也许其他人会在某一天发现这个有用;)