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;