有没有大佬懂antlr,这段简单的antlr为什么会报错?

作者站长头像
站长
· 阅读数 14

有没有大佬懂antlr,这段简单的antlr为什么会报错?

grammar Expr;
prog: expr EOF;
expr: expr('*'|'/') expr  #MultiOrDiv
    | expr('+'|'-') expr  #AddOrSub
    | INT     #Lieteral
    | '(' expr ')'   #Single
    ;
NEWLINE : [\r\n]+ -> skip;

刚学antlr,最简单的这个antlr应该是实现加减乘除法,但是一直报语法错误

1:1 token recognition error at: '+'
1:3 token recognition error at: '*'
1:2 mismatched input '2' expecting {, '*', '/', '+', '-'}

有没有懂的大佬指教下!

回复
1个回答
avatar
test
2024-06-24

原因

你的 INT 没有定义。

解决方法

grammar Expr;

fragment Digits
    : [0-9] ([0-9_]* [0-9])?
    ;
INT:    ('0' | [1-9] (Digits? | '_'+ Digits));

prog: expr EOF;


expr: expr('*'|'/') expr  #MultiOrDiv
    | expr('+'|'-') expr  #AddOrSub
    | INT     #Lieteral
    | '(' expr ')'   #Single
    ;
NEWLINE : [\r\n]+ -> skip;

结果

answer image

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容