ANTLR 4 / 解析器将错误的表达式识别为有效
ANTLR 4 / Parser recognizes erroneous expression as valid
语法文件 Expr.g4:
grammar Expr;
expr: expr ('*'|'/'|'+'|'-'|'%') expr
| '(' expr ')'
| INT
;
INT : [0-9]+ ;
WS : [ \t\n]+ -> skip ;
我使用当前的 ANTLR-Version 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(”不应被识别为有效,
但确实如此。
grun Expr expr -tokens
在命令行上输入 '1(' 和 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}
我是不是漏掉了什么?
当您在 ANTLR 中调用规则时,它会成功 returns 一个结果,只要它可以匹配输入的任何前缀。如果您希望规则仅在匹配整个剩余输入时才成功,则需要添加 EOF
作为最后一个标记。
但是,您不想将 EOF
添加到 expr
规则,因为您还使用该规则来匹配子表达式。因此,您应该定义另一个规则 expr EOF
并使用 grun
.
调用该规则
语法文件 Expr.g4:
grammar Expr;
expr: expr ('*'|'/'|'+'|'-'|'%') expr
| '(' expr ')'
| INT
;
INT : [0-9]+ ;
WS : [ \t\n]+ -> skip ;
我使用当前的 ANTLR-Version 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(”不应被识别为有效, 但确实如此。
grun Expr expr -tokens
在命令行上输入 '1(' 和 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}
我是不是漏掉了什么?
当您在 ANTLR 中调用规则时,它会成功 returns 一个结果,只要它可以匹配输入的任何前缀。如果您希望规则仅在匹配整个剩余输入时才成功,则需要添加 EOF
作为最后一个标记。
但是,您不想将 EOF
添加到 expr
规则,因为您还使用该规则来匹配子表达式。因此,您应该定义另一个规则 expr EOF
并使用 grun
.