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; }
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') ) ) ) ) ) )
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!