Yaccの問題:次の非ターミナル内のデータが利用できるようにします

StackOverflow https://stackoverflow.com/questions/393041

  •  23-08-2019
  •  | 
  •  

質問

私は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 = 0int result = 1result = 0result = 1を交換する必要があります。

他のヒント

缶が示唆したように、

ただし、一般的には、構文規則にグローバルを使用するのは良い考えではない、行うことができます。あなたのルールは次のようになりようbcの型を宣言します:

%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);};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top