您好,当使用以下输入运行 antlr4 时,我收到以下 显示问题的错误图像
[
我一直试图通过在这里和那里进行一些更改来修复它,但似乎只有当我在新行中编写whileLoop 的每个组件时它才有效。
你能告诉我我在这里缺少什么以及为什么问题仍然存在吗?
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`**
Run Code Online (Sandbox Code Playgroud)
您的词法分析器规则会产生冲突:
body : ('BODY' ' '*) anything | 'BODY' 'BEGIN' anything* 'END' ;
对比
WS : [ \t\r\n]+ -> skip ;
临界区是' '*
. 这定义了一个隐式词法分析器标记。它匹配空格,并且在 上面定义WS
。因此,任何空格序列都不会WS
作为隐式标记处理。
如果我在 whileloop 的组件之间放置选项卡是正确的,那么在它们之间放置多个空格也应该可以。您应该简单地删除' '*
,因为无论如何都要跳过空格。