Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r135b431 r9bd6105  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Aug 23 14:53:20 2017
    13 // Update Count     : 2702
     12// Last Modified On : Sat Aug 26 17:50:19 2017
     13// Update Count     : 2712
    1414//
    1515
     
    120120%token RESTRICT                                                                                 // C99
    121121%token ATOMIC                                                                                   // C11
    122 %token FORALL LVALUE MUTEX VIRTUAL                                              // CFA
     122%token FORALL MUTEX VIRTUAL                                                             // CFA
    123123%token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
    124124%token BOOL COMPLEX IMAGINARY                                                   // C99
     
    188188%type<flag> asm_volatile_opt
    189189%type<en> handler_predicate_opt
    190 %type<en> when_clause_opt timeout
    191190
    192191// statements
    193 %type<sn> labeled_statement                             compound_statement                      expression_statement            selection_statement
    194 %type<sn> iteration_statement                   jump_statement
    195 %type<sn> with_statement                                exception_statement                     asm_statement
    196 %type<sn> waitfor_statement
    197 %type<sn> fall_through_opt                              fall_through
    198 %type<sn> statement                                             statement_list
    199 %type<sn> block_item_list                               block_item
    200 %type<sn> with_clause_opt
     192%type<sn> statement                                             labeled_statement                       compound_statement
     193%type<sn> statement_decl                                statement_decl_list                     statement_list_nodecl
     194%type<sn> selection_statement
     195%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    201196%type<en> case_value
    202197%type<sn> case_clause                                   case_value_list                         case_label                                      case_label_list
    203 %type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    204 %type<sn> handler_clause                                finally_clause
     198%type<sn> fall_through                                  fall_through_opt
     199%type<sn> iteration_statement                   jump_statement
     200%type<sn> expression_statement                  asm_statement
     201%type<sn> with_statement                                with_clause_opt
     202%type<sn> exception_statement                   handler_clause                          finally_clause
    205203%type<catch_kind> handler_key
     204%type<en> when_clause                                   when_clause_opt                         waitfor                                         timeout
     205%type<sn> waitfor_statement
    206206%type<wfs> waitfor_clause
    207 %type<en> waitfor
    208207
    209208// declarations
     
    307306// Similar issues exit with the waitfor statement.
    308307
    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.
     308// Order of these lines matters (low-to-high precedence). THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left
     309// associative over TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE.
    311310%precedence THEN        // rule precedence for IF/WAITFOR statement
    312311%precedence WOR         // token precedence for start of WOR in WAITFOR statement
     
    569568        | '&'                                                                           { $$ = OperKinds::AddressOf; }
    570569                // GCC, address of label must be handled by semantic check for ref,ref,label
    571 //      | ANDAND                                                                        { $$ = OperKinds::And; }
     570        | ANDAND                                                                        { $$ = OperKinds::And; }
    572571        ;
    573572
     
    691690        conditional_expression
    692691        | unary_expression assignment_operator assignment_expression
    693                 { $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); }
     692                { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
    694693        ;
    695694
     
    777776          push push
    778777          local_label_declaration_opt                                           // GCC, local labels
    779           block_item_list                                                                       // C99, intermix declarations and statements
     778          statement_decl_list                                                           // C99, intermix declarations and statements
    780779          pop '}'
    781780                { $$ = new StatementNode( build_compound( $5 ) ); }
    782781        ;
    783782
    784 block_item_list:                                                                                // C99
    785         block_item
    786         | block_item_list push block_item
     783statement_decl_list:                                                                    // C99
     784        statement_decl
     785        | statement_decl_list push statement_decl
    787786                { if ( $1 != 0 ) { $1->set_last( $3 ); $$ = $1; } }
    788787        ;
    789788
    790 block_item:
     789statement_decl:
    791790        declaration                                                                                     // CFA, new & old style declarations
    792791                { $$ = new StatementNode( $1 ); }
     
    806805        ;
    807806
    808 statement_list:
     807statement_list_nodecl:
    809808        statement
    810         | statement_list statement
     809        | statement_list_nodecl statement
    811810                { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
    812811        ;
     
    818817
    819818selection_statement:
    820         IF '(' push if_control_expression ')' statement                         %prec THEN
     819        IF '(' push if_control_expression ')' statement         %prec THEN
    821820                // explicitly deal with the shift/reduce conflict on if/else
    822821                { $$ = new StatementNode( build_if( $4, $6, nullptr ) ); }
     
    893892
    894893switch_clause_list:                                                                             // CFA
    895         case_label_list statement_list
     894        case_label_list statement_list_nodecl
    896895                { $$ = $1->append_last_case( new StatementNode( build_compound( $2 ) ) ); }
    897         | switch_clause_list case_label_list statement_list
     896        | switch_clause_list case_label_list statement_list_nodecl
    898897                { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( $3 ) ) ) ) ); }
    899898        ;
     
    908907        case_label_list fall_through
    909908                { $$ = $1->append_last_case( $2 ); }
    910         | case_label_list statement_list fall_through_opt
     909        | case_label_list statement_list_nodecl fall_through_opt
    911910                { $$ = $1->append_last_case( new StatementNode( build_compound( (StatementNode *)$2->set_last( $3 ) ) ) ); }
    912911        | choose_clause_list case_label_list fall_through
    913912                { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); }
    914         | choose_clause_list case_label_list statement_list fall_through_opt
     913        | choose_clause_list case_label_list statement_list_nodecl fall_through_opt
    915914                { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( (StatementNode *)$3->set_last( $4 ) ) ) ) ) ); }
    916915        ;
     
    981980        ;
    982981
     982when_clause:
     983        WHEN '(' comma_expression ')'
     984                { $$ = $3; }
     985        ;
     986
    983987when_clause_opt:
    984988        // empty
    985989                { $$ = nullptr; }
    986         | WHEN '(' comma_expression ')'
    987                 { $$ = $3; }
     990        | when_clause
    988991        ;
    989992
     
    10081011
    10091012waitfor_clause:
    1010         when_clause_opt waitfor statement %prec THEN
     1013        when_clause_opt waitfor statement                                       %prec THEN
    10111014                { $$ = build_waitfor( $2, $3, $1 ); }
    10121015        | when_clause_opt waitfor statement WOR waitfor_clause
    10131016                { $$ = build_waitfor( $2, $3, $1, $5 ); }
    1014         | when_clause_opt timeout statement %prec THEN
     1017        | when_clause_opt timeout statement                                     %prec THEN
    10151018                { $$ = build_waitfor_timeout( $2, $3, $1 ); }
    10161019        | when_clause_opt ELSE statement
    10171020                { $$ = build_waitfor_timeout( nullptr, $3, $1 ); }
    1018         | when_clause_opt timeout statement WOR when_clause_opt ELSE statement
     1021                // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless)
     1022        | when_clause_opt timeout statement WOR when_clause ELSE statement
    10191023                { $$ = build_waitfor_timeout( $2, $3, $1, $7, $5 ); }
    10201024        ;
    10211025
    10221026waitfor_statement:
    1023         when_clause_opt waitfor statement %prec THEN
     1027        when_clause_opt waitfor statement                                       %prec THEN
    10241028                { $$ = new StatementNode( build_waitfor( $2, $3, $1 ) ); }
    10251029        | when_clause_opt waitfor statement WOR waitfor_clause
     
    14941498        | VOLATILE
    14951499                { $$ = DeclarationNode::newTypeQualifier( Type::Volatile ); }
    1496         | LVALUE                                                                                        // CFA
    1497                 { $$ = DeclarationNode::newTypeQualifier( Type::Lvalue ); }
    14981500        | MUTEX
    14991501                { $$ = DeclarationNode::newTypeQualifier( Type::Mutex ); }
     
    24772479variable_ptr:
    24782480        ptrref_operator variable_declarator
    2479                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2481                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    24802482        | ptrref_operator type_qualifier_list variable_declarator
    2481                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2483                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    24822484        | '(' variable_ptr ')' attribute_list_opt
    24832485                { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     
    25252527function_ptr:
    25262528        ptrref_operator function_declarator
    2527                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2529                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    25282530        | ptrref_operator type_qualifier_list function_declarator
    2529                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2531                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    25302532        | '(' function_ptr ')'
    25312533                { $$ = $2; }
     
    25652567KR_function_ptr:
    25662568        ptrref_operator KR_function_declarator
    2567                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2569                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    25682570        | ptrref_operator type_qualifier_list KR_function_declarator
    2569                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2571                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    25702572        | '(' KR_function_ptr ')'
    25712573                { $$ = $2; }
     
    26092611type_ptr:
    26102612        ptrref_operator variable_type_redeclarator
    2611                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2613                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    26122614        | ptrref_operator type_qualifier_list variable_type_redeclarator
    2613                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2615                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    26142616        | '(' type_ptr ')' attribute_list_opt
    26152617                { $$ = $2->addQualifiers( $4 ); }
     
    26532655identifier_parameter_ptr:
    26542656        ptrref_operator identifier_parameter_declarator
    2655                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2657                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    26562658        | ptrref_operator type_qualifier_list identifier_parameter_declarator
    2657                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2659                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    26582660        | '(' identifier_parameter_ptr ')' attribute_list_opt
    26592661                { $$ = $2->addQualifiers( $4 ); }
     
    27132715type_parameter_ptr:
    27142716        ptrref_operator type_parameter_redeclarator
    2715                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2717                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    27162718        | ptrref_operator type_qualifier_list type_parameter_redeclarator
    2717                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2719                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    27182720        | '(' type_parameter_ptr ')' attribute_list_opt
    27192721                { $$ = $2->addQualifiers( $4 ); }
     
    27562758abstract_ptr:
    27572759        ptrref_operator
    2758                 { $$ = DeclarationNode::newPointer( 0 ); }
     2760                { $$ = DeclarationNode::newPointer( 0, $1 ); }
    27592761        | ptrref_operator type_qualifier_list
    2760                 { $$ = DeclarationNode::newPointer( $2 ); }
     2762                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    27612763        | ptrref_operator abstract_declarator
    2762                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2764                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    27632765        | ptrref_operator type_qualifier_list abstract_declarator
    2764                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2766                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    27652767        | '(' abstract_ptr ')' attribute_list_opt
    27662768                { $$ = $2->addQualifiers( $4 ); }
     
    28452847abstract_parameter_ptr:
    28462848        ptrref_operator
    2847                 { $$ = DeclarationNode::newPointer( nullptr ); }
     2849                { $$ = DeclarationNode::newPointer( nullptr, $1 ); }
    28482850        | ptrref_operator type_qualifier_list
    2849                 { $$ = DeclarationNode::newPointer( $2 ); }
     2851                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    28502852        | ptrref_operator abstract_parameter_declarator
    2851                 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }
     2853                { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
    28522854        | ptrref_operator type_qualifier_list abstract_parameter_declarator
    2853                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2855                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    28542856        | '(' abstract_parameter_ptr ')' attribute_list_opt
    28552857                { $$ = $2->addQualifiers( $4 ); }
     
    29242926variable_abstract_ptr:
    29252927        ptrref_operator
    2926                 { $$ = DeclarationNode::newPointer( 0 ); }
     2928                { $$ = DeclarationNode::newPointer( 0, $1 ); }
    29272929        | ptrref_operator type_qualifier_list
    2928                 { $$ = DeclarationNode::newPointer( $2 ); }
     2930                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    29292931        | ptrref_operator variable_abstract_declarator
    2930                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2932                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29312933        | ptrref_operator type_qualifier_list variable_abstract_declarator
    2932                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2934                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    29332935        | '(' variable_abstract_ptr ')' attribute_list_opt
    29342936                { $$ = $2->addQualifiers( $4 ); }
     
    29702972                // No SUE declaration in parameter list.
    29712973        ptrref_operator type_specifier_nobody
    2972                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2974                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29732975        | type_qualifier_list ptrref_operator type_specifier_nobody
    2974                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2976                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29752977        | ptrref_operator cfa_abstract_function
    2976                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2978                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29772979        | type_qualifier_list ptrref_operator cfa_abstract_function
    2978                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2980                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29792981        | ptrref_operator cfa_identifier_parameter_declarator_tuple
    2980                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2982                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29812983        | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple
    2982                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2984                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29832985        ;
    29842986
     
    30583060cfa_abstract_ptr:                                                                               // CFA
    30593061        ptrref_operator type_specifier
    3060                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     3062                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    30613063        | type_qualifier_list ptrref_operator type_specifier
    3062                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     3064                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    30633065        | ptrref_operator cfa_abstract_function
    3064                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     3066                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    30653067        | type_qualifier_list ptrref_operator cfa_abstract_function
    3066                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     3068                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    30673069        | ptrref_operator cfa_abstract_declarator_tuple
    3068                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     3070                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    30693071        | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple
    3070                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     3072                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    30713073        ;
    30723074
Note: See TracChangeset for help on using the changeset viewer.