首页 > 解决方案 > 使用错误的输入字符串运行 TestRig 不会发出错误消息

问题描述

我做了一个语法,它构造表达式之间的比较,如下所示。

grammar EtlExpression;

/** The start rule; begin parsing here. */
prog   : comp ; 

comp   : expr ('='|'<='|'>='|'<'|'>') expr ;

expr   : expr ('*'|'/') expr   
       | expr ('+'|'-') expr   
       | '(' expr ')'         
       | func
       | ID                    
       | STR                    
       | NUM    
       ;

func   : ID '(' expr (',' expr)* ')' ;    // function 

STR    : '"' ('\\"'|.)*? '"' ;                       // match identifiers 
ID     : LETTER (LETTER|DIGIT)* ;                    // match identifiers 
NUM    : '-'? ('.' DIGIT+ | DIGIT+ ('.' DIGIT*)? ) ; // match number
WS     : [ \t\r\n]+ -> skip ;                        // toss out whitespace

fragment
LETTER : [a-zA-Z] ;
fragment
DIGIT  : [0-9] ;

然后我在编译后运行了 testRig。结果如下。

java -cp .;C:\App\Antlr4\antlr-4.7.1-complete.jar org.antlr.v4.gui.TestRig test.antlr.EtlExpression prog -tree
a < b = c
^Z
(prog (comp (expr a) < (expr b)))

comp规则只指定一个比较操作数,我认为这个测试输入字符串应该发出某种错误,例如“line 1:6 token recognition error at: '='”,但它只是忽略了“= c”部分。

你能帮我语法有什么问题或者我怎样才能得到正确的信息吗?先感谢您。

标签: antlr4

解决方案


当解析器无法匹配=并超出它时,解析器就会停止。如果您强制解析器使用整个输入,则会在您的标准输出上出现错误。您可以通过添加EOF到您的prog规则来做到这一点:

prog : comp EOF; 

推荐阅读