Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rcda7889 r8b47e50  
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jun 30 15:38:00 2017
    13 // Update Count     : 2415
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Wed Jul 12 18:23:36 2017
     13// Update Count     : 2426
    1414//
    1515
     
    129129%token ATTRIBUTE EXTENSION                                                              // GCC
    130130%token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
    131 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT        // CFA
     131%token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH   // CFA
    132132%token ASM                                                                                              // C99, extension ISO/IEC 9899:1999 Section J.5.10(1)
    133133%token ALIGNAS ALIGNOF GENERIC STATICASSERT                             // C11
     
    184184// statements
    185185%type<sn> labeled_statement                             compound_statement                      expression_statement            selection_statement
    186 %type<sn> iteration_statement                   jump_statement                          exception_statement                     asm_statement
     186%type<sn> iteration_statement                   jump_statement
     187%type<sn> with_statement                                exception_statement                     asm_statement
    187188%type<sn> fall_through_opt                              fall_through
    188189%type<sn> statement                                             statement_list
    189190%type<sn> block_item_list                               block_item
    190 %type<sn> case_clause
     191%type<sn> with_clause_opt
    191192%type<en> case_value
    192 %type<sn> case_value_list                               case_label                                      case_label_list
     193%type<sn> case_clause                                   case_value_list                         case_label                                      case_label_list
    193194%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    194195%type<sn> /* handler_list */                    handler_clause                          finally_clause
     
    665666        conditional_expression
    666667        | unary_expression assignment_operator assignment_expression
    667                 { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
     668                { $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); }
    668669        ;
    669670
     
    729730        | iteration_statement
    730731        | jump_statement
     732        | with_statement
    731733        | exception_statement
    732734        | asm_statement
     
    934936        | THROWRESUME assignment_expression_opt AT assignment_expression ';' // handles reresume
    935937                { $$ = new StatementNode( build_resume_at( $2, $4 ) ); }
     938        ;
     939
     940with_statement:
     941        WITH identifier_list compound_statement
     942                { $$ = (StatementNode *)0; }                                    // FIX ME
    936943        ;
    937944
     
    21762183                {
    21772184                        linkageStack.push( linkage );                           // handle nested extern "C"/"Cforall"
    2178                         linkage = LinkageSpec::linkageCheck( $2 );
     2185                        linkage = LinkageSpec::linkageUpdate( linkage, $2 );
    21792186                }
    21802187          '{' external_definition_list_opt '}'
     
    22122219        ;
    22132220
     2221with_clause_opt:
     2222        // empty
     2223                { $$ = (StatementNode *)0; }                                    // FIX ME
     2224        | WITH identifier_list
     2225                { $$ = (StatementNode *)0; }                                    // FIX ME
     2226        ;
     2227
    22142228function_definition:
    2215         cfa_function_declaration compound_statement                     // CFA
     2229        cfa_function_declaration with_clause_opt compound_statement     // CFA
    22162230                {
    22172231                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22182232                        typedefTable.leaveScope();
    2219                         $$ = $1->addFunctionBody( $2 );
    2220                 }
    2221         | declaration_specifier function_declarator compound_statement
     2233                        $$ = $1->addFunctionBody( $3 );
     2234                }
     2235        | declaration_specifier function_declarator with_clause_opt compound_statement
    22222236                {
    22232237                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22242238                        typedefTable.leaveScope();
    2225                         $$ = $2->addFunctionBody( $3 )->addType( $1 );
    2226                 }
    2227         | type_qualifier_list function_declarator compound_statement
     2239                        $$ = $2->addFunctionBody( $4 )->addType( $1 );
     2240                }
     2241        | type_qualifier_list function_declarator with_clause_opt compound_statement
    22282242                {
    22292243                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22302244                        typedefTable.leaveScope();
    2231                         $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
    2232                 }
    2233         | declaration_qualifier_list function_declarator compound_statement
     2245                        $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
     2246                }
     2247        | declaration_qualifier_list function_declarator with_clause_opt compound_statement
    22342248                {
    22352249                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22362250                        typedefTable.leaveScope();
    2237                         $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
    2238                 }
    2239         | declaration_qualifier_list type_qualifier_list function_declarator compound_statement
     2251                        $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
     2252                }
     2253        | declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement
    22402254                {
    22412255                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22422256                        typedefTable.leaveScope();
    2243                         $$ = $3->addFunctionBody( $4 )->addQualifiers( $2 )->addQualifiers( $1 );
     2257                        $$ = $3->addFunctionBody( $5 )->addQualifiers( $2 )->addQualifiers( $1 );
    22442258                }
    22452259
    22462260                // Old-style K&R function definition, OBSOLESCENT (see 4)
    2247         | declaration_specifier KR_function_declarator push KR_declaration_list_opt compound_statement
     2261        | declaration_specifier KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22482262                {
    22492263                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22502264                        typedefTable.leaveScope();
    2251                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addType( $1 );
    2252                 }
    2253         | type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2265                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addType( $1 );
     2266                }
     2267        | type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22542268                {
    22552269                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22562270                        typedefTable.leaveScope();
    2257                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
     2271                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
    22582272                }
    22592273
    22602274                // Old-style K&R function definition with "implicit int" type_specifier, OBSOLESCENT (see 4)
    2261         | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2275        | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22622276                {
    22632277                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22642278                        typedefTable.leaveScope();
    2265                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
    2266                 }
    2267         | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2279                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
     2280                }
     2281        | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22682282                {
    22692283                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22702284                        typedefTable.leaveScope();
    2271                         $$ = $3->addOldDeclList( $5 )->addFunctionBody( $6 )->addQualifiers( $2 )->addQualifiers( $1 );
     2285                        $$ = $3->addOldDeclList( $5 )->addFunctionBody( $7 )->addQualifiers( $2 )->addQualifiers( $1 );
    22722286                }
    22732287        ;
     
    23322346        | TYPEGENname
    23332347        | CONST
    2334                 { $$ = Token{ new string( "__const__" ) }; }
     2348                { $$ = Token{ new string( "__const__" ), { nullptr, -1 } }; }
    23352349        ;
    23362350
     
    23872401variable_ptr:
    23882402        ptrref_operator variable_declarator
    2389                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2403                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    23902404        | ptrref_operator type_qualifier_list variable_declarator
    2391                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2405                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    23922406        | '(' variable_ptr ')' attribute_list_opt
    23932407                { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     
    24352449function_ptr:
    24362450        ptrref_operator function_declarator
    2437                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2451                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    24382452        | ptrref_operator type_qualifier_list function_declarator
    2439                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2453                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    24402454        | '(' function_ptr ')'
    24412455                { $$ = $2; }
     
    24752489KR_function_ptr:
    24762490        ptrref_operator KR_function_declarator
    2477                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2491                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    24782492        | ptrref_operator type_qualifier_list KR_function_declarator
    2479                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2493                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    24802494        | '(' KR_function_ptr ')'
    24812495                { $$ = $2; }
     
    25192533type_ptr:
    25202534        ptrref_operator variable_type_redeclarator
    2521                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2535                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    25222536        | ptrref_operator type_qualifier_list variable_type_redeclarator
    2523                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2537                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    25242538        | '(' type_ptr ')' attribute_list_opt
    25252539                { $$ = $2->addQualifiers( $4 ); }
     
    25632577identifier_parameter_ptr:
    25642578        ptrref_operator identifier_parameter_declarator
    2565                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2579                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    25662580        | ptrref_operator type_qualifier_list identifier_parameter_declarator
    2567                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2581                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    25682582        | '(' identifier_parameter_ptr ')' attribute_list_opt
    25692583                { $$ = $2->addQualifiers( $4 ); }
     
    26232637type_parameter_ptr:
    26242638        ptrref_operator type_parameter_redeclarator
    2625                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2639                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    26262640        | ptrref_operator type_qualifier_list type_parameter_redeclarator
    2627                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2641                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    26282642        | '(' type_parameter_ptr ')' attribute_list_opt
    26292643                { $$ = $2->addQualifiers( $4 ); }
     
    26662680abstract_ptr:
    26672681        ptrref_operator
    2668                 { $$ = DeclarationNode::newPointer( 0, $1 ); }
     2682                { $$ = DeclarationNode::newPointer( 0 ); }
    26692683        | ptrref_operator type_qualifier_list
    2670                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2684                { $$ = DeclarationNode::newPointer( $2 ); }
    26712685        | ptrref_operator abstract_declarator
    2672                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2686                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    26732687        | ptrref_operator type_qualifier_list abstract_declarator
    2674                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2688                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    26752689        | '(' abstract_ptr ')' attribute_list_opt
    26762690                { $$ = $2->addQualifiers( $4 ); }
     
    27552769abstract_parameter_ptr:
    27562770        ptrref_operator
    2757                 { $$ = DeclarationNode::newPointer( nullptr, $1 ); }
     2771                { $$ = DeclarationNode::newPointer( nullptr ); }
    27582772        | ptrref_operator type_qualifier_list
    2759                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2773                { $$ = DeclarationNode::newPointer( $2 ); }
    27602774        | ptrref_operator abstract_parameter_declarator
    2761                 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
     2775                { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }
    27622776        | ptrref_operator type_qualifier_list abstract_parameter_declarator
    2763                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2777                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    27642778        | '(' abstract_parameter_ptr ')' attribute_list_opt
    27652779                { $$ = $2->addQualifiers( $4 ); }
     
    28342848variable_abstract_ptr:
    28352849        ptrref_operator
    2836                 { $$ = DeclarationNode::newPointer( 0, $1 ); }
     2850                { $$ = DeclarationNode::newPointer( 0 ); }
    28372851        | ptrref_operator type_qualifier_list
    2838                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2852                { $$ = DeclarationNode::newPointer( $2 ); }
    28392853        | ptrref_operator variable_abstract_declarator
    2840                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2854                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    28412855        | ptrref_operator type_qualifier_list variable_abstract_declarator
    2842                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2856                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    28432857        | '(' variable_abstract_ptr ')' attribute_list_opt
    28442858                { $$ = $2->addQualifiers( $4 ); }
     
    28802894                // No SUE declaration in parameter list.
    28812895        ptrref_operator type_specifier_nobody
    2882                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2896                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    28832897        | type_qualifier_list ptrref_operator type_specifier_nobody
    2884                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2898                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    28852899        | ptrref_operator cfa_abstract_function
    2886                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2900                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    28872901        | type_qualifier_list ptrref_operator cfa_abstract_function
    2888                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2902                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    28892903        | ptrref_operator cfa_identifier_parameter_declarator_tuple
    2890                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2904                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    28912905        | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple
    2892                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2906                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    28932907        ;
    28942908
     
    29682982cfa_abstract_ptr:                                                                               // CFA
    29692983        ptrref_operator type_specifier
    2970                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2984                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29712985        | type_qualifier_list ptrref_operator type_specifier
    2972                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2986                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29732987        | ptrref_operator cfa_abstract_function
    2974                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2988                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29752989        | type_qualifier_list ptrref_operator cfa_abstract_function
    2976                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2990                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29772991        | ptrref_operator cfa_abstract_declarator_tuple
    2978                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2992                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29792993        | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple
    2980                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2994                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29812995        ;
    29822996
Note: See TracChangeset for help on using the changeset viewer.