在yacc/bison lex中处理#define宏

3
我该如何在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)让词法分析器忘记宏字符,4)插入新的正确字符。

1个回答

2

在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; 
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接