Parsing 使用带有自定义标记值的Lemon解析器

Parsing 使用带有自定义标记值的Lemon解析器,parsing,bison,lemon,Parsing,Bison,Lemon,我正在将一个旧语法移植到lemon,并且我已经在头文件中定义了所有的终端符号;我想将它们与这些值一起使用,而不是在解析器中生成的值 覆盖parser.h完全没有用,因为这只是内部发生情况的镜像,匹配的值将保持不变。 (由于lemon与Bison共享很多代码,我认为Bison的解决方案也可以解决lemon中的问题)对于Bison,您可以通过在%token指令中声明来手动为令牌赋值(%token TOK 263)。然而,这个选项在lemon中是不可用的(据我所知) 在任何情况下,上述内容都不能真正满

我正在将一个旧语法移植到lemon,并且我已经在头文件中定义了所有的终端符号;我想将它们与这些值一起使用,而不是在解析器中生成的值
覆盖parser.h完全没有用,因为这只是内部发生情况的镜像,匹配的值将保持不变。

(由于lemon与Bison共享很多代码,我认为Bison的解决方案也可以解决lemon中的问题)

对于Bison,您可以通过在
%token
指令中声明来手动为令牌赋值(
%token TOK 263
)。然而,这个选项在lemon中是不可用的(据我所知)

在任何情况下,上述内容都不能真正满足您的请求,因为它不允许您从外部头文件读取令牌值。对于解析器生成器来说,这不是一个简单的要求。为了构建解析表,解析器生成器(无论是bison还是lemon)必须实际知道与每个令牌关联的值,并且解析头以提取该信息的任务远远超出了解析器生成器的复杂性;它需要一个嵌入式C解析器

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