Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh dengan mudah mendapatkan Pokok Sintaks Abstrak (AST) yang boleh dibaca manusia daripada kod C?

Bagaimanakah saya boleh dengan mudah mendapatkan Pokok Sintaks Abstrak (AST) yang boleh dibaca manusia daripada kod C?

Linda Hamilton
Lepaskan: 2024-12-12 18:23:15
asal
902 orang telah melayarinya

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

dapatkan AST boleh dibaca manusia daripada kod c

Clang sebelum ini telah menawarkan fungsi ini dengan bendera -emit-asm, yang sejak itu telah dialih keluar . Persoalannya kemudiannya ditimbulkan: Adakah pada masa ini terdapat kaedah mudah untuk mencapai ini?

Terdapat dua contoh dalam penyelesaian, yang mudah dan yang mencabar ("penghuraian paling menjengkelkan" C). Berikut ialah contoh program Fibonacci daripada 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;
}
Salin selepas log masuk

Dengan ini sebagai input, DMS Software Reengineering Toolkit (dengan C penuh 11/17 parser) menghasilkan AST ini:

(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')
          )
        )
      )
    )
  )
)
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah saya boleh dengan mudah mendapatkan Pokok Sintaks Abstrak (AST) yang boleh dibaca manusia daripada kod C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan