如何在 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 无论如何都会被跳过。
你好,当 运行 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 无论如何都会被跳过。