Erhalten Sie für Menschen lesbares AST aus C-Code
Im Bereich der C-Softwareentwicklung kann es von Vorteil sein, eine für Menschen lesbare Darstellung zu haben des Abstract Syntax Tree (AST) eines Programms. ASTs bieten eine strukturierte Ansicht der Syntax eines Programms und ermöglichen so ein einfacheres Verständnis und eine einfachere Analyse.
C-Code analysieren
Um einen AST aus C-Code zu erhalten, stehen mehrere Tools zur Verfügung. Eine bemerkenswerte Option ist der Clang-Compiler. Clang bietet eine Funktion namens „-emit-llvm“, die einen AST in einem für Menschen lesbaren Format generieren kann. Diese Funktion ist jedoch veraltet und wurde aus neueren Versionen von Clang entfernt.
Alternatives Tool
Ein alternatives Tool, das ASTs aus C-Code generieren kann, ist DMS Software Reengineering Toolkit. DMS bietet einen umfassenden C-Parser, der moderne C-Standards unterstützt, einschließlich C 11 und C 17.
DMS-Ansatz
Um DMS zu verwenden, um einen AST aus C-Code zu erhalten, Sie können die folgenden Schritte ausführen:
run ..\DomainParser ++AST "<path_to_C++_file>"
Ersetzen Sie
Beispiele
Betrachten Sie das folgende einfache Fibonacci-Programm 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; }
Das Ausführen von DMS in diesem Programm erzeugt den folgenden AST:
(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']) ) }')) )
Dieser AST Bietet eine detaillierte Darstellung der Struktur und Semantik des Programms und erleichtert so das Verständnis und die Analyse des Programmverhaltens.
Das obige ist der detaillierte Inhalt vonWie kann ich aus C-Code einen für Menschen lesbaren abstrakten Syntaxbaum (AST) erhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!