ホームページ > バックエンド開発 > C++ > C コードから人間が読める抽象構文ツリー (AST) を取得するにはどうすればよいですか?

C コードから人間が読める抽象構文ツリー (AST) を取得するにはどうすればよいですか?

DDD
リリース: 2024-12-18 21:46:14
オリジナル
674 人が閲覧しました

How Can I Obtain a Human-Readable Abstract Syntax Tree (AST) from C   Code?

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 を取得するには、次のようにします。次の手順に従ってください:

  1. インストールDMS。
  2. 解析するコードを含む C ファイルを作成します。
  3. 次のコマンドを実行します。
run ..\DomainParser ++AST "<path_to_C++_file>"
ログイン後にコピー

を置き換えます。 C ファイルへの実際のパスを置き換えます。 DMS は AST を生成し、人間が判読できる形式で表示します。

次の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート