ANTLR4错误:缺少换行符

ANTLR4错误:缺少换行符,antlr4,Antlr4,有人能解释一下我的代码有什么问题吗?这是我的错误: 谢谢你的帮助 问题在于这些lexer规则: grammar Hello; prog: stat+ EOF; stat: expr NEWLINE # printExpr | ID '=' expr NEWLINE # assign | NEWLINE # blank | STRING NEWLINE # string ; expr: expr (MUL|DIV) expr # o

有人能解释一下我的代码有什么问题吗?这是我的错误:


谢谢你的帮助

问题在于这些lexer规则:

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;`
当lexer在输入字符串中找到
\r\n
时,它将尝试匹配规则,并且两者都将匹配。但是,
WS
将匹配整个
\r\n
,生成一个
WS
标记,
NEWLINE
将匹配
\r
,然后
\n
,生成两个
NEWLINE
标记

在这种情况下,Antlr总是选择最长的匹配,在您的情况下,它将生成
WS
。如果查看
a=3\r\nx=4\r\n
的lexer输出,生成的令牌将是:

NEWLINE : [\r\n] ;
WS : [ \t\r\n]+ -> skip;
但你要找的是:

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

您的语法似乎完全是在期待所有换行符生成
NEWLINE
标记,因此我建议将
WS
规则更改为:

ID WS '=' WS INT NEWLINE ID WS '=' WS INT NEWLINE
a      =      3  \r\n    x      =     4   \r\n
WS: [ \t]+ -> skip;