dapatkan AST boleh dibaca manusia daripada kod c
Clang sebelum ini telah menawarkan fungsi ini dengan bendera -emit-asm, yang sejak itu telah dialih keluar . Persoalannya kemudiannya ditimbulkan: Adakah pada masa ini terdapat kaedah mudah untuk mencapai ini?
Terdapat dua contoh dalam penyelesaian, yang mudah dan yang mencabar ("penghuraian paling menjengkelkan" C). Berikut ialah contoh program Fibonacci daripada 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; }
Dengan ini sebagai input, DMS Software Reengineering Toolkit (dengan C penuh 11/17 parser) menghasilkan AST ini:
(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') ) ) ) ) ) )
Atas ialah kandungan terperinci Bagaimanakah saya boleh dengan mudah mendapatkan Pokok Sintaks Abstrak (AST) yang boleh dibaca manusia daripada kod C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!