我正在将一个旧语法移植到lemon,并且我已经在头文件中定义了所有的终端符号;我想将它们与那些值一起使用,而不是使用lemon在parser.h中生成的值:这可能吗
重写parser.h是完全无用的,因为它只是内部发生的事情的镜像,匹配的值将保持不变
(由于柠檬与Bison共享大量代码,我认为野牛的解决方案也可以解决柠檬中的问题)
使用bison,您可以通过在%token
指令(例如%token TOK 263
)中声明值来手动为令牌赋值。然而,柠檬中没有这个选项(据我所知)。
无论如何,以上内容并不能真正满足您的要求,因为它不允许您从外部头文件中读取令牌值。对于解析器生成器来说,这不是一个微不足道的要求。为了构建解析表,解析器生成器,无论是bison还是lemon,实际上都必须知道与每个令牌相关的值,而解析标头以提取信息的任务远远超出了解析器生成器的复杂性;它将需要一个嵌入式C解析器。
我建议让解析器生成器生成头文件,然后使用它来代替现有头文件中的定义。唯一的成本(afaics)是您需要重新编译引用令牌值的项目的任何部分,这通常仅限于lexer。