Yaccの問題:次の非ターミナル内のデータが利用できるようにします
質問
私はCで、私はBに発生するいくつかの変数を利用できるようにしたい。
a : b c { ...some code...}
簡単な例:
b : X { int result = 0; }
| Y { int result = 1; }
私は、後にC言語では、と言うことができます:
c : D { printf(result + 1); }
| E { printf(result + 2); }
それをするチャンスはありますか?すべてのヘルプは本当にいただければ幸いです!
解決
result
は、グローバル変数でなければなりません。あなたが含むことによってこれを行うことができます。
%{
int result;
%}
あなたのYACCファイルの先頭にあります。もちろん、あなたも、それぞれint result = 0
とint result = 1
とresult = 0
とresult = 1
を交換する必要があります。
他のヒント
缶が示唆したように、
ただし、一般的には、構文規則にグローバルを使用するのは良い考えではない、行うことができます。あなたのルールは次のようになりようb
とc
の型を宣言します:
%union {
int result;
};
%type <result> a b
%start a
%%
b : X {$$ = 0;} | Y {$$ = 1;} ;
c : D {$$ = 1;} | E {$$ = 2;} ;
a : b c {printf("%d", $1 + $2);};
所属していません StackOverflow