سؤال

أريد أن أجعل بعض المتغيرات التي تولدها في B المتاحة في C:

a   :   b c { ...some code...}

مثال بسيط:

b :  X  { int result = 0; } 
  |  Y  { int result = 1; }

حتى أتمكن من ذلك، في وقت لاحق في C Say:

c : D   { printf(result + 1); }
  | E   { printf(result + 2);  }

هل هناك أي فرصة للقيام بذلك؟ أي مساعدة سيكون حقا موضع تقدير!

هل كانت مفيدة؟

المحلول

result يجب أن يكون متغير عالمي. يمكنك القيام بذلك من خلال بما في ذلك

%{
    int result;
%}

في الجزء العلوي من ملف yacc الخاص بك. بالطبع، يجب أن تحل محل أيضا int result = 0 و int result = 1 مع result = 0 و result = 1 على التوالى.

نصائح أخرى

يمكنك القيام بذلك، ولكن بشكل عام ليست فكرة جيدة استخدام Globals في قواعد بناء الجملة. أعلن نوع ل 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);};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top