ANTLR4:无关的输入错误

sm8*_*095 2 parsing antlr calculator lang antlr4

我正在阅读"最终的ANTLR4参考"一书,并决定在他们的计算器语法中添加几个关键字以帮助清除记忆.构建语法并编译生成的java代码可以正常工作,但是当我执行访问者代码时,我得到了错误:"line 6:0 extraneous input '$rem' expecting {<EOF>, '(', ID, INT, NEWLINE}"对于'$clearmem'第8行:0也是如此.

这是我的语法文件:

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: '-' ;
Run Code Online (Sandbox Code Playgroud)

和.expr文件以及要解析的代码:

193
a = 5
b = 6
a
b 
$rem a
a
$clearmem
Run Code Online (Sandbox Code Playgroud)

我昨晚刚刚开始使用ANTLR4,所以我真的不知道要找错误的方法,但从我所知道的任何一个文件都没有错.

我确信我错过了一些非常简单的东西,但我能找到它,所以我很感激任何对ANTLR4更熟悉的人的帮助.

谢谢.

Sam*_*ell 5

问题是你的prog规则:

prog: kword+
  | stat+ 
  ;
Run Code Online (Sandbox Code Playgroud)

该规则规定该程序由一个或多个kword规则或一个或多个stat规则组成.没有包含a kword和的程序stat.您可能要编写的内容如下,它允许任何序列kword或stat规则.请注意,我更改+为*允许空程序.即使您的编译器不允许该程序为空,此错误最好留给访问者或监听器进行验证.

prog
  : ( kword
    | stat
    )*
  ;
Run Code Online (Sandbox Code Playgroud)