运行带有以下输入的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`**
答案 0 :(得分:4)
您的词法分析规则会产生冲突:
body : ('BODY' ' '*) anything | 'BODY' 'BEGIN' anything* 'END' ;
VS
WS : [ \t\r\n]+ -> skip ;
关键部分是' '*
。这定义了一个隐式词法分析器。它匹配空格,它在WS
之上定义。因此,任何空格序列都不会被处理为WS
,而是作为隐式令牌。
如果我正确地在whileloop的组件之间放置标签将起作用,那么在它们之间放置多个空格应该可行。您应该只删除' '*
,因为无论如何都要跳过空格。