ANTLR4 Error : Missing NEWLINE

ANTLR4 Error : Missing NEWLINE

grammar Hello;          
prog:   stat+ EOF;
stat:   expr NEWLINE    # printExpr 
|   ID '=' expr NEWLINE # assign
|   NEWLINE     # blank 
|   STRING NEWLINE  # string
;
expr:   expr (MUL|DIV) expr # opExpr
|   expr (ADD|SUB) expr # opExpr
|   expr AND expr # andExpr
|   INT         # int
|   ID          # id
|   '(' expr ')'        # parens
;
MUL:    '*';
DIV:    '/';
ADD:    '+';
SUB:    '-';
ID: [a-zA-Z]+[0-9a-zA-Z]*;
NEWLINE : [\r\n] ;
INT     : [0-9]+ ;
AND :     '&';
WS  : [ \t\r\n]+ -> skip;
CM  : '//' ~[\r\n]* -> skip;`

有人可以向我解释我的代码有什么问题吗?这是我的错误:

我们将不胜感激您的帮助!

问题出在这些词法分析器规则中:

NEWLINE : [\r\n] ;
WS : [ \t\r\n]+ -> skip;

当词法分析器在输入字符串中发现一个\r\n时,它会尝试匹配规则,两者都会匹配。但是,WS 将匹配整个 \r\n,生成一个 WS 标记,而 NEWLINE 将匹配 \r 然后 \n,生成两个 NEWLINE 代币。

在这种情况下,Antlr 总是选择最长的匹配,在你的情况下它将产生 WS。如果您查看 a = 3\r\nx = 4\r\n 的词法分析器输出,生成的标记将是:

ID WS '=' WS INT WS    ID WS '=' WS INT WS
a      =      3 \r\n   x      =     4   \r\n

但是你要找的是:

ID WS '=' WS INT NEWLINE ID WS '=' WS INT NEWLINE
a      =      3  \r\n    x      =     4   \r\n

您的语法似乎完全是在预期所有换行符都会生成 NEWLINE 标记的情况下编写的,因此我建议将 WS 规则更改为:

WS: [ \t]+ -> skip;