macros - 在 yacc/bison lex 中处理#define 宏

标签 macros bison c-preprocessor yacc lex

如何使用 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; 
        }

关于macros - 在 yacc/bison lex 中处理#define 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1615000/

相关文章:

c - 在 C 中使用 define 在所有特定函数调用之后或之前添加语句

c - 带有 clang 的宏中未使用的函数

Bison - 如何打印解析树

c++ - QMAKE_EXTRA_COMPILERS - 头文件之间的依赖性问题

c# -/unsafe标志对应的是 "preprocessor"符号吗?

c++ - 是否可以根据宏或变量有条件地编译/运行代码?

c++ - 如何仅将宏扩展为C++文件的预处理步骤

Python 宏 : Use Cases?

c++ - 宏方法有 2 个返回值?

c++ - 使 yylex 返回 symbol_type 而不是 int