将 Lemon 解析器与自定义标记值一起使用

Using Lemon parser with custom token values

我正在将一个旧语法移植到 lemon 并且我已经在头文件中定义了所有终端符号;我想将它们与这些值一起使用,而不是柠檬在 parser.h 中生成的值:这可能吗?
覆盖 parser.h 完全没用,因为那只是内部发生的事情的镜像,匹配的值将保持相同。
(由于 lemon 与 Bison 共享很多代码,我认为 bison 的解决方案也可以解决 lemon 中的问题)

使用 bison,您可以通过在 %token 指令(例如 %token TOK 263)中声明来手动为标记分配值。但是,柠檬中没有该选项(据我所知)。

无论如何,以上并不能真正满足您的要求,因为它不允许您从外部 header 文件中读取令牌值。这对解析器生成器来说不是一个微不足道的要求。为了构建解析表,解析器生成器,无论是 bison 还是 lemon,都必须真正知道与每个标记关联的值,而解析 header 以提取该信息的任务远远超出了解析器生成器;它需要一个嵌入式 C 解析器。

我建议只让解析器生成器生成 header 文件,然后使用它代替现有 header 文件中的定义。唯一的成本 (afaics) 是您需要重新编译项目中引用令牌值的任何部分,这通常仅限于词法分析器。