C++ 如何编写bison文件以自动使用C头文件中定义的令牌枚举列表?

C++ 如何编写bison文件以自动使用C头文件中定义的令牌枚举列表?,c++,parsing,yacc,bison,lexer,C++,Parsing,Yacc,Bison,Lexer,我试图用Bison/Yacc构建一个解析器,以便能够解析由另一个模块完成的令牌流。令牌已在枚举类型中列出,如下所示: // C++ header file enum token_id { TokenType1 = 0x10000000, TokenType2 = 0x11000000, TokenType3 = 0x11100000, //... and the list go on with about 200/300 line

我试图用Bison/Yacc构建一个解析器,以便能够解析由另一个模块完成的令牌流。令牌已在枚举类型中列出,如下所示:

// C++ header file
enum token_id {
  TokenType1         = 0x10000000,
  TokenType2         = 0x11000000,
  TokenType3         = 0x11100000,
  //... and the list go on with about 200/300 line
};
我已经阅读了很多次bison的文档,但我找不到比像这样复制bison文件中的每个令牌更好的解决方案:

/* Bison/Yacc file */
%token TokenType1 0x10000000
%token TokenType2 0x11000000
%token TokenType3 0x11100000
//...
如果我必须这样做,那么如果其他模块规范发生更改(这种情况经常发生),那么维护该文件将变得非常困难


你能告诉我怎么做吗,或者给我指出一个好的方向(欢迎任何想法/意见)。这对我有很大帮助!提前谢谢

显而易见的方法是使用一个小型实用程序将一种格式转换为另一种格式。如果您确实频繁地进行更改,您甚至可以考虑将名称和值存储在类似SQL数据库中,并编写一对查询来生成每个工具的正确格式。
select token_name, '=' token_number ','
    from token_table

select '%token ', token_name, ' ', token_number
    from token_table
第一个需要一些处理,比如在开头添加'enum token_id{',和“};“到最后,但你得到了总体思路。当然,有很多替代方案——XML、CSV等,但总体思路保持不变:存储和编辑尽可能接近原始数据,并自动添加使工具满意所需的额外“内容”。

而不是:

/* Bison/Yacc file */
%token TokenType1 0x10000000
%token TokenType2 0x11000000
%token TokenType3 0x11100000
//...
您只需要在声明部分包含具有令牌类型的文件

#include "mytoken_enum.h"
// ...
%token TokenType1
%token TokenType2
%token TokenType3 
//...
编辑:无法执行此操作:

从上面的数字可以看出, 野牛只是给代币编号 按顺序,并使用移位 在解析器查找表中作为索引, 简单来说就是速度。所以野牛不会 我确信,我会支持这一点 不容易适应 实现模型


只需使用包装器将真正的令牌转换为yacc/bison令牌(例如:via yylex())

谢谢您的回答,但是使用数据库来实现这一点有点“太多了”。我肯定会使用脚本来生成令牌列表。