处理yacc / bison lex中的#define宏
-
06-07-2019 - |
题
如何使用yacc / bison实现 #define
宏?
我认为所有定义字符必须与常规变量匹配。变量被定义为 [a-zA-Z _] [a-zA-Z0-9 _] *
所以我想我可以在那里检查变量是否已定义有效。然后将文本替换为应该的文本。
我该怎么做?现在我想完全忽略单词BAD,好像我在C中将其定义为 #define BAD
。下面是该lex规则的代码,但我做错了。 lex还抱怨“BA”。在溪边。我知道下面是完全错误和不合逻辑的,所以我如何忽略BAD然后如何用像float这样的东西替换它
if(strcmp(yytext, "BAD")==0) {
int i, l = strlen(yytext);
for(i=0; i<l; i++) { REJECT }
return;
}
return VAR; }
我知道主要步骤是1)定义定义,2)在源代码中检测它3)使lex忘记宏字符4)插入新的正确字符。
解决方案
在lex中放置规则以查找定义。然后使用unput插入替换文本。 请注意,文本将向后插入
[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;
}
不隶属于 StackOverflow