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;
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;