yacc / bison lexでの#defineマクロの処理
-
06-07-2019 - |
質問
yacc / bisonを使用して #define
マクロを実装するにはどうすればよいですか
すべての定義文字は通常の変数と一致する必要があると考えていました。変数は [a-zA-Z _] [a-zA-Z0-9 _] *
として定義されているので、変数が定義されているかどうかを確認するためにそこにチェックを入れることができます。次に、テキストを本来の内容に置き換えます。
どうすればそれができますか?今のところ、Cで #define BAD
として定義したかのように、単語BADを完全に無視したいと思います。以下は、そのlexルールのコードですが、間違っています。また、lexは「BA」について文句を言います。ストリーム内にあります。私は以下が完全に間違っていて非論理的であることを知っているので、BADをどのように無視し、次にそれをフロートのようなものに置き換えるには
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;
}
所属していません StackOverflow