2

別のモジュールによって行われたトークンのフローを解析できるように、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
//...

そうしなければならない場合、他のモジュールの仕様が変更されると、ファイルを維持するのがかなり難しくなります(これはかなり頻繁に発生します)。

方法を教えてください。または、良い方向に向けてください (アイデアやコメントは大歓迎です)。それは私を大いに助けるでしょう!前もって感謝します。

4

2 に答える 2

1

代わりに:

/* Bison/Yacc file */
%token TokenType1 0x10000000
%token TokenType2 0x11000000
%token TokenType3 0x11100000
//...

宣言部分にトークンタイプのファイルを含めるだけです

#include "mytoken_enum.h"
// ...
%token TokenType1
%token TokenType2
%token TokenType3 
//...

編集:これはできません:

上記の数字からわかるように、Bison は単にトークンに順番に番号を付け、パーサー ルックアップ テーブルでインデックスとしてシフトして使用されます。したがって、Bison はそれをサポートしておらず、実装モデルに適合させるのは容易ではないと思います。

実際のトークンを yacc/bison トークンに変換するラッパーが必要なだけです (例: yylex() 経由)

于 2010-01-26T07:36:40.430 に答える
0

明白な方法は、あるフォーマットから別のフォーマットに変換するための小さなユーティリティです。本当に頻繁に変更を加えている場合は、名前と値を SQL データベースなどに保存し、いくつかのクエリを記述して、各ツールの正しい形式で出力を生成することを検討することもできます。

select token_name, '=' token_number ','
    from token_table

select '%token ', token_name, ' ', token_number
    from token_table

最初の例では、最初に「enum token_id {」を追加し、最後に「};」を追加するなど、少し操作が必要になりますが、一般的なアイデアは理解できます。もちろん、多くの代替手段があります-XML、 CSV などですが、一般的な考え方は同じままです。可能な限り生データに近い形で保存および編集し、ツールを快適に保つために必要な余分な「もの」を自動的に追加します。

于 2010-01-22T05:50:55.603 に答える