你好,当使用以下输入运行antlr4时,我得到以下 error 图像显示问题
[
我一直试图通过在这里和那里做一些改变来解决它,但它似乎只有 write component whileLoop new line .
你能告诉我我是 missing here 以及为什么问题 persits ?
grammar AM;
COMMENTS :
'{'~[\n|\r]*'}' -> skip
;
body : ('BODY' ' '*) anything | 'BODY' 'BEGIN' anything* 'END' ;
anything : whileLoop | write ;
write : 'WRITE' '(' '"' sentance '"' ')' ;
read : 'READ' '(' '"' sentance '"' ')' ;
whileLoop : 'WHILE' expression 'DO' ;
block : 'BODY' anything 'END';
expression : 'TRUE'|'FALSE' ;
test : ID? {System.out.println("Done");};
logicalOperators : '<' | '>' | '<>' | '<=' | '>=' | '=' ;
numberExpressionS : (NUMBER numberExpression)* ;
numberExpression : ('-' | '/' | '*' | '+' | '%') NUMBER ;
sentance : (ID)* {System.out.println("Sentance");};
WS : [ \t\r\n]+ -> skip ;
NUMBER : [0-9]+ ;
ID : [a-zA-Z0-9]* ;
**`strong text`**
1 回答
您的词法分析器规则会产生冲突:
body : ('BODY' ' '*) anything | 'BODY' 'BEGIN' anything* 'END' ;
VS
WS : [ \t\r\n]+ -> skip ;
关键部分是
' '*
. 这定义了一个隐式词法分析器 . 它匹配空格,它在WS
之上定义 . 因此,任何空格序列都不会被处理为WS
,而是作为隐式标记处理 .如果我正确地在whileloop的组件之间放置选项卡将起作用,那么在它们之间放置多个空格应该可行 . 你应该简单地删除
' '*
,因为无论如何都要跳过空格 .