Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何转换未处理的C/C++;源到语法树(并返回)?_C++_C_Converter_Abstract Syntax Tree - Fatal编程技术网

C++ 如何转换未处理的C/C++;源到语法树(并返回)?

C++ 如何转换未处理的C/C++;源到语法树(并返回)?,c++,c,converter,abstract-syntax-tree,C++,C,Converter,Abstract Syntax Tree,我想在这两者之间有一个转换器 #include <ololo.h> #ifdef HAVE_QQQ #include <qqq.h> #endif char* ololize(char* s) { #ifdef HAVE_QQQ return qqq(s); #else return ololo(s); #endif } 即,不是从编译器的角度,而是从程序员的角度,将源代码表示为易于管理的树 我不期望100%正确的工作,但

我想在这两者之间有一个转换器

#include <ololo.h>
#ifdef HAVE_QQQ
  #include <qqq.h>
#endif

char* ololize(char* s) {
   #ifdef HAVE_QQQ
      return qqq(s);
   #else
      return ololo(s);
   #endif
}
即,不是从编译器的角度,而是从程序员的角度,将源代码表示为易于管理的树

我不期望100%正确的工作,但它应该适用于大多数现有的源文件。如果我可以将代码“往返”到树和树之间,就可以获得额外的积分


是否有任何现有的工具或库?

< P>我们的DMS软件再工程工具包及其C++前端可以做到这一点。DMS提供语言精确解析(包括处理GCC和MS方言以及C++11),并构建AST。根据它的配置方式,它还可以构建完整的符号表,并且目前可以为C++做控制流分析(但对于C++ 11来说还不完全)。p> 从内部AST中,DMS可以重新生成合法的源代码,生成相同的编译结果,无论是预打印还是保留空间(“保真度模式”),几乎完全相同。我们还可以要求将AST导出为XML

对于OP的小程序,这里是直接从我们的GCC4方言解析器以XML形式呈现的AST(DMS库中有一个“PrintASTasXML”函数)。注意AST包含INCLUDE和preprocessor条件

<?xml version="1.1" encoding="UTF-8"?>
<!-- Using DMS PrintASTasXML (v.1.00) -->
<!-- XML generated on 2013/04/13 15:24:44 -->
<DMSForest>
  <tree node="translation_unit" type="2" domain="1" id="1iity" parents="0" line="1" column="1" file="1">
<tree node="declaration_seq" type="994" domain="1" id="1iitt" line="1" column="1" file="1">
  <tree node="declaration_seq" type="994" domain="1" id="1iepb" line="1" column="1" file="1">
    <tree node="control_line" type="2133" domain="1" id="1ieos" line="1" column="1" file="1">
      <tree node="'#'" type="2908" domain="1" id="1ieoi" literal="0" line="1" column="1" file="1"/>
      <tree node="'include'" type="2759" domain="1" id="1ieok" literal="0" line="1" column="2" file="1"/>
      <tree node="ANGLED_HEADER_NAME" type="2951" domain="1" id="1ieom" line="1" column="10" file="1">
    <literal>ololo.h</literal>
      </tree>
      <tree node="new_line" type="2946" domain="1" id="1ieoo" literal="0" line="1" column="19" file="1"/>
    </tree>
    <tree node="pp_declaration_seq" type="997" domain="1" id="1ieph" line="2" column="1" file="1">
      <tree node="if_directive" type="2113" domain="1" id="1iep4" line="2" column="1" file="1">
    <tree node="'#'" type="2908" domain="1" id="1iep1" literal="0" line="2" column="1" file="1"/>
    <tree node="'ifdef'" type="2756" domain="1" id="1ieov" literal="0" line="2" column="2" file="1"/>
    <tree node="IDENTIFIER" type="2646" domain="1" id="1ieol" line="2" column="8" file="1">
      <literal>HAVE_QQQ</literal>
    </tree>
    <tree node="new_line" type="2946" domain="1" id="1ieoz" literal="0" line="2" column="16" file="1"/>
      </tree>
      <tree node="control_line" type="2133" domain="1" id="1iepi" line="3" column="3" file="1">
    <tree node="'#'" type="2908" domain="1" id="1iep6" literal="0" line="3" column="3" file="1"/>
    <tree node="'include'" type="2759" domain="1" id="1iep8" literal="0" line="3" column="4" file="1"/>
    <tree node="ANGLED_HEADER_NAME" type="2951" domain="1" id="1iepa" line="3" column="12" file="1">
      <literal>qqq.h</literal>
    </tree>
    <tree node="new_line" type="2946" domain="1" id="1iepe" literal="0" line="3" column="19" file="1"/>
      </tree>
      <tree node="endif_directive" type="2117" domain="1" id="1ieoy" line="4" column="1" file="1">
    <tree node="'#'" type="2908" domain="1" id="1iepl" literal="0" line="4" column="1" file="1"/>
    <tree node="'endif'" type="2743" domain="1" id="1iepk" literal="0" line="4" column="2" file="1"/>
    <tree node="new_line" type="2946" domain="1" id="1iepn" literal="0" line="4" column="7" file="1"/>
      </tree>
    </tree>
  </tree>
  <tree node="function_definition" type="1616" domain="1" id="1iito" line="6" column="1" file="1">
    <tree node="function_head" type="1628" domain="1" id="1iiow" line="6" column="1" file="1">
      <tree node="simple_type_specifier" type="1104" domain="1" id="1iep9" line="6" column="1" file="1">
    <tree node="'char'" type="2723" domain="1" id="1iepd" literal="0" line="6" column="1" file="1"/>
      </tree>
      <tree node="ptr_declarator" type="1398" domain="1" id="1iio3" line="6" column="5" file="1">
    <tree node="ptr_operator" type="1436" domain="1" id="1iepq" line="6" column="5" file="1">
      <tree node="'*'" type="2903" domain="1" id="1iep7" literal="0" line="6" column="5" file="1"/>
    </tree>
    <tree node="noptr_declarator" type="1402" domain="1" id="1iioc" line="6" column="7" file="1">
      <tree node="IDENTIFIER" type="2646" domain="1" id="1iepm" line="6" column="7" file="1">
        <literal>ololize</literal>
      </tree>
      <tree node="'('" type="2887" domain="1" id="1iepr" literal="0" line="6" column="14" file="1"/>
      <tree node="parameter_declaration" type="1591" domain="1" id="1iion" line="6" column="15" file="1">
        <tree node="simple_type_specifier" type="1104" domain="1" id="1iioe" line="6" column="15" file="1">
          <tree node="'char'" type="2723" domain="1" id="1iio0" literal="0" line="6" column="15" file="1"/>
        </tree>
        <tree node="ptr_declarator" type="1398" domain="1" id="1iiom" line="6" column="19" file="1">
          <tree node="ptr_operator" type="1436" domain="1" id="1iiof" line="6" column="19" file="1">
        <tree node="'*'" type="2903" domain="1" id="1iio1" literal="0" line="6" column="19" file="1"/>
          </tree>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iio8" line="6" column="21" file="1">
        <literal>s</literal>
          </tree>
        </tree>
      </tree>
      <tree node="')'" type="2888" domain="1" id="1iiol" literal="0" line="6" column="22" file="1"/>
      <tree node="function_qualifiers" type="1418" domain="1" id="1iio2" line="6" column="24" file="1"/>
    </tree>
      </tree>
    </tree>
    <tree node="compound_statement" type="873" domain="1" id="1iitn" line="6" column="24" file="1">
      <tree node="'{'" type="2940" domain="1" id="1iiov" literal="0" line="6" column="24" file="1"/>
      <tree node="statement" type="853" domain="1" id="1iitw" line="7" column="4" file="1">
    <tree node="if_directive" type="2113" domain="1" id="1iipc" line="7" column="4" file="1">
      <tree node="'#'" type="2908" domain="1" id="1iip4" literal="0" line="7" column="4" file="1"/>
      <tree node="'ifdef'" type="2756" domain="1" id="1iip2" literal="0" line="7" column="5" file="1"/>
      <tree node="IDENTIFIER" type="2646" domain="1" id="1iip5" line="7" column="11" file="1">
        <literal>HAVE_QQQ</literal>
      </tree>
      <tree node="new_line" type="2946" domain="1" id="1iip0" literal="0" line="7" column="19" file="1"/>
    </tree>
    <tree node="jump_statement" type="984" domain="1" id="1iisg" line="8" column="7" file="1">
      <tree node="'return'" type="2780" domain="1" id="1iiox" literal="0" line="8" column="7" file="1"/>
      <tree node="$NONTERMINALAMBIGUITY" type="2999" nonterminalname="postfix_expression" nonterminaltype="402" domain="1" id="1iiou" children="2" line="8" column="14" file="1">
        <tree node="postfix_expression" type="380" domain="1" id="1iipi" line="8" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iip8" parents="2" line="8" column="14" file="1">
        <literal>qqq</literal>
          </tree>
          <tree node="'('" type="2887" domain="1" id="1iip6" parents="2" literal="0" line="8" column="17" file="1"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iipb" parents="2" line="8" column="18" file="1">
        <literal>s</literal>
          </tree>
          <tree node="')'" type="2888" domain="1" id="1iip1" parents="2" literal="0" line="8" column="19" file="1"/>
        </tree>
        <tree node="postfix_expression" type="368" domain="1" id="1iipk" line="8" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iip8" parents="2" alreadyprinted="true"/>
          <tree node="'('" type="2887" domain="1" id="1iip6" parents="2" alreadyprinted="true"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iipb" parents="2" alreadyprinted="true"/>
          <tree node="')'" type="2888" domain="1" id="1iip1" parents="2" alreadyprinted="true"/>
        </tree>
      </tree>
      <tree node="';'" type="2939" domain="1" id="1iisb" literal="0" line="8" column="20" file="1"/>
    </tree>
    <tree node="else_directive" type="2116" domain="1" id="1iisi" line="9" column="4" file="1">
      <tree node="'#'" type="2908" domain="1" id="1iism" literal="0" line="9" column="4" file="1"/>
      <tree node="'else'" type="2742" domain="1" id="1iisp" literal="0" line="9" column="5" file="1"/>
      <tree node="new_line" type="2946" domain="1" id="1iiso" literal="0" line="9" column="9" file="1"/>
    </tree>
    <tree node="jump_statement" type="984" domain="1" id="1iit5" line="10" column="7" file="1">
      <tree node="'return'" type="2780" domain="1" id="1iish" literal="0" line="10" column="7" file="1"/>
      <tree node="$NONTERMINALAMBIGUITY" type="2999" nonterminalname="postfix_expression" nonterminaltype="402" domain="1" id="1iio5" children="2" line="10" column="14" file="1">
        <tree node="postfix_expression" type="380" domain="1" id="1iit6" line="10" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisk" parents="2" line="10" column="14" file="1">
        <literal>ololo</literal>
          </tree>
          <tree node="'('" type="2887" domain="1" id="1iisu" parents="2" literal="0" line="10" column="19" file="1"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisv" parents="2" line="10" column="20" file="1">
        <literal>s</literal>
          </tree>
          <tree node="')'" type="2888" domain="1" id="1iit2" parents="2" literal="0" line="10" column="21" file="1"/>
        </tree>
        <tree node="postfix_expression" type="368" domain="1" id="1iiti" line="10" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisk" parents="2" alreadyprinted="true"/>
          <tree node="'('" type="2887" domain="1" id="1iisu" parents="2" alreadyprinted="true"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisv" parents="2" alreadyprinted="true"/>
          <tree node="')'" type="2888" domain="1" id="1iit2" parents="2" alreadyprinted="true"/>
        </tree>
      </tree>
      <tree node="';'" type="2939" domain="1" id="1iit4" literal="0" line="10" column="22" file="1"/>
    </tree>
    <tree node="endif_directive" type="2117" domain="1" id="1iitp" line="11" column="4" file="1">
      <tree node="'#'" type="2908" domain="1" id="1iits" literal="0" line="11" column="4" file="1"/>
      <tree node="'endif'" type="2743" domain="1" id="1iitr" literal="0" line="11" column="5" file="1"/>
      <tree node="new_line" type="2946" domain="1" id="1iitq" literal="0" line="11" column="10" file="1"/>
    </tree>
      </tree>
      <tree node="'}'" type="2941" domain="1" id="1iitm" literal="0" line="12" column="1" file="1"/>
    </tree>
  </tree>
</tree>
  </tree>
  <FileIndex>
<File index="1">C:/temp/small.cpp</File>
  </FileIndex>
  <DomainIndex>
<Domain index="1">Cpp~GCC4</Domain>
  </DomainIndex>
</DMSForest>

奥洛洛
有QQ吗
qq.h
奥利兹
s
有QQ吗
qqq
s
奥洛洛
s
C:/temp/small.cpp
Cpp~GCC4
它与XML之间不会有太多的往返;没有预配置的XML读取器来构建AST。然而,DMS是高度可定制的,并且有一个XML解析器作为选项;读取XML树、重新生成C++ AST,然后调用PrutTypRebug。 我不太清楚你所说的“从程序员的角度来看是可管理的”是什么意思。 这是一棵精确的树。如果它包含太多的细节,欢迎您应用XSLT转换来简化它,但这样做可能会失去语义准确性。而且你也可能失去往返的能力


我们看不出有太多需要这样的XML导出;DMS生态系统通过设计为分析/转换程序(包括C++程序)提供了大量的基础设施;我们已经用DMS完成了大量的C++源代码解析/转换。因此,为了做一些有用的事情而进行XML导出的需求不是很高。不管怎样,我们都会提供,因为人们总是要求它。让我们惊讶的是,我们有一些客户在实际使用它。

< P>我们的DMS软件再工程工具包和C++前端可以做到这一点。DMS提供语言精确解析(包括处理GCC和MS方言以及C++11),并构建AST。根据它的配置方式,它还可以构建完整的符号表,并且目前可以为C++做控制流分析(但对于C++ 11来说还不完全)。p> 从内部AST中,DMS可以重新生成合法的源代码,生成相同的编译结果,无论是预打印还是保留空间(“保真度模式”),几乎完全相同。我们还可以要求将AST导出为XML

对于OP的小程序,这里是直接从我们的GCC4方言解析器以XML形式呈现的AST(DMS库中有一个“PrintASTasXML”函数)。注意AST包含INCLUDE和preprocessor条件

<?xml version="1.1" encoding="UTF-8"?>
<!-- Using DMS PrintASTasXML (v.1.00) -->
<!-- XML generated on 2013/04/13 15:24:44 -->
<DMSForest>
  <tree node="translation_unit" type="2" domain="1" id="1iity" parents="0" line="1" column="1" file="1">
<tree node="declaration_seq" type="994" domain="1" id="1iitt" line="1" column="1" file="1">
  <tree node="declaration_seq" type="994" domain="1" id="1iepb" line="1" column="1" file="1">
    <tree node="control_line" type="2133" domain="1" id="1ieos" line="1" column="1" file="1">
      <tree node="'#'" type="2908" domain="1" id="1ieoi" literal="0" line="1" column="1" file="1"/>
      <tree node="'include'" type="2759" domain="1" id="1ieok" literal="0" line="1" column="2" file="1"/>
      <tree node="ANGLED_HEADER_NAME" type="2951" domain="1" id="1ieom" line="1" column="10" file="1">
    <literal>ololo.h</literal>
      </tree>
      <tree node="new_line" type="2946" domain="1" id="1ieoo" literal="0" line="1" column="19" file="1"/>
    </tree>
    <tree node="pp_declaration_seq" type="997" domain="1" id="1ieph" line="2" column="1" file="1">
      <tree node="if_directive" type="2113" domain="1" id="1iep4" line="2" column="1" file="1">
    <tree node="'#'" type="2908" domain="1" id="1iep1" literal="0" line="2" column="1" file="1"/>
    <tree node="'ifdef'" type="2756" domain="1" id="1ieov" literal="0" line="2" column="2" file="1"/>
    <tree node="IDENTIFIER" type="2646" domain="1" id="1ieol" line="2" column="8" file="1">
      <literal>HAVE_QQQ</literal>
    </tree>
    <tree node="new_line" type="2946" domain="1" id="1ieoz" literal="0" line="2" column="16" file="1"/>
      </tree>
      <tree node="control_line" type="2133" domain="1" id="1iepi" line="3" column="3" file="1">
    <tree node="'#'" type="2908" domain="1" id="1iep6" literal="0" line="3" column="3" file="1"/>
    <tree node="'include'" type="2759" domain="1" id="1iep8" literal="0" line="3" column="4" file="1"/>
    <tree node="ANGLED_HEADER_NAME" type="2951" domain="1" id="1iepa" line="3" column="12" file="1">
      <literal>qqq.h</literal>
    </tree>
    <tree node="new_line" type="2946" domain="1" id="1iepe" literal="0" line="3" column="19" file="1"/>
      </tree>
      <tree node="endif_directive" type="2117" domain="1" id="1ieoy" line="4" column="1" file="1">
    <tree node="'#'" type="2908" domain="1" id="1iepl" literal="0" line="4" column="1" file="1"/>
    <tree node="'endif'" type="2743" domain="1" id="1iepk" literal="0" line="4" column="2" file="1"/>
    <tree node="new_line" type="2946" domain="1" id="1iepn" literal="0" line="4" column="7" file="1"/>
      </tree>
    </tree>
  </tree>
  <tree node="function_definition" type="1616" domain="1" id="1iito" line="6" column="1" file="1">
    <tree node="function_head" type="1628" domain="1" id="1iiow" line="6" column="1" file="1">
      <tree node="simple_type_specifier" type="1104" domain="1" id="1iep9" line="6" column="1" file="1">
    <tree node="'char'" type="2723" domain="1" id="1iepd" literal="0" line="6" column="1" file="1"/>
      </tree>
      <tree node="ptr_declarator" type="1398" domain="1" id="1iio3" line="6" column="5" file="1">
    <tree node="ptr_operator" type="1436" domain="1" id="1iepq" line="6" column="5" file="1">
      <tree node="'*'" type="2903" domain="1" id="1iep7" literal="0" line="6" column="5" file="1"/>
    </tree>
    <tree node="noptr_declarator" type="1402" domain="1" id="1iioc" line="6" column="7" file="1">
      <tree node="IDENTIFIER" type="2646" domain="1" id="1iepm" line="6" column="7" file="1">
        <literal>ololize</literal>
      </tree>
      <tree node="'('" type="2887" domain="1" id="1iepr" literal="0" line="6" column="14" file="1"/>
      <tree node="parameter_declaration" type="1591" domain="1" id="1iion" line="6" column="15" file="1">
        <tree node="simple_type_specifier" type="1104" domain="1" id="1iioe" line="6" column="15" file="1">
          <tree node="'char'" type="2723" domain="1" id="1iio0" literal="0" line="6" column="15" file="1"/>
        </tree>
        <tree node="ptr_declarator" type="1398" domain="1" id="1iiom" line="6" column="19" file="1">
          <tree node="ptr_operator" type="1436" domain="1" id="1iiof" line="6" column="19" file="1">
        <tree node="'*'" type="2903" domain="1" id="1iio1" literal="0" line="6" column="19" file="1"/>
          </tree>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iio8" line="6" column="21" file="1">
        <literal>s</literal>
          </tree>
        </tree>
      </tree>
      <tree node="')'" type="2888" domain="1" id="1iiol" literal="0" line="6" column="22" file="1"/>
      <tree node="function_qualifiers" type="1418" domain="1" id="1iio2" line="6" column="24" file="1"/>
    </tree>
      </tree>
    </tree>
    <tree node="compound_statement" type="873" domain="1" id="1iitn" line="6" column="24" file="1">
      <tree node="'{'" type="2940" domain="1" id="1iiov" literal="0" line="6" column="24" file="1"/>
      <tree node="statement" type="853" domain="1" id="1iitw" line="7" column="4" file="1">
    <tree node="if_directive" type="2113" domain="1" id="1iipc" line="7" column="4" file="1">
      <tree node="'#'" type="2908" domain="1" id="1iip4" literal="0" line="7" column="4" file="1"/>
      <tree node="'ifdef'" type="2756" domain="1" id="1iip2" literal="0" line="7" column="5" file="1"/>
      <tree node="IDENTIFIER" type="2646" domain="1" id="1iip5" line="7" column="11" file="1">
        <literal>HAVE_QQQ</literal>
      </tree>
      <tree node="new_line" type="2946" domain="1" id="1iip0" literal="0" line="7" column="19" file="1"/>
    </tree>
    <tree node="jump_statement" type="984" domain="1" id="1iisg" line="8" column="7" file="1">
      <tree node="'return'" type="2780" domain="1" id="1iiox" literal="0" line="8" column="7" file="1"/>
      <tree node="$NONTERMINALAMBIGUITY" type="2999" nonterminalname="postfix_expression" nonterminaltype="402" domain="1" id="1iiou" children="2" line="8" column="14" file="1">
        <tree node="postfix_expression" type="380" domain="1" id="1iipi" line="8" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iip8" parents="2" line="8" column="14" file="1">
        <literal>qqq</literal>
          </tree>
          <tree node="'('" type="2887" domain="1" id="1iip6" parents="2" literal="0" line="8" column="17" file="1"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iipb" parents="2" line="8" column="18" file="1">
        <literal>s</literal>
          </tree>
          <tree node="')'" type="2888" domain="1" id="1iip1" parents="2" literal="0" line="8" column="19" file="1"/>
        </tree>
        <tree node="postfix_expression" type="368" domain="1" id="1iipk" line="8" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iip8" parents="2" alreadyprinted="true"/>
          <tree node="'('" type="2887" domain="1" id="1iip6" parents="2" alreadyprinted="true"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iipb" parents="2" alreadyprinted="true"/>
          <tree node="')'" type="2888" domain="1" id="1iip1" parents="2" alreadyprinted="true"/>
        </tree>
      </tree>
      <tree node="';'" type="2939" domain="1" id="1iisb" literal="0" line="8" column="20" file="1"/>
    </tree>
    <tree node="else_directive" type="2116" domain="1" id="1iisi" line="9" column="4" file="1">
      <tree node="'#'" type="2908" domain="1" id="1iism" literal="0" line="9" column="4" file="1"/>
      <tree node="'else'" type="2742" domain="1" id="1iisp" literal="0" line="9" column="5" file="1"/>
      <tree node="new_line" type="2946" domain="1" id="1iiso" literal="0" line="9" column="9" file="1"/>
    </tree>
    <tree node="jump_statement" type="984" domain="1" id="1iit5" line="10" column="7" file="1">
      <tree node="'return'" type="2780" domain="1" id="1iish" literal="0" line="10" column="7" file="1"/>
      <tree node="$NONTERMINALAMBIGUITY" type="2999" nonterminalname="postfix_expression" nonterminaltype="402" domain="1" id="1iio5" children="2" line="10" column="14" file="1">
        <tree node="postfix_expression" type="380" domain="1" id="1iit6" line="10" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisk" parents="2" line="10" column="14" file="1">
        <literal>ololo</literal>
          </tree>
          <tree node="'('" type="2887" domain="1" id="1iisu" parents="2" literal="0" line="10" column="19" file="1"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisv" parents="2" line="10" column="20" file="1">
        <literal>s</literal>
          </tree>
          <tree node="')'" type="2888" domain="1" id="1iit2" parents="2" literal="0" line="10" column="21" file="1"/>
        </tree>
        <tree node="postfix_expression" type="368" domain="1" id="1iiti" line="10" column="14" file="1">
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisk" parents="2" alreadyprinted="true"/>
          <tree node="'('" type="2887" domain="1" id="1iisu" parents="2" alreadyprinted="true"/>
          <tree node="IDENTIFIER" type="2646" domain="1" id="1iisv" parents="2" alreadyprinted="true"/>
          <tree node="')'" type="2888" domain="1" id="1iit2" parents="2" alreadyprinted="true"/>
        </tree>
      </tree>
      <tree node="';'" type="2939" domain="1" id="1iit4" literal="0" line="10" column="22" file="1"/>
    </tree>
    <tree node="endif_directive" type="2117" domain="1" id="1iitp" line="11" column="4" file="1">
      <tree node="'#'" type="2908" domain="1" id="1iits" literal="0" line="11" column="4" file="1"/>
      <tree node="'endif'" type="2743" domain="1" id="1iitr" literal="0" line="11" column="5" file="1"/>
      <tree node="new_line" type="2946" domain="1" id="1iitq" literal="0" line="11" column="10" file="1"/>
    </tree>
      </tree>
      <tree node="'}'" type="2941" domain="1" id="1iitm" literal="0" line="12" column="1" file="1"/>
    </tree>
  </tree>
</tree>
  </tree>
  <FileIndex>
<File index="1">C:/temp/small.cpp</File>
  </FileIndex>
  <DomainIndex>
<Domain index="1">Cpp~GCC4</Domain>
  </DomainIndex>
</DMSForest>

奥洛洛
有QQ吗
qq.h
奥利兹
s
有QQ吗
qqq
s
奥洛洛
s
C:/temp/small.cpp
Cpp~GCC4
它与XML之间不会有太多的往返;没有预配置的XML读取器来构建AST。然而,DMS是高度可定制的,并且有一个XML解析器作为选项;读取XML树、重新生成C++ AST,然后调用PrutTypRebug。 我不太清楚你所说的“从程序员的角度来看是可管理的”是什么意思。 这是一棵精确的树。如果它包含太多的细节,欢迎您应用XSLT转换来简化它,但这样做可能会失去语义准确性。而且你也可能失去往返的能力

我们看不出有太多需要这样的XML导出;DMS生态系统