antlr4 - 使用错误的输入字符串运行 TestRig 不会发出错误消息
问题描述
我做了一个语法,它构造表达式之间的比较,如下所示。
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规则只指定一个比较操作数,我认为这个测试输入字符串应该发出某种错误,例如“line 1:6 token recognition error at: '='”,但它只是忽略了“= c”部分。
你能帮我语法有什么问题或者我怎样才能得到正确的信息吗?先感谢您。
解决方案
当解析器无法匹配=
并超出它时,解析器就会停止。如果您强制解析器使用整个输入,则会在您的标准输出上出现错误。您可以通过添加EOF
到您的prog
规则来做到这一点:
prog : comp EOF;
推荐阅读
- css - 为什么相同的字体在不同的浏览器上看起来不一样?
- c# - 加载 XAML 并正确显示
- f# - 忽略函数的 F# 内联如何处理副作用函数
- tensorflow - 与 GPU 并行构建 TensorFlow 数据
- lua - Lua - 初始化空表的正确方法
- typescript - 为什么 TS Generic Type 会根据下面的代码运行两次?
- jenkins - 詹金斯。如何在几个阶段使用一个过程
- salesforce - 检测沙盒类型 (Salesforce)
- python - 如果提供了空的元素列表,如何使 IN 表达式成为可选参数?
- hybris - FlexibleSearch - 搜索产品和类别