ANTLR Java8以returnStatement为起始规则解析异常原因咨询
异常原因说明
这个问题和ANTLR的前向lookahead能力无关,根源是官方Java8语法的规则定义和入口解析的默认逻辑冲突:
- 官方Java8Parser的
returnStatement规则定义为:'return' expression? ';' - ANTLR使用自定义规则作为解析入口时,默认要求该规则匹配完整输入流到EOF(流结束标记),且解析过程中会优先选择最短匹配路径。
具体触发错误的逻辑如下:
- 单独传入
return a.b.c();以returnStatement为入口解析时,解析器匹配到a.b后,会先尝试将c识别为属性链的结尾标识符,此时下一个字符是(,和returnStatement规则预期的结尾;不匹配,直接触发解析错误,不会主动回溯尝试匹配方法调用的表达式路径。 - 改用
block作为入口解析时,块上下文的语句匹配逻辑会激活全量表达式匹配分支,会优先尝试匹配方法调用、数组访问等复杂表达式,a.b.c()会被正确识别为方法调用表达式,后续的;也能匹配return语句的结尾要求,因此解析正常。
修复方案
如果需要直接使用returnStatement作为入口解析单独的返回语句,可二选其一操作:
- 修改
returnStatement规则,在末尾强制添加EOF匹配:returnStatement: 'return' expression? ';' EOF; - 解析前开启解析器的完整LL解析模式,关闭SLL快速失败开关,允许解析器遇到歧义时回溯尝试所有匹配路径。
内容的提问来源于stack exchange,提问作者Mike Cargal
相关产品推荐
相关产品推荐

