مشكلة YACC: اجعل البيانات متوفرة في Next Non Terminal
سؤال
أريد أن أجعل بعض المتغيرات التي تولدها في 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);};
لا تنتمي إلى StackOverflow