如何使用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; 
        }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top