使用错误的输入字符串运行TestRig不会发出错误消息

时间:2018-05-17 13:22:55

标签: antlr4

我制作了一个语法,用于构建表达式之间的比较,如下所示。

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 规则只指定一个比较操作数,我认为这个测试输入字符串应该发出一些错误,例如&#34;第1行:6令牌识别错误:&#39; =& #39; &#34;,但它只是忽略&#34; = c&#34;一部分。

你能帮我解决语法错误或我如何得到正确的信息吗? 先感谢您。

1 个答案:

答案 0 :(得分:1)

解析器只有在无法与=匹配时才会停止。如果强制解析器使用整个输入,则stdout上将显示错误。您可以通过在EOF规则中添加prog来实现这一目标:

prog : comp EOF;