======================================================================== pointer declarations vs multiplications ======================================================================== int main() { // declare a function pointer T1 * b(T2 a); // evaluate expressions c * d(5); e(f * g); } --- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (comment) (declaration (type_identifier) (pointer_declarator (function_declarator (identifier) (parameter_list (parameter_declaration (type_identifier) (identifier)))))) (comment) (expression_statement (binary_expression (identifier) (call_expression (identifier) (argument_list (number_literal))))) (expression_statement (call_expression (identifier) (argument_list (binary_expression (identifier) (identifier)))))))) ======================================================================== casts vs multiplications ======================================================================== /* * ambiguities */ int main() { // cast a((B *)c); // parenthesized product d((e * f)); } --- (translation_unit (comment) (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (comment) (expression_statement (call_expression (identifier) (argument_list (cast_expression (type_descriptor (type_identifier) (abstract_pointer_declarator)) (identifier))))) (comment) (expression_statement (call_expression (identifier) (argument_list (parenthesized_expression (binary_expression (identifier) (identifier))))))))) ======================================================================== function-like type macros vs function calls ======================================================================== // this is a macro GIT_INLINE(int *) x = 5; --- (translation_unit (comment) (declaration (macro_type_specifier (identifier) (type_descriptor (primitive_type) (abstract_pointer_declarator))) (init_declarator (identifier) (number_literal)))) ======================================================================== function calls vs parenthesized declarators vs macro types ======================================================================== int main() { /* * Could be either: * - function call * - declaration w/ parenthesized declarator * - declaration w/ macro type, no declarator */ ABC(d); /* * Normal declaration */ efg hij; } --- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (comment) (expression_statement (call_expression (identifier) (argument_list (identifier)))) (comment) (declaration (type_identifier) (identifier))))) ======================================================================== Call expressions vs empty declarations w/ macros as types ======================================================================== int main() { int a = 1; b(a); A(A *); } --- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (declaration (primitive_type) (init_declarator (identifier) (number_literal))) (expression_statement (call_expression (identifier) (argument_list (identifier)))) (macro_type_specifier (identifier) (type_descriptor (type_identifier) (abstract_pointer_declarator)))))) ======================================================================== Comments after for loops with ambiguities ======================================================================== int main() { for (a *b = c; d; e) { aff; } // a-comment g; } --- (translation_unit (function_definition (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement (for_statement (declaration (type_identifier) (init_declarator (pointer_declarator (identifier)) (identifier))) (identifier) (identifier) (compound_statement (expression_statement (identifier)))) (comment) (expression_statement (identifier))))) =============================================== Top-level macro invocations =============================================== DEFINE_SOMETHING(THING_A, "this is a thing a"); DEFINE_SOMETHING(THING_B, "this is a thing b", "thanks"); --- (translation_unit (expression_statement (call_expression (identifier) (argument_list (identifier) (string_literal)))) (expression_statement (call_expression (identifier) (argument_list (identifier) (string_literal) (string_literal)))))