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

时间:2018-06-27 20:54:53

标签: antlr antlr4

语法文件Expr.g4:

grammar Expr;

expr:   expr ('*'|'/'|'+'|'-'|'%') expr 
    |   '(' expr ')'
    |   INT 
    ;

INT :   [0-9]+ ;
WS  :   [ \t\n]+ -> 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>的

grun Expr expr -tokens和EOF的CTRL-D给出:

[@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}

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

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

但是,您不想将EOF添加到expr规则中,因为您还使用该规则来匹配子表达式。因此,相反,您应该定义另一条规则expr EOF,然后使用grun调用该规则。