使用antlr4生成go代码获取符号类型冲突错误

Posted

技术标签:

【中文标题】使用antlr4生成go代码获取符号类型冲突错误【英文标题】:use antlr4 to generate go code get symbol type conflicts error 【发布时间】:2022-01-20 23:07:19 【问题描述】:

我按照指南 here 使用 antlr generate go mysql 解析器代码,但我得到一些错误,如下所示:

C:\Users\moyuduo\Desktop\antlr\mysql>java org.antlr.v4.Tool -Dlanguage=Go MySQLLexer.g4

C:\Users\moyuduo\Desktop\antlr\mysql>java org.antlr.v4.Tool -Dlanguage=Go MySQLParser.g4
error(134): MySQLParser.g4:476:61: symbol type conflicts with generated code in target language or runtime
error(134): MySQLParser.g4:757:18: symbol type conflicts with generated code in target language or runtime
error(134): MySQLParser.g4:776:22: symbol type conflicts with generated code in target language or runtime
error(134): MySQLParser.g4:1301:6: symbol type conflicts with generated code in target language or runtime
error(134): MySQLParser.g4:1305:4: symbol type conflicts with generated code in target language or runtime
error(134): MySQLParser.g4:1687:4: symbol type conflicts with generated code in target language or runtime
...

但是使用antlr生成java代码是可以的,为什么呢? 有人帮我吗?

【问题讨论】:

你应该使用grammars-v4/sql/mysql的语法。我花了数百个小时无偿地清理这些语法。 mysql/ 语法的 Go 目标有效。您应该使用trgen 为 Go 目标(或其他目标之一)生成驱动程序和 makefile。人们不应该用手来做这件事。 【参考方案1】:

type 是 Go 中的关键字。 MySQLParger.g4 文件中的第 476 行是:

AGGREGATE_SYMBOL? FUNCTION_SYMBOL udfName RETURNS_SYMBOL type = (

您需要将该行中的 type 更改为与 Go 关键字不冲突的内容。

我相信您会在其他报告中找到类似的案例。

语法作者很难避免以避免所有目标语言冲突的方式命名事物,所以会出现这样的事情。

【讨论】:

以上是关于使用antlr4生成go代码获取符号类型冲突错误的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript antlr4ts 监听器类型抛出错误

ANTLR4入门:使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

ANTLR4入门:使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

一定义 protobuf 消息并生成 Go 代码

获取错误“选择表数据时,参数类型错误,超出可接受的范围或彼此冲突”

sprintf转换类型和参数类型必须一致么