2

我将如何#define使用 yacc/bison 实现宏?

我在想所有定义的字符都必须匹配一个常规变量。变量被定义为[a-zA-Z_][a-zA-Z0-9_]*所以我想我可以在那里检查变量是否已定义有效。然后将文本替换为应有的内容。

我怎样才能做到这一点?现在我想完全忽略 BAD 这个词,就好像我#define BAD在 C 中定义它一样。下面是该 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)插入新的正确字符。

4

1 回答 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; 
        }
于 2009-10-23T19:37:11.743 回答