2

#defineyacc/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 に答える