1

bisonを使用してファイル(ICのピン接続リストを含む)の解析を行うGUIプログラムがあります。入力ファイルは次のようになります->

3 = NAND2(1, 2)
6 = NAND2(4, 5)
8 = NAND2(9, 10)
11 = NAND2(12, 13)

そして(簡略化された)文法は次のようなものです->

start : spec { cout << "Parse Complete!"; }
      ;

spec : '{' expr_list '}'
     ;

expr_list : expr_list expr | expr
          ;

expr : INT '=' FUNC '(' args ')' { /*WANT TO INSERT ACTION HERE */ }
     ;

上記の場所で、アクションを実行したい-解析された値をコンテナに挿入する(a map)。bisonによって生成されたファイルはですが.cpp、それ以外の場合は実際にはCです。必要なヘッダーファイルを簡単にインクルードできます。また、非メンバー関数(などcout)を簡単に呼び出すこともできます。

私の質問は-(コンテナタイプの)オブジェクトに値を挿入するにはどうすればよいですか?文法ファイル内にオブジェクトを作成できますが、それを返すにはどうすればよいですか?

もう1つの方法は、GUIコードで(コンテナータイプの)オブジェクトを作成し、これをパーサーに渡すことです。

いずれかの方法を実現する方法を教えてください。

4

2 に答える 2

1

戻り値の最適化を使用すると、マップを値で返すだけの誘惑に駆られます。

于 2013-01-26T09:28:51.780 に答える
0

解決策はexternです。

GUIの.cppファイル(パーサーを呼び出す場所)に(グローバル)オブジェクトを次のように作成しました。

QStringList *icNameList;

次に、ヘッダーファイル(bisonファイルにインクルード)

extern QStringList *icNameList;

最後に、bisonファイルで、次のようなことができます。

abc : xyz { icNameList->append(getTokenString()); }
    ;
于 2013-02-10T06:31:01.750 に答える