ANTLR4:无关输入误差



我正在遵循"确定的antlr4参考"书籍,并决定在其计算器语法上添加几个关键字以帮助清除内存。构建语法并编译由此产生的Java代码工作正常,但是当我执行访问者代码时,我会在8:0上获得"line 6:0 extraneous input '$rem' expecting {<EOF>, '(', ID, INT, NEWLINE}"的错误:CC_1且相同。

这是我的语法文件:

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更熟悉的人的帮助。

谢谢。

问题是您的prog规则:

prog: kword+
  | stat+ 
  ;

该规则指出程序由一个或多个kword规则一个或多个stat规则组成。没有程序同时包括kwordstat。您可能要编写的是以下内容,该序列允许任何kwordstat规则的序列。请注意,我将+更改为*,以允许一个空程序。即使您的编译器不允许程序为空,也最好在访问者或侦听器中验证此错误。

prog
  : ( kword
    | stat
    )*
  ;

相关内容

  • 没有找到相关文章

最新更新