2

入力したコマンドを解析できる小さなコンパイラを作成しようとしています。

解析しようとするコマンドは次のとおりです。

create class something = create class do_something ; 

私のコードは次のようになります。

grammar : my_grammar
        {
            list<Class1 *> *obj = new list<Class1 *>;
            obj->push_back($1);
        }

my_grammar : my_definition SEMICOLON
           {
               report("something detected!");
               $$ = $1;
            }

my_definition : CREATE CLASS class_name EQU class_expression
               {
                   $5->setClassName(*$3);
                   $$ = $5;
                }

class_expression : CREATE CLASS operand_name
                 {
                     $$ = new OperandClass();
                     $$->setOperationType("createClass");
                     $$->setOperandName(*$3);
                  }

ただし、パーサーを別の場所で呼び出そうとすると、Class以前に定義した を取得できません。

パーサーに何か問題があり、GDB でデバッグを行ったに違いないと思います。しかし、関数に足を踏み入れることはできずpush_back()、情報をobj正しく出力することもできません。

そのため、 GDB の使用中$$または使用中に値を取得できる方法があるかどうか疑問に思っています。$1入力するだけで、別のp $$ものが出力されます。

4

2 に答える 2

0

最も簡単な方法は、おそらくルールと同じ型の変数を宣言し ($$この型を持つ)、それを割り当てることです。

%union {
  int I;
}
%type<I> rule whatever

rule: whatever {
    int foo = $1;
    // printf("%d", foo);
    $$ = $1;
}

その後、デバッガーで表示するか、単に印刷することができます。

標準ライブラリのデバッグ情報がインストールされていない限り、デバッガは内部push_backまたは他の標準関数に入ることができません。

一般的な質問に関しては、あなたobjはルールに対してローカルであり、Bison によって関数に変換され、グローバルなどの他の場所に保存しない限り、その外側には表示されません。

于 2016-03-15T13:10:01.197 に答える