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
标记结束解析所有输入。
这是我的 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
标记结束解析所有输入。