我想用我的原始解析器解析 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;
}
你能解释一下吗?