Antlr4部分匹配但不报错

Antlr4 partially matches but does not report an error

这是我的 antlr4 语法:

grammar TestExpr;

prog: stat ;

stat: expr
    ;

expr : expr '|' expr #orJoin
     | expr '&' expr  #andJoin
     | '(' expr ')'  #nested
     | KEY '=' value  #kv
     ;
value: KEY | VALUE;

KEY : [a-zA-Z] [a-zA-Z0-9_-]* ;
VALUE: [a-zA-Z0-9] [a-zA-Z0-9._-]* ;
WS : [ \t]+ -> skip ; // toss out whitespace

如果输入"a233=A(",只能匹配到"a233=A",我以为会报错,结果没有。

将您的 prog 规则更改为:

prog: stat EOF;

默认情况下,ANTLR 将匹配符合您的语法的最长有效字符序列。这也意味着当某些东西停止“工作”时它将退出解析,如果到那时的一切都是有效的(即使存在更多输入但使解析处于不完整状态)。

通过添加 EOF 规则,您的“规则”是它必须匹配所有输入(包括 EOF),因此您不会遇到此问题。因此,最好的做法是制定任何规则,这些规则应以 EOF 标记结束解析所有输入。