C コードから人間が読める AST を取得する
C ソフトウェア開発の領域では、人間が読める表現を持つことが有益な場合がありますプログラムの抽象構文ツリー (AST) の。 AST は、プログラムの構文の構造化されたビューを提供し、理解と分析を容易にします。
C コードの解析
C コードから AST を取得するには、いくつかのツールが利用できます。注目すべきオプションの 1 つは Clang コンパイラです。 Clang は、人間が読める形式で AST を生成できる「-emit-llvm」と呼ばれる機能を提供します。ただし、この機能は非推奨となり、Clang の最近のバージョンから削除されました。
代替ツール
C コードから AST を生成できる代替ツールは、DMS ソフトウェア リエンジニアリングです。ツールキット。 DMS は、C 11 や C 17 などの最新の C 標準をサポートする包括的な C パーサーを提供します。
DMS アプローチ
DMS を使用して C コードから AST を取得するには、次のようにします。次の手順に従ってください:
run ..\DomainParser ++AST "<path_to_C++_file>"
例
次の C の単純なフィボナッチ プログラムを考えてみましょう。
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:
(translation_unit (function_definition (function_head (simple_type_specifier ('int') ) (noptr_declarator (IDENTIFIER ['fib']) ('(') (parameter_declaration (simple_type_specifier ('int')) (IDENTIFIER ['n']) ) (')') (function_qualifiers) ) ) (compound_statement ('{' (statement_seq (statement_seq (statement_seq (statement_seq (selection_statement ('if') ('(') (logical_or_expression (equality_expression (IDENTIFIER ['n']) ('==') (INT_LITERAL [0]) ) ('||') (equality_expression (IDENTIFIER ['n']) ('==') (INT_LITERAL [1]) ) ) (')') (jump_statement ('return') (IDENTIFIER ['n']) ) ) (simple_declaration (simple_type_specifier $('int')) (init_declarator (IDENTIFIER ['fib1']) (initializer ('=') (INT_LITERAL [0]) ) ) ) ) (simple_declaration (simple_type_specifier $('int')) (init_declarator (IDENTIFIER ['fib2']) (initializer ('=') (INT_LITERAL [1]) ) ) ) ) (simple_declaration (simple_type_specifier $('int')) (init_declarator (IDENTIFIER ['fib']) (initializer ('=') (INT_LITERAL [0]) ) ) ) ) (iteration_statement ('for') ('(') (simple_declaration (simple_type_specifier $('int')) (init_declarator (IDENTIFIER ['i']) (initializer ('=') (INT_LITERAL [2]) ) ) ) (relational_expression (IDENTIFIER ['i']) ('<') (IDENTIFIER ['n']) ) (';' (postfix_expression (IDENTIFIER ['i']) ('++') ) ')' (compound_statement ('{' (statement_seq (statement_seq (expression_statement (assignment_expression (IDENTIFIER ['fib']) ('=') (additive_expression (IDENTIFIER ['fib1']) ('+') (IDENTIFIER ['fib2']) ) ) ) (expression_statement (assignment_expression (IDENTIFIER ['fib1']) ('=') (IDENTIFIER ['fib2']) ) ) ) (expression_statement (assignment_expression (IDENTIFIER ['fib2']) ('=') (IDENTIFIER ['fib']) ) ) ) }')) ) ) (jump_statement ('return') (IDENTIFIER ['fib']) ) }')) )
この AST は、プログラムの構造とセマンティクスの詳細な表現を提供し、プログラムの動作の理解と分析を容易にします。
以上がC コードから人間が読める抽象構文ツリー (AST) を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。