2013-06-30 7 views
19

C++言語と文法の詳細を理解するために、小さなC++プログラムを作成し、コンパイラが生成するASTを参照してくださいそれから。C++コードから人間が読めるASTを取得する

過去にこの機能があったようです(-emit-asm)が、削除されました。

今日は簡単な方法がありますか?

+0

良いC++フロントエンドまたはCからC++への変換は、目的。 ASTダンプは人間のためではなく、そうする必要がないため、言語文法とは関係がありません。 – 9dan

+1

@ 9dan:ASTは一般に文法の構造に従います。さもなければ、構文解析プロセスからのASTの生成は、実際に複雑で困難であろう。 FWIWでは、DMS ASTは文法と同型である(必ずしも同一ではないが)。これにより、自動的に生成することができます。詳細については、CSTとASTのこのSOの答えを参照してください:http://stackoverflow.com/a/1916687/120163 –

答えて

12

打ち鳴らすはまだその機能を持っている:あなたがデバッグモードで打ち鳴らすをビルドするとき-ast-dump-xmlにのみ動作します:

コマンドは-ast-dump-ast-dump-xml

注意です。例えば

http://clang.llvm.org/docs/IntroductionToTheClangAST.html

## cat test.cpp 
int main() 
{ 
return 0; 
} 

##clang++ -cc1 -ast-dump-xml test.cpp          
<TranslationUnit ptr="0x4e42660"> 
<Typedef ptr="0x4e42bd0" name="__builtin_va_list" typeptr="0x0"> 
    <PointerType ptr="0x4e42b90" canonical="0x4e42b90"> 
    <BuiltinType ptr="0x4e426f0" canonical="0x4e426f0"/> 
    </PointerType> 
</Typedef> 
<Function ptr="0x4e42c70" name="main" returnzero="true" prototype="true"> 
    <FunctionProtoType ptr="0x4e42c20" canonical="0x4e42c20"> 
    <BuiltinType ptr="0x4e42750" canonical="0x4e42750"/> 
    <parameters/> 
    </FunctionProtoType> 
    <Stmt> 
CompoundStmt 0x4e42d78 <test.cpp:2:1, line:4:1> 
`-ReturnStmt 0x4e42d58 <line:3:1, col:8> 
    `-IntegerLiteral 0x4e42d38 <col:8> 'int' 0 

    </Stmt> 
</Function> 
</TranslationUnit> 
+2

私はClangのXML出力は実際にはXMLではないと思います。 (たぶんそれは変わったのでしょうか?) –

+0

...画像に貼り付けたことに基づいて、まったく提供されませんでした。 –

4

おそらく最も良い方法は、libclangであなた自身でプログラムを書くことです。 APIドキュメントlibclang、特にのC++ ASTイントロスペクションの部分を確認してください。

14

はここで二つの例、単純なものと嫌な1(C++'s "most vexing parse")です。

C++コードとして解析http://talkbinary.com/programming/c/fibonacci-in-c/から簡単なフィボナッチ・プログラム(フルC++ 11パーサーで)

int fib(int n) { 
if (n == 0 || n == 1) 
    return n; 

int fib1 = 0; 
int fib2 = 1; 
int fib = 0; 

for (int i = 2; i < n; i++) 
{ 
    fib = fib1 + fib2; 
    fib1 = fib2; 
    fib2 = fib; 
} 

return fib; 
} 

我々DMSソフトウェアリエンジニアリングツールキットは、次のASTを示し:

C:\DMS\Domains\Cpp\GCC4\Tools\Parser\Source>run ..\DomainParser ++AST "C:\temp\fibonacci.cpp" 
Cpp~GCC4 Domain Parser Version 2.5.15 
Copyright (C) 1996-2013 Semantic Designs, Inc; All Rights Reserved; SD Confidential 
Powered by DMS (R) Software Reengineering Toolkit 
118 tree nodes in tree. 
([email protected]~GCC4=2#4dc3a00^0 Line 1 Column 1 File C:/temp/fibonacci.cpp 
([email protected]~GCC4=1615#4dc39e0^1#4dc3a00:1 Line 1 Column 1 File C:/temp/fibonacci.cpp 
    ([email protected]~GCC4=1627#4d89de0^1#4dc39e0:1 Line 1 Column 1 File C:/temp/fibonacci.cpp 
    ([email protected]~GCC4=1109#4d89920^1#4d89de0:1 Line 1 Column 1 File C:/temp/fibonacci.cpp 
    |('int'@Cpp~GCC4=2760#4d898c0^1#4d89920:1[Keyword:0] Line 1 Column 1 File C:/temp/fibonacci.cpp)'int' 
    )simple_type_specifier 
    ([email protected]~GCC4=1401#4d89a80^1#4d89de0:2 Line 1 Column 5 File C:/temp/fibonacci.cpp 
    |([email protected]~GCC4=2645#4d89900^1#4d89a80:1[`fib'] Line 1 Column 5 File C:/temp/fibonacci.cpp)IDENTIFIER 
    |('('@Cpp~GCC4=2885#4d89ac0^1#4d89a80:2[Keyword:0] Line 1 Column 8 File C:/temp/fibonacci.cpp)'(' 
    |([email protected]~GCC4=1590#4d89e00^1#4d89a80:3 Line 1 Column 9 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=1109#4d89b20^1#4d89e00:1 Line 1 Column 9 File C:/temp/fibonacci.cpp 
    | ('int'@Cpp~GCC4=2760#4d89d60^1#4d89b20:1[Keyword:0] Line 1 Column 9 File C:/temp/fibonacci.cpp)'int' 
    |)simple_type_specifier 
    | ([email protected]~GCC4=2645#4d89b00^1#4d89e00:2[`n'] Line 1 Column 13 File C:/temp/fibonacci.cpp)IDENTIFIER 
    |)parameter_declaration 
    |(')'@Cpp~GCC4=2886#4d89bc0^1#4d89a80:4[Keyword:0] Line 1 Column 14 File C:/temp/fibonacci.cpp)')' 
    |([email protected]~GCC4=1417#4d89dc0^1#4d89a80:5 Line 1 Column 16 File C:/temp/fibonacci.cpp)function_qualifiers 
    )noptr_declarator 
)function_head 
    ([email protected]~GCC4=872#4dc39c0^1#4dc39e0:2 Line 1 Column 16 File C:/temp/fibonacci.cpp 
    ('{'@Cpp~GCC4=2938#4d89f20^1#4dc39c0:1[Keyword:0] Line 1 Column 16 File C:/temp/fibonacci.cpp)'{' 
    ([email protected]~GCC4=876#4dc3060^1#4dc39c0:2 Line 2 Column 5 File C:/temp/fibonacci.cpp 
    |([email protected]~GCC4=876#4dc3920^1#4dc3060:1 Line 2 Column 5 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=876#4dc2880^1#4dc3920:1 Line 2 Column 5 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=876#4dc2700^1#4dc2880:1 Line 2 Column 5 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=876#4dc2640^1#4dc2700:1 Line 2 Column 5 File C:/temp/fibonacci.cpp 
    | |([email protected]~GCC4=892#4dc25c0^1#4dc2640:1 Line 2 Column 5 File C:/temp/fibonacci.cpp 
    | | ('if'@Cpp~GCC4=2753#4d89f40^1#4dc25c0:1[Keyword:0] Line 2 Column 5 File C:/temp/fibonacci.cpp)'if' 
    | | ('('@Cpp~GCC4=2885#4d89f60^1#4dc25c0:2[Keyword:0] Line 2 Column 8 File C:/temp/fibonacci.cpp)'(' 
    | | ([email protected]~GCC4=763#4dc2220^1#4dc25c0:3 Line 2 Column 10 File C:/temp/fibonacci.cpp 
    | | (equality[email protected]~GCC4=696#4d89fa0^1#4dc2220:1 Line 2 Column 10 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=2645#4d89d80^1#4d89fa0:1[`n'] Line 2 Column 10 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | ('=='@Cpp~GCC4=2918#4d89da0^1#4d89fa0:2[Keyword:0] Line 2 Column 12 File C:/temp/fibonacci.cpp)'==' 
    | | ([email protected]~GCC4=2809#4d89fe0^1#4d89fa0:3[0] Line 2 Column 15 File C:/temp/fibonacci.cpp)INT_LITERAL 
    | | )equality_expression 
    | | ('||'@Cpp~GCC4=2922#4d89f80^1#4dc2220:2[Keyword:0] Line 2 Column 17 File C:/temp/fibonacci.cpp)'||' 
    | | ([email protected]~GCC4=696#4dc2200^1#4dc2220:3 Line 2 Column 20 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=2645#4dc2180^1#4dc2200:1[`n'] Line 2 Column 20 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | ('=='@Cpp~GCC4=2918#4dc21a0^1#4dc2200:2[Keyword:0] Line 2 Column 22 File C:/temp/fibonacci.cpp)'==' 
    | | ([email protected]~GCC4=2809#4dc21c0^1#4dc2200:3[1] Line 2 Column 25 File C:/temp/fibonacci.cpp)INT_LITERAL 
    | | )equality_expression 
    | |)logical_or_expression 
    | | (')'@Cpp~GCC4=2886#4dc21e0^1#4dc25c0:4[Keyword:0] Line 2 Column 27 File C:/temp/fibonacci.cpp)')' 
    | | ([email protected]~GCC4=983#4dc2440^1#4dc25c0:5 Line 3 Column 9 File C:/temp/fibonacci.cpp 
    | | ('return'@Cpp~GCC4=2778#4dc2340^1#4dc2440:1[Keyword:0] Line 3 Column 9 File C:/temp/fibonacci.cpp)'return' 
    | | ([email protected]~GCC4=2645#4dc2360^1#4dc2440:2[`n'] Line 3 Column 16 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | (';'@Cpp~GCC4=2937#4dc2400^1#4dc2440:3[Keyword:0] Line 3 Column 17 File C:/temp/fibonacci.cpp)';' 
    | |)jump_statement 
    | |)selection_statement 
    | |([email protected]~GCC4=1033#4dc2620^1#4dc2640:2 Line 5 Column 5 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=1109#4dc23c0^1#4dc2620:1 Line 5 Column 5 File C:/temp/fibonacci.cpp 
    | | ('int'@Cpp~GCC4=2760#4dc2520^1#4dc23c0:1[Keyword:0] Line 5 Column 5 File C:/temp/fibonacci.cpp)'int' 
    | |)simple_type_specifier 
    | | ([email protected]~GCC4=1380#4dc23a0^1#4dc2620:2 Line 5 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=2645#4dc2460^1#4dc23a0:1[`fib1'] Line 5 Column 9 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | ([email protected]~GCC4=1639#4dc2380^1#4dc23a0:2 Line 5 Column 14 File C:/temp/fibonacci.cpp 
    | | ('='@Cpp~GCC4=2893#4dc23e0^1#4dc2380:1[Keyword:0] Line 5 Column 14 File C:/temp/fibonacci.cpp)'=' 
    | | ([email protected]~GCC4=2809#4dc2680^1#4dc2380:2[0] Line 5 Column 16 File C:/temp/fibonacci.cpp)INT_LITERAL 
    | | )initializer 
    | |)init_declarator 
    | | (';'@Cpp~GCC4=2937#4dc26a0^1#4dc2620:3[Keyword:0] Line 5 Column 17 File C:/temp/fibonacci.cpp)';' 
    | |)simple_declaration 
    | )statement_seq 
    | ([email protected]~GCC4=1033#4dc25a0^1#4dc2700:2 Line 6 Column 5 File C:/temp/fibonacci.cpp 
    | |([email protected]~GCC4=1109#4dc26c0^1#4dc25a0:1 Line 6 Column 5 File C:/temp/fibonacci.cpp 
    | | ('int'@Cpp~GCC4=2760#4dc2600^1#4dc26c0:1[Keyword:0] Line 6 Column 5 File C:/temp/fibonacci.cpp)'int' 
    | |)simple_type_specifier 
    | |([email protected]~GCC4=1380#4dc2560^1#4dc25a0:2 Line 6 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=2645#4dc2660^1#4dc2560:1[`fib2'] Line 6 Column 9 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | ([email protected]~GCC4=1639#4dc2540^1#4dc2560:2 Line 6 Column 14 File C:/temp/fibonacci.cpp 
    | | ('='@Cpp~GCC4=2893#4dc26e0^1#4dc2540:1[Keyword:0] Line 6 Column 14 File C:/temp/fibonacci.cpp)'=' 
    | | ([email protected]~GCC4=2809#4dc2740^1#4dc2540:2[1] Line 6 Column 16 File C:/temp/fibonacci.cpp)INT_LITERAL 
    | |)initializer 
    | |)init_declarator 
    | |(';'@Cpp~GCC4=2937#4dc2760^1#4dc25a0:3[Keyword:0] Line 6 Column 17 File C:/temp/fibonacci.cpp)';' 
    | )simple_declaration 
    | )statement_seq 
    | ([email protected]~GCC4=1033#4dc2860^1#4dc2880:2 Line 7 Column 5 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=1109#4dc27c0^1#4dc2860:1 Line 7 Column 5 File C:/temp/fibonacci.cpp 
    | |('int'@Cpp~GCC4=2760#4dc2580^1#4dc27c0:1[Keyword:0] Line 7 Column 5 File C:/temp/fibonacci.cpp)'int' 
    | )simple_type_specifier 
    | ([email protected]~GCC4=1380#4dc2820^1#4dc2860:2 Line 7 Column 9 File C:/temp/fibonacci.cpp 
    | |([email protected]~GCC4=2645#4dc2720^1#4dc2820:1[`fib'] Line 7 Column 9 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | |([email protected]~GCC4=1639#4dc2800^1#4dc2820:2 Line 7 Column 13 File C:/temp/fibonacci.cpp 
    | | ('='@Cpp~GCC4=2893#4dc27e0^1#4dc2800:1[Keyword:0] Line 7 Column 13 File C:/temp/fibonacci.cpp)'=' 
    | | ([email protected]~GCC4=2809#4dc28c0^1#4dc2800:2[0] Line 7 Column 15 File C:/temp/fibonacci.cpp)INT_LITERAL 
    | |)initializer 
    | )init_declarator 
    | (';'@Cpp~GCC4=2937#4dc28e0^1#4dc2860:3[Keyword:0] Line 7 Column 16 File C:/temp/fibonacci.cpp)';' 
    | )simple_declaration 
    |)statement_seq 
    | ([email protected]~GCC4=941#4dc3980^1#4dc3920:2 Line 9 Column 5 File C:/temp/fibonacci.cpp 
    | ('for'@Cpp~GCC4=2749#4dc2840^1#4dc3980:1[Keyword:0] Line 9 Column 5 File C:/temp/fibonacci.cpp)'for' 
    | ('('@Cpp~GCC4=2885#4dc28a0^1#4dc3980:2[Keyword:0] Line 9 Column 9 File C:/temp/fibonacci.cpp)'(' 
    | ([email protected]~GCC4=1033#4dc2a20^1#4dc3980:3 Line 9 Column 11 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=1109#4dc2940^1#4dc2a20:1 Line 9 Column 11 File C:/temp/fibonacci.cpp 
    | |('int'@Cpp~GCC4=2760#4dc2900^1#4dc2940:1[Keyword:0] Line 9 Column 11 File C:/temp/fibonacci.cpp)'int' 
    | )simple_type_specifier 
    | ([email protected]~GCC4=1380#4dc29e0^1#4dc2a20:2 Line 9 Column 15 File C:/temp/fibonacci.cpp 
    | |([email protected]~GCC4=2645#4dc2920^1#4dc29e0:1[`i'] Line 9 Column 15 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | |([email protected]~GCC4=1639#4dc29c0^1#4dc29e0:2 Line 9 Column 17 File C:/temp/fibonacci.cpp 
    | | ('='@Cpp~GCC4=2893#4dc2960^1#4dc29c0:1[Keyword:0] Line 9 Column 17 File C:/temp/fibonacci.cpp)'=' 
    | | ([email protected]~GCC4=2809#4dc2a40^1#4dc29c0:2[2] Line 9 Column 19 File C:/temp/fibonacci.cpp)INT_LITERAL 
    | |)initializer 
    | )init_declarator 
    | (';'@Cpp~GCC4=2937#4dc29a0^1#4dc2a20:3[Keyword:0] Line 9 Column 20 File C:/temp/fibonacci.cpp)';' 
    | )simple_declaration 
    | ([email protected]~GCC4=684#4dc2b60^1#4dc3980:4 Line 9 Column 22 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=2645#4dc2a00^1#4dc2b60:1[`i'] Line 9 Column 22 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | ('<'@Cpp~GCC4=2899#4dc2a80^1#4dc2b60:2[Keyword:0] Line 9 Column 24 File C:/temp/fibonacci.cpp)'<' 
    | ([email protected]~GCC4=2645#4dc2aa0^1#4dc2b60:3[`n'] Line 9 Column 26 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | )relational_expression 
    | (';'@Cpp~GCC4=2937#4dc2b40^1#4dc3980:5[Keyword:0] Line 9 Column 27 File C:/temp/fibonacci.cpp)';' 
    | ([email protected]~GCC4=406#4dc2b20^1#4dc3980:6 Line 9 Column 29 File C:/temp/fibonacci.cpp 
    | ([email protected]~GCC4=2645#4dc2e60^1#4dc2b20:1[`i'] Line 9 Column 29 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | ('++'@Cpp~GCC4=2897#4dc2ae0^1#4dc2b20:2[Keyword:0] Line 9 Column 30 File C:/temp/fibonacci.cpp)'++' 
    | )postfix_expression 
    | (')'@Cpp~GCC4=2886#4dc2b00^1#4dc3980:7[Keyword:0] Line 9 Column 33 File C:/temp/fibonacci.cpp)')' 
    | ([email protected]~GCC4=872#4dc38e0^1#4dc3980:8 Line 10 Column 5 File C:/temp/fibonacci.cpp 
    | ('{'@Cpp~GCC4=2938#4dc2b80^1#4dc38e0:1[Keyword:0] Line 10 Column 5 File C:/temp/fibonacci.cpp)'{' 
    | ([email protected]~GCC4=876#4dc3900^1#4dc38e0:2 Line 11 Column 9 File C:/temp/fibonacci.cpp 
    | |([email protected]~GCC4=876#4dc2f20^1#4dc3900:1 Line 11 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=869#4dc3080^1#4dc2f20:1 Line 11 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=809#4dc33a0^1#4dc3080:1 Line 11 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=2645#4dc2ba0^1#4dc33a0:1[`fib'] Line 11 Column 9 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | ('='@Cpp~GCC4=2893#4dc2bc0^1#4dc33a0:2[Keyword:0] Line 11 Column 13 File C:/temp/fibonacci.cpp)'=' 
    | | ([email protected]~GCC4=593#4dc3000^1#4dc33a0:3 Line 11 Column 15 File C:/temp/fibonacci.cpp 
    | | |([email protected]~GCC4=2645#4dc2be0^1#4dc3000:1[`fib1'] Line 11 Column 15 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | |('+'@Cpp~GCC4=2902#4dc2e80^1#4dc3000:2[Keyword:0] Line 11 Column 20 File C:/temp/fibonacci.cpp)'+' 
    | | |([email protected]~GCC4=2645#4dc2ea0^1#4dc3000:3[`fib2'] Line 11 Column 22 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | )additive_expression 
    | | )assignment_expression 
    | | (';'@Cpp~GCC4=2937#4dc2ec0^1#4dc3080:2[Keyword:0] Line 11 Column 26 File C:/temp/fibonacci.cpp)';' 
    | |)expression_statement 
    | | ([email protected]~GCC4=869#4dc2f00^1#4dc2f20:2 Line 12 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=809#4dc3740^1#4dc2f00:1 Line 12 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=2645#4dc2ee0^1#4dc3740:1[`fib1'] Line 12 Column 9 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | ('='@Cpp~GCC4=2893#4dc3400^1#4dc3740:2[Keyword:0] Line 12 Column 14 File C:/temp/fibonacci.cpp)'=' 
    | | ([email protected]~GCC4=2645#4dc3340^1#4dc3740:3[`fib2'] Line 12 Column 16 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | )assignment_expression 
    | | (';'@Cpp~GCC4=2937#4dc2fa0^1#4dc2f00:2[Keyword:0] Line 12 Column 20 File C:/temp/fibonacci.cpp)';' 
    | |)expression_statement 
    | |)statement_seq 
    | |([email protected]~GCC4=869#4dc2fe0^1#4dc3900:2 Line 13 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=809#4dc3940^1#4dc2fe0:1 Line 13 Column 9 File C:/temp/fibonacci.cpp 
    | | ([email protected]~GCC4=2645#4dc38a0^1#4dc3940:1[`fib2'] Line 13 Column 9 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | | ('='@Cpp~GCC4=2893#4dc37a0^1#4dc3940:2[Keyword:0] Line 13 Column 14 File C:/temp/fibonacci.cpp)'=' 
    | | ([email protected]~GCC4=2645#4dc3700^1#4dc3940:3[`fib'] Line 13 Column 16 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | |)assignment_expression 
    | | (';'@Cpp~GCC4=2937#4dc38c0^1#4dc2fe0:2[Keyword:0] Line 13 Column 19 File C:/temp/fibonacci.cpp)';' 
    | |)expression_statement 
    | )statement_seq 
    | ('}'@Cpp~GCC4=2939#4dc2fc0^1#4dc38e0:3[Keyword:0] Line 14 Column 5 File C:/temp/fibonacci.cpp)'}' 
    | )compound_statement 
    |)iteration_statement 
    |)statement_seq 
    |([email protected]~GCC4=983#4dc3040^1#4dc3060:2 Line 16 Column 5 File C:/temp/fibonacci.cpp 
    | ('return'@Cpp~GCC4=2778#4dc3960^1#4dc3040:1[Keyword:0] Line 16 Column 5 File C:/temp/fibonacci.cpp)'return' 
    | ([email protected]~GCC4=2645#4dc3500^1#4dc3040:2[`fib'] Line 16 Column 12 File C:/temp/fibonacci.cpp)IDENTIFIER 
    | (';'@Cpp~GCC4=2937#4dc3540^1#4dc3040:3[Keyword:0] Line 16 Column 15 File C:/temp/fibonacci.cpp)';' 
    |)jump_statement 
    )statement_seq 
    ('}'@Cpp~GCC4=2939#4dc3560^1#4dc39c0:3[Keyword:0] Line 17 Column 1 File C:/temp/fibonacci.cpp)'}' 
)compound_statement 
)function_definition 
)translation_unit 
Exiting with final status 0. 

C:\DMS\Domains\Cpp\GCC4\Tools\Parser\Source> 

DMSをすることができこれのXMLバージョンを生成します。 truly vexing example of C++については

template<bool> struct a_t; 

template<> struct a_t<true> { 
    template<int> struct b {}; 
}; 

template<> struct a_t<false> { 
    enum { b }; 
}; 

typedef a_t<sizeof(void*)==sizeof(int)> a; 

enum { c, d }; 
int main() { 
    a::b<c>d; // declaration or expression? 
} 

... DMSは、ドットで描かれた最後の文の複数の解釈 と、次のツリーを、(生産;お使いのブラウザは、おそらくあなたが見てみましょうする「ビュー画像」を持っています拡大版):

Parse of difficult C++ program

示す例は、C++のGCC方言のために起こります。 DMSはMicrosoft Visual Studio C++を解析することもできます(2015年6月現在、C++ 14、MSVC 2013のすべてを処理しており、MSVC 2015との互換性を確認しています)。

パーズツリーを単独で取得することはあまり役に立ちません。 symbol tableや制御/データフローのファクトなど、その他のアーティファクトも必要です。 DMS C++フロントエンドは、これをすべてASTのツールアクセス可能なデータ属性として生成します。 (これらのシンボルテーブルを使用すると、C++のフロントエンドは上記の例のサブパーズを有効にして無効なサブツリーを削除します)

+1

[DMSソフトウェアリエンジニアリングツールキットはプロプライエタリである...](https://en.wikipedia.org/wiki/DMS_Software_Reengineering_Toolkit) – ceving

+2

@ceving:はい、そうです。 SOは独自のツールに問題はありません。そうでなければC#についてどうやって話しますか? 「Our ...」というフレーズは、それが独占的であるという正当な示唆として、長年受け入れられています。 –

関連する問題