我制作了一个语法,用于构建表达式之间的比较,如下所示。
grammar EtlExpression;
/** The start rule; begin parsing here. */
prog : comp ;
comp : expr ('='|'<='|'>='|'<'|'>') expr ;
expr : expr ('*'|'/') expr
| expr ('+'|'-') expr
| '(' expr ')'
| func
| ID
| STR
| NUM
;
func : ID '(' expr (',' expr)* ')' ; // function
STR : '"' ('\\"'|.)*? '"' ; // match identifiers
ID : LETTER (LETTER|DIGIT)* ; // match identifiers
NUM : '-'? ('.' DIGIT+ | DIGIT+ ('.' DIGIT*)? ) ; // match number
WS : [ \t\r\n]+ -> skip ; // toss out whitespace
fragment
LETTER : [a-zA-Z] ;
fragment
DIGIT : [0-9] ;
然后我在编译后运行了testRig。 结果如下:
java -cp .;C:\App\Antlr4\antlr-4.7.1-complete.jar org.antlr.v4.gui.TestRig test.antlr.EtlExpression prog -tree
a < b = c
^Z
(prog (comp (expr a) < (expr b)))
comp 规则只指定一个比较操作数,我认为这个测试输入字符串应该发出一些错误,例如&#34;第1行:6令牌识别错误:&#39; =& #39; &#34;,但它只是忽略&#34; = c&#34;一部分。
你能帮我解决语法错误或我如何得到正确的信息吗? 先感谢您。
答案 0 :(得分:1)
解析器只有在无法与=
匹配时才会停止。如果强制解析器使用整个输入,则stdout上将显示错误。您可以通过在EOF
规则中添加prog
来实现这一目标:
prog : comp EOF;