首页 文章

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

提问于
浏览
1

你好,当使用以下输入运行antlr4时,我得到以下 error 图像显示问题

[
image showing problem1

我一直试图通过在这里和那里做一些改变来解决它,但它似乎只有 write component whileLoop new line .

你能告诉我我是 missing here 以及为什么问题 persits

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`**

1 回答

  • 4

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

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

    VS

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

    关键部分是 ' '* . 这定义了一个隐式词法分析器 . 它匹配空格,它在 WS 之上定义 . 因此,任何空格序列都不会被处理为 WS ,而是作为隐式标记处理 .

    如果我正确地在whileloop的组件之间放置选项卡将起作用,那么在它们之间放置多个空格应该可行 . 你应该简单地删除 ' '* ,因为无论如何都要跳过空格 .

相关问题