ANTLR 4 / 解析器将错误的表达式识别为有效



语法文件 Expr.g4:

grammar Expr;
expr:   expr ('*'|'/'|'+'|'-'|'%') expr 
|   '(' expr ')'
|   INT 
;
INT :   [0-9]+ ;
WS  :   [ tn]+ -> skip ;

我使用当前的 ANTLR 版本 4.7.1: 在 ./bashrc 中:

alias antlr4='java -jar ~/antlr4/antlr-4.7.1-complete.jar'
alias grun='java org.antlr.v4.runtime.misc.TestRig'

使用此语法,表达式 '1(' 不应被识别为有效, 但事实确实如此。

在命令行上使用输入"1("和 CTRL-D 的 EOFgrun Expr expr -tokens给出:

[@0,0:0='1',<INT>,1:0]
[@1,1:1='(',<'('>,1:1]
[@2,2:1='<EOF>',<EOF>,1:2]

虽然表达式"1("不被拒绝,但"(1"是:

[@0,0:0=')',<')'>,1:0]
[@1,1:1='1',<INT>,1:1]
[@2,2:1='<EOF>',<EOF>,1:2]
line 1:0 extraneous input ')' expecting {'(', INT}

我错过了什么吗?

当您在 ANTLR 中调用规则时,只要它可以匹配输入的任何前缀,它就会成功返回结果。如果希望规则仅在与整个剩余输入匹配时才成功,则需要添加EOF作为最后一个令牌。

但是,您不希望向expr规则添加EOF,因为您还使用该规则来匹配子表达式。因此,您应该定义另一个只是expr EOF的规则,并使用grun调用该规则。

相关内容

  • 没有找到相关文章

最新更新