التعامل مع وحدات الماكرو تعريف # في ياك / يكس البيسون
-
06-07-2019 - |
سؤال
وكيف لي أن تنفيذ وحدات الماكرو #define
مع ياك / البيسون؟
وكنت أفكر فقط تحديد الأحرف يجب أن يتطابق متغير منتظم. يتم تعريف المتغيرات كما [a-zA-Z_][a-zA-Z0-9_]*
ذلك الرقم الأول يمكن وضع الاختيار هناك لمعرفة ما إذا كان المتغير هو define'd عملت أم لا. ثم استبدال النص مع ما ينبغي أن يكون.
وكيف يمكنني أن أفعل ذلك؟ والآن أريد أن تجاهل تماما كلمة BAD كما لو كنت تعرف أنها #define BAD
في C. وفيما يلي رمز لتلك القاعدة يكس لكن أنا أفعل ذلك الخطأ. أيضا يكس يشكو "BA" يجري في تيار. وأنا أعلم أن أدناه هو خاطئ تماما وغير منطقي فكيف يمكنني تجاهل سيئة ثم كيف يمكنني استبداله بشيء مثل تعويم
if(strcmp(yytext, "BAD")==0) {
int i, l = strlen(yytext);
for(i=0; i<l; i++) { REJECT }
return;
}
return VAR; }
وأنا أعلم أن الخطوات الرئيسية هي 1) تحديد تعريف، 2) الكشف عن ذلك في مصدر 3) جعل يكس ينسى الأحرف الكلي 4) إدراج الأحرف الصحيحة جديدة.
المحلول
ووضع قاعدة في يكس للعثور على تحديد. ثم استخدام مدخلات لإدراج النص البديل. ملاحظة النص هو لإدراجها إلى الوراء
[a-zA-Z0-9_]* {
if(strcmp(yytext, "HARDCODED_DEFINE")==0) {
const char s[]="int replacement_text";
int z;
for(z=strlen(s)-1; z>=0; z--)
unput(s[z]);
}
else
return VAR_TOK;
}