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

时间:2015-03-31 13:28:46

标签: parsing bison lemon

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

1 个答案:

答案 0 :(得分:2)

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

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

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