C/C++ コードをプリミティブ パーサーで解析して、ast-tree を取得したいと考えています。
ただし、マクロと typedef はサポートされていません。
gcc オプションを使用して、任意の C/C++ プロジェクトでマクロ定義を明らかにすることができます。その後、私自身のパーサーは C/C++ コードに対応できますが、その中に typedef がない場合のみです。
だから、私は何らかの方法でtypedefを取り除きたいと思っています。でも、どうしたらいいのかわからない。
たとえば、再定義された型名を置き換えたい:
typedef char CHAR;
typedef int& INT;
INT a;
CHAR b;
オリジナルによる:
int &a;
char b;
その結果、同じソースを取得したいのですが、元の型で、typedef はありません。
コンパイラにとっては非常に単純なタスクですが、学生のプロジェクトにとってはそうではありません。:)
私の知る限り、g++ の DECL_ORIGINAL_TYPE (TYPE_NAME (t)) は、元のオブジェクトの型を持つツリー ノードを指します。しかし、自分の要求に合わせて採用するために g++ ソースに飛び込みたくはありません。
では、typedef を明らかにする最も簡単な方法は何でしょうか?
どんな助けでも大歓迎です。
編集:
GCCXML を使用したソリューションは非常に優れていますが、XML 表現から C/C++ コードを取得する方法がまだわかりません。XMLを変換するにはどうすればよいですか?
(an example from http://www.gccxml.org/HTML/example1out.html)
<?xml version="1.0"?>
<GCC_XML>
<Namespace id="_1" name="::" members="_2 _3 _4 "/>
<Function id="_2" name="main" returns="_5" context="_1" location="f0:8"/>
<Function id="_3" name="a_function" returns="_5" context="_1" location="f0:4">
<Argument name="f" type="_6"/>
<Argument name="e" type="_4"/>
</Function>
<Struct id="_4" name="EmptyClass" context="_1" location="f0:1" members="_7 _8 " bases=""/>
<FundamentalType id="_5" name="int"/>
<FundamentalType id="_6" name="float"/>
<Constructor id="_7" name="EmptyClass" context="_4" location="f0:1">
<Argument name="_ctor_arg" type="_9"/>
</Constructor>
<Constructor id="_8" name="EmptyClass" context="_4" location="f0:1"/>
<ReferenceType id="_9" type="_4c"/>
<File id="f0" name="example1.cxx"/>
</GCC_XML>
C/C++ に戻ります。
(an example from http://www.gccxml.org/HTML/example1in.html)
struct EmptyClass {};
int a_function(float f, EmptyClass e)
{
}
int main(void)
{
return 0;
}
説明していただけますか?