Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r1efa1e1 r135b431  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Aug 23 21:08:08 2017
    13 // Update Count     : 2704
     12// Last Modified On : Wed Aug 23 14:53:20 2017
     13// Update Count     : 2702
    1414//
    1515
     
    9797        DeclarationNode::TypeClass tclass;
    9898        StatementNode * sn;
     99        WaitForStmt * wfs;
    99100        ConstantExpr * constant;
    100101        IfCtl * ifctl;
     
    119120%token RESTRICT                                                                                 // C99
    120121%token ATOMIC                                                                                   // C11
    121 %token FORALL MUTEX VIRTUAL                                             // CFA
     122%token FORALL LVALUE MUTEX VIRTUAL                                              // CFA
    122123%token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
    123124%token BOOL COMPLEX IMAGINARY                                                   // C99
     
    187188%type<flag> asm_volatile_opt
    188189%type<en> handler_predicate_opt
     190%type<en> when_clause_opt timeout
    189191
    190192// statements
     
    192194%type<sn> iteration_statement                   jump_statement
    193195%type<sn> with_statement                                exception_statement                     asm_statement
    194 %type<sn> when_clause_opt                               waitfor_statement                       waitfor_clause                          waitfor                         timeout
     196%type<sn> waitfor_statement
    195197%type<sn> fall_through_opt                              fall_through
    196198%type<sn> statement                                             statement_list
     
    202204%type<sn> handler_clause                                finally_clause
    203205%type<catch_kind> handler_key
     206%type<wfs> waitfor_clause
     207%type<en> waitfor
    204208
    205209// declarations
     
    303307// Similar issues exit with the waitfor statement.
    304308
    305 // Order of these lines matters (low-to-high precedence). THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left
    306 // associative over TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE.
     309// Order of these lines matters. THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left associative over
     310// TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE.
    307311%precedence THEN        // rule precedence for IF/WAITFOR statement
    308312%precedence WOR         // token precedence for start of WOR in WAITFOR statement
     
    565569        | '&'                                                                           { $$ = OperKinds::AddressOf; }
    566570                // GCC, address of label must be handled by semantic check for ref,ref,label
    567         | ANDAND                                                                        { $$ = OperKinds::And; }
     571//      | ANDAND                                                                        { $$ = OperKinds::And; }
    568572        ;
    569573
     
    687691        conditional_expression
    688692        | unary_expression assignment_operator assignment_expression
    689                 { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
     693                { $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); }
    690694        ;
    691695
     
    979983when_clause_opt:
    980984        // empty
    981                 { $$ = nullptr; }                                                               // FIX ME
     985                { $$ = nullptr; }
    982986        | WHEN '(' comma_expression ')'
    983                 { $$ = nullptr; }                                                               // FIX ME
     987                { $$ = $3; }
    984988        ;
    985989
    986990waitfor:
    987991        WAITFOR '(' identifier ')'
    988                 { $$ = nullptr; }                                                               // FIX ME
     992                {
     993                        $$ = new ExpressionNode( new NameExpr( *$3 ) );
     994                        delete $3;
     995                }
    989996        | WAITFOR '(' identifier ',' argument_expression_list ')'
    990                 { $$ = nullptr; }                                                               // FIX ME
     997                {
     998                        $$ = new ExpressionNode( new NameExpr( *$3 ) );
     999                        $$->set_last( $5 );
     1000                        delete $3;
     1001                }
    9911002        ;
    9921003
    9931004timeout:
    9941005        TIMEOUT '(' comma_expression ')'
    995                 { $$ = nullptr; }                                                               // FIX ME
     1006                { $$ = $3; }
    9961007        ;
    9971008
    9981009waitfor_clause:
    9991010        when_clause_opt waitfor statement %prec THEN
    1000                 { $$ = nullptr; }                                                               // FIX ME
     1011                { $$ = build_waitfor( $2, $3, $1 ); }
    10011012        | when_clause_opt waitfor statement WOR waitfor_clause
    1002                 { $$ = nullptr; }                                                               // FIX ME
     1013                { $$ = build_waitfor( $2, $3, $1, $5 ); }
    10031014        | when_clause_opt timeout statement %prec THEN
    1004                 { $$ = nullptr; }                                                               // FIX ME
     1015                { $$ = build_waitfor_timeout( $2, $3, $1 ); }
    10051016        | when_clause_opt ELSE statement
    1006                 { $$ = nullptr; }                                                               // FIX ME
     1017                { $$ = build_waitfor_timeout( nullptr, $3, $1 ); }
    10071018        | when_clause_opt timeout statement WOR when_clause_opt ELSE statement
    1008                 { $$ = nullptr; }                                                               // FIX ME
     1019                { $$ = build_waitfor_timeout( $2, $3, $1, $7, $5 ); }
    10091020        ;
    10101021
    10111022waitfor_statement:
    10121023        when_clause_opt waitfor statement %prec THEN
    1013                 { $$ = nullptr; }                                                               // FIX ME
     1024                { $$ = new StatementNode( build_waitfor( $2, $3, $1 ) ); }
    10141025        | when_clause_opt waitfor statement WOR waitfor_clause
    1015                 { $$ = nullptr; }                                                               // FIX ME
     1026                { $$ = new StatementNode( build_waitfor( $2, $3, $1, $5 ) ); }
    10161027        ;
    10171028
     
    14831494        | VOLATILE
    14841495                { $$ = DeclarationNode::newTypeQualifier( Type::Volatile ); }
     1496        | LVALUE                                                                                        // CFA
     1497                { $$ = DeclarationNode::newTypeQualifier( Type::Lvalue ); }
    14851498        | MUTEX
    14861499                { $$ = DeclarationNode::newTypeQualifier( Type::Mutex ); }
     
    24642477variable_ptr:
    24652478        ptrref_operator variable_declarator
    2466                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2479                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    24672480        | ptrref_operator type_qualifier_list variable_declarator
    2468                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2481                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    24692482        | '(' variable_ptr ')' attribute_list_opt
    24702483                { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     
    25122525function_ptr:
    25132526        ptrref_operator function_declarator
    2514                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2527                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    25152528        | ptrref_operator type_qualifier_list function_declarator
    2516                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2529                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    25172530        | '(' function_ptr ')'
    25182531                { $$ = $2; }
     
    25522565KR_function_ptr:
    25532566        ptrref_operator KR_function_declarator
    2554                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2567                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    25552568        | ptrref_operator type_qualifier_list KR_function_declarator
    2556                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2569                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    25572570        | '(' KR_function_ptr ')'
    25582571                { $$ = $2; }
     
    25962609type_ptr:
    25972610        ptrref_operator variable_type_redeclarator
    2598                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2611                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    25992612        | ptrref_operator type_qualifier_list variable_type_redeclarator
    2600                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2613                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    26012614        | '(' type_ptr ')' attribute_list_opt
    26022615                { $$ = $2->addQualifiers( $4 ); }
     
    26402653identifier_parameter_ptr:
    26412654        ptrref_operator identifier_parameter_declarator
    2642                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2655                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    26432656        | ptrref_operator type_qualifier_list identifier_parameter_declarator
    2644                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2657                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    26452658        | '(' identifier_parameter_ptr ')' attribute_list_opt
    26462659                { $$ = $2->addQualifiers( $4 ); }
     
    27002713type_parameter_ptr:
    27012714        ptrref_operator type_parameter_redeclarator
    2702                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2715                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    27032716        | ptrref_operator type_qualifier_list type_parameter_redeclarator
    2704                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2717                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    27052718        | '(' type_parameter_ptr ')' attribute_list_opt
    27062719                { $$ = $2->addQualifiers( $4 ); }
     
    27432756abstract_ptr:
    27442757        ptrref_operator
    2745                 { $$ = DeclarationNode::newPointer( 0, $1 ); }
     2758                { $$ = DeclarationNode::newPointer( 0 ); }
    27462759        | ptrref_operator type_qualifier_list
    2747                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2760                { $$ = DeclarationNode::newPointer( $2 ); }
    27482761        | ptrref_operator abstract_declarator
    2749                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2762                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    27502763        | ptrref_operator type_qualifier_list abstract_declarator
    2751                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2764                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    27522765        | '(' abstract_ptr ')' attribute_list_opt
    27532766                { $$ = $2->addQualifiers( $4 ); }
     
    28322845abstract_parameter_ptr:
    28332846        ptrref_operator
    2834                 { $$ = DeclarationNode::newPointer( nullptr, $1 ); }
     2847                { $$ = DeclarationNode::newPointer( nullptr ); }
    28352848        | ptrref_operator type_qualifier_list
    2836                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2849                { $$ = DeclarationNode::newPointer( $2 ); }
    28372850        | ptrref_operator abstract_parameter_declarator
    2838                 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
     2851                { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }
    28392852        | ptrref_operator type_qualifier_list abstract_parameter_declarator
    2840                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2853                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    28412854        | '(' abstract_parameter_ptr ')' attribute_list_opt
    28422855                { $$ = $2->addQualifiers( $4 ); }
     
    29112924variable_abstract_ptr:
    29122925        ptrref_operator
    2913                 { $$ = DeclarationNode::newPointer( 0, $1 ); }
     2926                { $$ = DeclarationNode::newPointer( 0 ); }
    29142927        | ptrref_operator type_qualifier_list
    2915                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2928                { $$ = DeclarationNode::newPointer( $2 ); }
    29162929        | ptrref_operator variable_abstract_declarator
    2917                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2930                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    29182931        | ptrref_operator type_qualifier_list variable_abstract_declarator
    2919                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2932                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    29202933        | '(' variable_abstract_ptr ')' attribute_list_opt
    29212934                { $$ = $2->addQualifiers( $4 ); }
     
    29572970                // No SUE declaration in parameter list.
    29582971        ptrref_operator type_specifier_nobody
    2959                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2972                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29602973        | type_qualifier_list ptrref_operator type_specifier_nobody
    2961                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2974                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29622975        | ptrref_operator cfa_abstract_function
    2963                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2976                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29642977        | type_qualifier_list ptrref_operator cfa_abstract_function
    2965                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2978                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29662979        | ptrref_operator cfa_identifier_parameter_declarator_tuple
    2967                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2980                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29682981        | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple
    2969                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2982                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29702983        ;
    29712984
     
    30453058cfa_abstract_ptr:                                                                               // CFA
    30463059        ptrref_operator type_specifier
    3047                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     3060                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    30483061        | type_qualifier_list ptrref_operator type_specifier
    3049                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     3062                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    30503063        | ptrref_operator cfa_abstract_function
    3051                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     3064                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    30523065        | type_qualifier_list ptrref_operator cfa_abstract_function
    3053                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     3066                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    30543067        | ptrref_operator cfa_abstract_declarator_tuple
    3055                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     3068                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    30563069        | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple
    3057                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     3070                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    30583071        ;
    30593072
Note: See TracChangeset for help on using the changeset viewer.