如何在 antlr4 中修复无关输入 ' ' expecting

How to fix extraneous input ' ' expecting, in antlr4

你好,当 运行 antlr4 具有以下输入时,我得到以下 error 图片显示问题

[

我一直在尝试通过在这里和那里进行一些更改来修复它,但它似乎只有在我 write 每个 component 时才有效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`**

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

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

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

关键部分是' '*。这定义了一个隐式词法分析器标记。它匹配 spaces 并且定义在 WS 之上。所以 space 的任何序列都不会作为 WS 处理,而是作为隐式标记处理。

如果我是对的,在 whileloop 的组件之间放置制表符会起作用,在它们之间放置多个 space 也应该起作用。你应该简单地删除 ' '*,因为 whitespace 无论如何都会被跳过。