ANTLR4是否仍支持无扫描器解析器语法?4.7+版本生成代码编译报错如何解决
问题根因
ANTLR 4.7版本开始新增了自动生成字面量终结符访问方法的特性,4.6及更早版本不会为引号包裹的字符字面量生成对应的上下文访问方法,新版本默认会生成该类方法,但生成逻辑没有对Java合法标识符做校验,直接把','这类不符合Java标识符规范的字符字面量直接用作方法名、常量名,才会触发你遇到的编译错误。
无扫描器解析器本身在新版ANTLR中仍然受支持,只是你原本的基于字符字面量直接引用的定义方式不符合新版的代码生成规则要求。
最优解决方案
你可以根据自己的需求选择以下两种方案:
方案一:给字符字面量定义合法别名(推荐长期使用)
在语法文件开头的tokens块中,给所有用到的字符字面量绑定符合Java标识符规范的别名,示例如下:tokens { STAR='*', PLUS='+', COMMA=',', // 其余用到的字符字面量都按此格式补充定义 }之后将所有语法规则中直接引用引号字面量的写法替换为对应的别名,比如将原有的
star: '*' ws? ;改为star: STAR ws? ;。ANTLR生成代码时会使用你定义的合法标识符作为方法名,不会再生成非法的无效代码,同时也能提升语法文件的可读性。方案二:禁用访问方法生成特性(改造成本最低)
如果你不想改动现有语法文件,可以在调用ANTLR代码生成工具时添加参数-no-accessors,该参数会关闭新版新增的终结符访问方法生成逻辑,生成的代码结构和4.6版本完全一致,不会出现多余的非法方法,无需调整原有语法即可正常编译运行。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

