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

Comment puis-je obtenir un arbre syntaxique abstrait (AST) lisible par l'homme à partir du code C ?

DDD
Libérer: 2024-12-18 21:46:14
original
674 Les gens l'ont consulté

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

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

Dans le domaine du développement de logiciels C, il peut être bénéfique d'avoir une représentation lisible par l'homme de l'arbre de syntaxe abstraite (AST) d'un programme. Les AST fournissent une vue structurée de la syntaxe d'un programme, permettant une compréhension et une analyse plus faciles.

Analyse du code C

Pour obtenir un AST à partir du code C, plusieurs outils sont disponibles. Une option notable est le compilateur Clang. Clang fournit une fonctionnalité appelée "-emit-llvm", qui peut générer un AST dans un format lisible par l'homme. Cependant, cette fonctionnalité a été obsolète et supprimée des versions récentes de Clang.

Outil alternatif

Un outil alternatif qui peut générer des AST à partir du code C est le DMS Software Reengineering Boîte à outils. DMS fournit un analyseur C complet qui prend en charge les normes C modernes, notamment C 11 et C 17.

Approche DMS

Pour utiliser DMS pour obtenir un AST à partir du code C, vous pouvez suivre les étapes suivantes :

  1. Installer DMS.
  2. Créer un C fichier avec le code que vous souhaitez analyser.
  3. Exécutez la commande suivante :
run ..\DomainParser ++AST "<path_to_C++_file>"
Copier après la connexion

Remplacez avec le chemin réel de votre fichier C. DMS générera un AST et l'affichera sous une forme lisible par l'homme.

Exemples

Considérez le programme de Fibonacci simple suivant en 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

L'exécution de DMS sur ce programme produira l'AST suivant :

(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'])
    )
   }'))
)
Copier après la connexion

Cet AST fournit une représentation détaillée de la structure et de la sémantique du programme, facilitant la compréhension et l'analyse du comportement du programme.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal