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

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

Linda Hamilton
リリース: 2024-12-12 18:23:15
オリジナル
897 人が閲覧しました

How can I easily obtain a human-readable Abstract Syntax Tree (AST) from C   code?

C コードから人間が判読できる AST を取得します

Clang は以前、-emit-asm フラグを使用してこの機能を提供していましたが、現在は削除されています。次に、次のような疑問が生じます: 現在、これを達成するための簡単な方法はありますか?

ソリューションには 2 つのインスタンスがあります。簡単なものと難しいもの (C の「最も厄介な解析」) です。以下は、http://talkbinary.com/programming/c/fibonacci-in-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 ソフトウェア リエンジニアリング ツールキット (完全な C を使用) 11/17 パーサー) は次の AST を生成します:

(translation_unit
  (function_definition
    (function_head
      (simple_type_specifier
        ('int' 'int')
      )
      (noptr_declarator
        (IDENTIFIER 'fib')
        ('('
          (parameter_declaration
            (simple_type_specifier
              ('int' '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')
                          (INT_LITERAL '0')
                        )
                        ('||' '||')
                        (equality_expression
                          (IDENTIFIER 'n')
                          ('==' 'int')
                          (INT_LITERAL '1')
                        )
                      )
                    )
                    (jump_statement
                      ('return'
                        (IDENTIFIER 'n')
                        (';' 'int')
                      )
                    )
                  )
              )
              (simple_declaration
                (simple_type_specifier
                  ('int' 'int')
                )
                (init_declarator
                  (IDENTIFIER 'fib1')
                  (initializer
                    ('=' 'int')
                    (INT_LITERAL '0')
                  )
                )
                (';' 'int')
              )
            )
            (simple_declaration
              (simple_type_specifier
                ('int' 'int')
              )
              (init_declarator
                (IDENTIFIER 'fib2')
                (initializer
                  ('=' 'int')
                  (INT_LITERAL '1')
                )
              )
              (';' 'int')
            )
          )
          (simple_declaration
            (simple_type_specifier
              ('int' 'int')
            )
            (init_declarator
              (IDENTIFIER 'fib')
              (initializer
                ('=' 'int')
                (INT_LITERAL '0')
              )
            )
            (';' 'int')
          )
        )
        (iteration_statement
          ('for'
            ('('
              (simple_declaration
                (simple_type_specifier
                  ('int' 'int')
                )
                (init_declarator
                  (IDENTIFIER 'i')
                  (initializer
                    ('=' 'int')
                    (INT_LITERAL '2')
                  )
                )
                (';' 'int')
              )
              (relational_expression
                (IDENTIFIER 'i')
                ('<' '<')
                (IDENTIFIER 'n')
              )
              (';' 'int')
              (postfix_expression
                (IDENTIFIER 'i')
                ('++' 'inc')
              )
            )
            (compound_statement
              ('{'
                (statement_seq
                  (statement_seq
                    (expression_statement
                      (assignment_expression
                        (IDENTIFIER 'fib')
                        ('=' 'int')
                        (additive_expression
                          (IDENTIFIER 'fib1')
                          ('+')
                          (IDENTIFIER 'fib2')
                        )
                      )
                      (';' 'int')
                    )
                  )
                  (expression_statement
                    (assignment_expression
                      (IDENTIFIER 'fib1')
                      ('=' 'int')
                      (IDENTIFIER 'fib2')
                    )
                    (';' 'int')
                  )
                )
                (expression_statement
                  (assignment_expression
                    (IDENTIFIER 'fib2')
                    ('=' 'int')
                    (IDENTIFIER 'fib')
                  )
                  (';' 'int')
                )
              )
            )
          )
        )
        (jump_statement
          ('return'
            (IDENTIFIER 'fib')
            (';' 'int')
          )
        )
      )
    )
  )
)
ログイン後にコピー

以上がC コードから人間が読める抽象構文ツリー (AST) を簡単に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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