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 :
run ..\DomainParser ++AST "<path_to_C++_file>"
Remplacez
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; }
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']) ) }')) )
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!