Maison > développement back-end > C++ > Comment puis-je obtenir facilement un arbre de syntaxe abstraite (AST) lisible par l'homme à partir du code C ?

Comment puis-je obtenir facilement un arbre de syntaxe abstraite (AST) lisible par l'homme à partir du code C ?

Linda Hamilton
Libérer: 2024-12-12 18:23:15
original
898 Les gens l'ont consulté

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

obtenir un AST lisible par l'homme à partir du code C

Clang a déjà proposé cette fonctionnalité avec l'indicateur -emit-asm, qui a depuis été supprimé . La question se pose alors : existe-t-il actuellement une méthode simple pour y parvenir ?

Il y a deux instances dans la solution, une simple et une difficile (l'analyse la plus frustrante de C). Ce qui suit est un exemple de programme Fibonacci de 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;
}
Copier après la connexion

Avec cela comme entrée, la boîte à outils de réingénierie logicielle DMS (avec C complet 11/17 analyseur) produit cet 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')
          )
        )
      )
    )
  )
)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal