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;
关于ANTLR4错误: Missing NEWLINE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31164531/