如何在 antlr4 中修复外来输入 ' ' 期望

Mar*_*Jim 1 antlr antlr4

您好,当使用以下输入运行 antlr4 时,我收到以下 显示问题的错误图像

[图像显示问题[1]

我一直试图通过在这里和那里进行一些更改来修复它,但似乎只有当我在新行中编写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)

Cor*_*onA 5

您的词法分析器规则会产生冲突:

body : ('BODY' ' '*) anything | 'BODY' 'BEGIN' anything* 'END' ;

对比

WS : [ \t\r\n]+ -> skip ;

临界区是' '*. 这定义了一个隐式词法分析器标记。它匹配空格,并且在 上面定义WS。因此,任何空格序列都不会WS作为隐式标记处理。

如果我在 whileloop 的组件之间放置选项卡是正确的,那么在它们之间放置多个空格也应该可以。您应该简单地删除' '*,因为无论如何都要跳过空格。