我正在阅读“最终的ANTLR4参考”一书,并决定在他们的计算器语法中添加几个关键字以帮助清除记忆。构建语法并编译生成的java代码可以正常工作,但是当我执行访问者代码时,我得到错误:"line 6:0 extraneous input '$rem' expecting {<EOF>, '(', ID, INT, NEWLINE}"
和{8}的'$clearmem'
相同。
这是我的语法文件:
grammar LabeledExpr;
//Parser rules=================================
prog: kword+
| stat+
;
stat: expr endl # printExpr
| ID '=' expr endl # assign
| NEWLINE # blank
;
expr: expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;
kword: '$clearmem' endl #clearMem
| '$rem' ID endl #remVar
;
endl: NEWLINE
| EOF
;
//Lexer rules==================================
ID: [a-zA-Z]+ ;
INT: [0-9]+ ;
NEWLINE: '\r'? '\n' ;
WS: [ \t]+ -> skip;
MUL: '*' ;
DIV: '/' ;
ADD: '+' ;
SUB: '-' ;
带有要解析的代码的.expr文件:
193
a = 5
b = 6
a
b
$rem a
a
$clearmem
我昨晚刚刚开始使用ANTLR4,所以我真的不知道要找错误的方法,但从我所知道的任何一个文件都没有错。
我确信我错过了一些非常简单的东西,但我能找到它,所以我很感激任何对ANTLR4更熟悉的人的帮助。
感谢。
答案 0 :(得分:5)
问题在于您的prog
规则:
prog: kword+
| stat+
;
此规则声明该程序包含一个或多个kword
规则或一个或多个stat
规则。没有包含kword
和stat
的计划。你可能想写的是以下内容,它允许kword
或stat
规则的任何序列。请注意,我将+
更改为*
以允许空程序。即使您的编译器不允许该程序为空,这个错误最好留给访问者或监听者进行验证。
prog
: ( kword
| stat
)*
;