/*============================================================================= grammar.ll Version 7.06 Full ANSI standard C grammar in EBNF format. Recognizer only. Actions included to handle typedef declaration. Copyright (c) 2002-2014 SLK Systems, all rights reserved. 09-18-14 Simplified and converted more to ebnf =============================================================================*/ translation_unit : { external_declaration } __FinishParse external_declaration : declarator function_definition { declaration_specifier }+ function_or_declaration typedef { declaration_specifier }+ [ init_declarator_list2 ] ; function_or_declaration : declarator more_function_or_declaration ; more_function_or_declaration : function_definition [ = initializer ] { , init_declarator } ; function_definition : { declaration } compound_statement declaration : { declaration_specifier }+ [ init_declarator_list ] ; typedef { declaration_specifier }+ [ init_declarator_list2 ] ; declaration_specifier : storage_class_specifier type_specifier type_qualifier storage_class_specifier : auto register static extern type_specifier : void char short int long float double signed unsigned struct_or_union_specifier enum_specifier TYPEDEF_NAME type_qualifier : const volatile struct_or_union_specifier : struct_or_union IDENTIFIER [ \{ struct_declarations \} ] struct_or_union \{ struct_declarations \} struct_or_union : struct union struct_declarations : { { specifier_qualifier }+ struct_declarator_list ; }+ init_declarator_list : init_declarator { , init_declarator } init_declarator_list2 : init_declarator __SetTypedefName { , init_declarator __SetTypedefName } init_declarator : declarator [ = initializer ] specifier_qualifier : type_specifier type_qualifier struct_declarator_list : struct_declarator { , struct_declarator } struct_declarator : declarator [ : constant_expression ] : constant_expression enum_specifier : enum \{ enumerator_list \} enum IDENTIFIER [ \{ enumerator_list \} ] enumerator_list : enumerator { , enumerator } enumerator : IDENTIFIER [ = constant_expression ] declarator : [ pointer ] direct_declarator direct_declarator : IDENTIFIER more_direct_declarator ( declarator ) more_direct_declarator more_direct_declarator : \[ [ constant_expression ] \] more_direct_declarator __NewScope ( parameter_type_list __ReleaseScope ) more_direct_declarator ( [ identifier_list ] ) more_direct_declarator _epsilon_ pointer : * { type_qualifier } [ pointer ] parameter_type_list : parameter_declaration { , parameter_declaration } [ , ... ] parameter_declaration : { declaration_specifier }+ [ declarator_or_abstract_declarator ] declarator_or_abstract_declarator : direct_declarator_or_direct_abstract_declarator pointer [ direct_declarator_or_direct_abstract_declarator ] direct_declarator_or_direct_abstract_declarator : IDENTIFIER more_dd_or_dad ( declarator_or_abstract_declarator ) more_dd_or_dad \[ [ constant_expression ] \] more_dd_or_dad ( [ parameter_type_list ] ) more_dd_or_dad more_dd_or_dad : \[ [ constant_expression ] \] more_dd_or_dad ( parameter_type_list ) more_dd_or_dad ( [ identifier_list ] ) more_dd_or_dad _epsilon_ identifier_list : IDENTIFIER { , IDENTIFIER } initializer : assignment_expression \{ initializer_list [ , ] \} initializer_list : initializer { , initializer } type_name : { specifier_qualifier }+ [ abstract_declarator ] abstract_declarator : pointer [ direct_abstract_declarator ] direct_abstract_declarator direct_abstract_declarator : ( abstract_declarator ) more_direct_abstract_declarator \[ [ constant_expression ] \] more_direct_abstract_declarator ( [ parameter_type_list ] ) more_direct_abstract_declarator more_direct_abstract_declarator : \[ [ constant_expression ] \] more_direct_abstract_declarator ( [ parameter_type_list ] ) more_direct_abstract_declarator _epsilon_ statement : labeled_statement expression_statement compound_statement selection_statement iteration_statement jump_statement labeled_statement : IDENTIFIER : statement case constant_expression : statement default : statement expression_statement : [ expression ] ; compound_statement : __NewScope \{ { declaration } { statement } __ReleaseScope \} selection_statement : if ( expression ) statement more_if switch ( expression ) statement more_if :! else statement _epsilon_ iteration_statement : while ( expression ) statement do statement while ( expression ) ; for ( [ expression ] ; [ expression ] ; [ expression ] ) statement jump_statement : goto IDENTIFIER ; continue ; break ; return [ expression ] ; expression : assignment_expression { , assignment_expression } /* ----------------------------------------------------------------------- use semantic check for lvalue instead of the following production: unary_expression assignment_operator assignment_expression ----------------------------------------------------------------------- */ assignment_expression : conditional_expression [ assignment_operator assignment_expression ] assignment_operator : = *= /= %= += -= <<= >>= &= ^= |= conditional_expression : logical_OR_expression [ ? expression : conditional_expression ] constant_expression : conditional_expression logical_OR_expression : logical_AND_expression { || logical_AND_expression } logical_AND_expression : inclusive_OR_expression { && inclusive_OR_expression } inclusive_OR_expression : exclusive_OR_expression { | exclusive_OR_expression } exclusive_OR_expression : and_expression { ^ and_expression } and_expression : equality_expression { & equality_expression } equality_expression : relational_expression { equality_op relational_expression } equality_op : == != relational_expression : shift_expression { relational_op shift_expression } relational_op : < > <= >= shift_expression : additive_expression { shift_op additive_expression } shift_op : << >> additive_expression : multiplicitive_expression { additive_op multiplicitive_expression } additive_op : + - multiplicitive_expression : cast_expression { multiplicitive_op cast_expression } multiplicitive_op : * / % cast_expression : unary_expression ( type_name ) cast_expression unary_expression : postfix_expression ++ unary_expression -- unary_expression unary_operator cast_expression sizeof unary_expression sizeof ( type_name ) unary_operator : & * + - ~ ! postfix_expression : primary_expression more_postfix_expression more_postfix_expression : \[ expression \] more_postfix_expression ( [ argument_expression_list ] ) more_postfix_expression . IDENTIFIER more_postfix_expression -> IDENTIFIER more_postfix_expression ++ more_postfix_expression -- more_postfix_expression _epsilon_ primary_expression : IDENTIFIER // __ShowName constant { STRING }+ ( expression ) argument_expression_list : assignment_expression { , assignment_expression } constant : INTEGER_CONSTANT CHARACTER_CONSTANT FLOATING_CONSTANT ENUMERATION_CONSTANT slk V4.85 (c) 2001-2014 by SLK Systems Conflict 1: parse table conflict under "union": 33: struct_or_union_specifier --> struct_or_union IDENTIFIER {_struct_declarations_}_opt 34: struct_or_union_specifier --> struct_or_union { struct_declarations } Conflict 2: parse table conflict under "struct": 33: struct_or_union_specifier --> struct_or_union IDENTIFIER {_struct_declarations_}_opt 34: struct_or_union_specifier --> struct_or_union { struct_declarations } Conflict 3: parse table conflict under "enum": 46: enum_specifier --> enum { enumerator_list } 47: enum_specifier --> enum IDENTIFIER {_enumerator_list_}_opt Conflict 4: parse table conflict under "(": 54: more_direct_declarator --> __NewScope ( parameter_type_list __ReleaseScope ) more_direct_declarator 55: more_direct_declarator --> ( identifier_list_opt ) more_direct_declarator Conflict 5: parse table conflict under "(": 63: direct_declarator_or_direct_abstract_declarator --> ( declarator_or_abstract_declarator ) more_dd_or_dad 65: direct_declarator_or_direct_abstract_declarator --> ( parameter_type_list_opt ) more_dd_or_dad Conflict 6: parse table conflict under "(": 67: more_dd_or_dad --> ( parameter_type_list ) more_dd_or_dad 68: more_dd_or_dad --> ( identifier_list_2_opt ) more_dd_or_dad Conflict 7: parse table conflict under "(": 77: direct_abstract_declarator --> ( abstract_declarator ) more_direct_abstract_declarator 79: direct_abstract_declarator --> ( parameter_type_list_2_opt ) more_direct_abstract_declarator Conflict 8: parse table conflict under "IDENTIFIER": 83: statement --> labeled_statement 84: statement --> expression_statement Conflict 9: parse table conflict under "else": 96: more_if --> else statement 97: more_if --> Conflict 10: parse table conflict under "(": 143: cast_expression --> unary_expression 144: cast_expression --> ( type_name ) cast_expression Conflict 11: parse table conflict under "sizeof": 149: unary_expression --> sizeof unary_expression 150: unary_expression --> sizeof ( type_name ) Conflict 12: parse table conflict under ",": 228: ,_parameter_declaration_* --> , parameter_declaration ,_parameter_declaration_* 229: ,_parameter_declaration_* --> Conflict 13: parse table conflict under ",": 250: ,_initializer_* --> , initializer ,_initializer_* 251: ,_initializer_* --> -------------------------------------------------- Conflicts were ignored by request on 1 nonterminal(s) Conflicts were resolved at lookahead level k=3 total nonterminals = 143 total terminals = 86 total productions = 311 parse table size = 12298 ignored conflicts = 1 total base conflicts = 13 total conflicts = 14 conflict table size = 1204 generating the parser compacting parse table from 12298 to 2381 compacting conflict table from 1204 to 399