こんにちは、clang を使用して c ファイルから情報を抽出しています。そして、マクロの値を抽出しようとしています。
たとえば、これから値「13」または ast (+ (* 3 4) 1) が必要です。
#define SOME_CONSTANT 3*4+1
またはマクロ関数から、ast eg (SOME_MACROFUNC (xy) (+ (add4 x) (* y 9))) が必要です:
int add4(int q) {return q+4;}
#define SOME_MACROFUNC(x,y) add4(x)+y*9
これまでのところ、「プリプロセッサ」クラスの macro_begin() および macro_end() 関数を介してすべてのマクロを反復処理することができました。
それからマクロ名を取得し、「MacroInfo」クラスから、マクロが関数型 (パラメーター名を含む) であるかどうかを取得できました。マクロ内のトークンにもアクセスできますが、トークンの種類 (string_literal、identifier、comma、l_paren、r_paren など) しか取得できません。
だから2つのこと:
トークンの種類だけでなく、トークンの実際の値にアクセスするにはどうすればよいですか。
トークンを指定してマクロから ast を生成する方法はありますか? 私が考えた 1 つの方法は、ソース コードを解析してからマクロを抽出し、それらの名前を使用して、それらのマクロを含むコードをソースに追加し、再解析して ast を取得することです。
例:
char *tempSOME_CONSTANT = SOME_CONSTANT;
void tempSOME_MACROFUNC(char *x, char *y) {SOME_MACROFUNC(x,y);}
この方法は非常にハッキリしているように見えますが、ステートメントや式ではないマクロでは問題が発生する可能性があります。
ありがとう。
編集:明確にするために、主に各マクロの展開された本体(マクロがなくなるまで、非マクロトークンのみ)が必要です。
edit2 いくつか解決したもの:
興味のある方は、マクロの本体を手動で展開するつもりです。
「preprocessor.getSpelling(token)」でトークン値を取得します。
「preprocessor.getIdentifierTable().get(StringRef(spelling))」でトークンの identinfo を取得します。
また、「clang\lib\Lex\PPMacroExpansion.cpp」を参考にしてください。
ソースツリー全体を再解析せずにパーサーに渡す方法をまだ考えていますが、それを理解するのはそれほど難しくありません。
議論をしてくれた Ira Baxter のおかげで、問題を解決することができました。