Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r9bd6105 r135b431  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Aug 26 17:50:19 2017
    13 // Update Count     : 2712
     12// Last Modified On : Wed Aug 23 14:53:20 2017
     13// Update Count     : 2702
    1414//
    1515
     
    120120%token RESTRICT                                                                                 // C99
    121121%token ATOMIC                                                                                   // C11
    122 %token FORALL MUTEX VIRTUAL                                                             // CFA
     122%token FORALL LVALUE 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
    190191
    191192// statements
    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
     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
    196201%type<en> case_value
    197202%type<sn> case_clause                                   case_value_list                         case_label                                      case_label_list
    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
     203%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
     204%type<sn> handler_clause                                finally_clause
    203205%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
    207208
    208209// declarations
     
    306307// Similar issues exit with the waitfor statement.
    307308
    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.
     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.
    310311%precedence THEN        // rule precedence for IF/WAITFOR statement
    311312%precedence WOR         // token precedence for start of WOR in WAITFOR statement
     
    568569        | '&'                                                                           { $$ = OperKinds::AddressOf; }
    569570                // GCC, address of label must be handled by semantic check for ref,ref,label
    570         | ANDAND                                                                        { $$ = OperKinds::And; }
     571//      | ANDAND                                                                        { $$ = OperKinds::And; }
    571572        ;
    572573
     
    690691        conditional_expression
    691692        | unary_expression assignment_operator assignment_expression
    692                 { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
     693                { $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); }
    693694        ;
    694695
     
    776777          push push
    777778          local_label_declaration_opt                                           // GCC, local labels
    778           statement_decl_list                                                           // C99, intermix declarations and statements
     779          block_item_list                                                                       // C99, intermix declarations and statements
    779780          pop '}'
    780781                { $$ = new StatementNode( build_compound( $5 ) ); }
    781782        ;
    782783
    783 statement_decl_list:                                                                    // C99
    784         statement_decl
    785         | statement_decl_list push statement_decl
     784block_item_list:                                                                                // C99
     785        block_item
     786        | block_item_list push block_item
    786787                { if ( $1 != 0 ) { $1->set_last( $3 ); $$ = $1; } }
    787788        ;
    788789
    789 statement_decl:
     790block_item:
    790791        declaration                                                                                     // CFA, new & old style declarations
    791792                { $$ = new StatementNode( $1 ); }
     
    805806        ;
    806807
    807 statement_list_nodecl:
     808statement_list:
    808809        statement
    809         | statement_list_nodecl statement
     810        | statement_list statement
    810811                { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
    811812        ;
     
    817818
    818819selection_statement:
    819         IF '(' push if_control_expression ')' statement         %prec THEN
     820        IF '(' push if_control_expression ')' statement                         %prec THEN
    820821                // explicitly deal with the shift/reduce conflict on if/else
    821822                { $$ = new StatementNode( build_if( $4, $6, nullptr ) ); }
     
    892893
    893894switch_clause_list:                                                                             // CFA
    894         case_label_list statement_list_nodecl
     895        case_label_list statement_list
    895896                { $$ = $1->append_last_case( new StatementNode( build_compound( $2 ) ) ); }
    896         | switch_clause_list case_label_list statement_list_nodecl
     897        | switch_clause_list case_label_list statement_list
    897898                { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( $3 ) ) ) ) ); }
    898899        ;
     
    907908        case_label_list fall_through
    908909                { $$ = $1->append_last_case( $2 ); }
    909         | case_label_list statement_list_nodecl fall_through_opt
     910        | case_label_list statement_list fall_through_opt
    910911                { $$ = $1->append_last_case( new StatementNode( build_compound( (StatementNode *)$2->set_last( $3 ) ) ) ); }
    911912        | choose_clause_list case_label_list fall_through
    912913                { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); }
    913         | choose_clause_list case_label_list statement_list_nodecl fall_through_opt
     914        | choose_clause_list case_label_list statement_list fall_through_opt
    914915                { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( (StatementNode *)$3->set_last( $4 ) ) ) ) ) ); }
    915916        ;
     
    980981        ;
    981982
    982 when_clause:
    983         WHEN '(' comma_expression ')'
    984                 { $$ = $3; }
    985         ;
    986 
    987983when_clause_opt:
    988984        // empty
    989985                { $$ = nullptr; }
    990         | when_clause
     986        | WHEN '(' comma_expression ')'
     987                { $$ = $3; }
    991988        ;
    992989
     
    10111008
    10121009waitfor_clause:
    1013         when_clause_opt waitfor statement                                       %prec THEN
     1010        when_clause_opt waitfor statement %prec THEN
    10141011                { $$ = build_waitfor( $2, $3, $1 ); }
    10151012        | when_clause_opt waitfor statement WOR waitfor_clause
    10161013                { $$ = build_waitfor( $2, $3, $1, $5 ); }
    1017         | when_clause_opt timeout statement                                     %prec THEN
     1014        | when_clause_opt timeout statement %prec THEN
    10181015                { $$ = build_waitfor_timeout( $2, $3, $1 ); }
    10191016        | when_clause_opt ELSE statement
    10201017                { $$ = build_waitfor_timeout( nullptr, $3, $1 ); }
    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
     1018        | when_clause_opt timeout statement WOR when_clause_opt ELSE statement
    10231019                { $$ = build_waitfor_timeout( $2, $3, $1, $7, $5 ); }
    10241020        ;
    10251021
    10261022waitfor_statement:
    1027         when_clause_opt waitfor statement                                       %prec THEN
     1023        when_clause_opt waitfor statement %prec THEN
    10281024                { $$ = new StatementNode( build_waitfor( $2, $3, $1 ) ); }
    10291025        | when_clause_opt waitfor statement WOR waitfor_clause
     
    14981494        | VOLATILE
    14991495                { $$ = DeclarationNode::newTypeQualifier( Type::Volatile ); }
     1496        | LVALUE                                                                                        // CFA
     1497                { $$ = DeclarationNode::newTypeQualifier( Type::Lvalue ); }
    15001498        | MUTEX
    15011499                { $$ = DeclarationNode::newTypeQualifier( Type::Mutex ); }
     
    24792477variable_ptr:
    24802478        ptrref_operator variable_declarator
    2481                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2479                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    24822480        | ptrref_operator type_qualifier_list variable_declarator
    2483                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2481                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    24842482        | '(' variable_ptr ')' attribute_list_opt
    24852483                { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     
    25272525function_ptr:
    25282526        ptrref_operator function_declarator
    2529                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2527                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    25302528        | ptrref_operator type_qualifier_list function_declarator
    2531                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2529                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    25322530        | '(' function_ptr ')'
    25332531                { $$ = $2; }
     
    25672565KR_function_ptr:
    25682566        ptrref_operator KR_function_declarator
    2569                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2567                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    25702568        | ptrref_operator type_qualifier_list KR_function_declarator
    2571                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2569                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    25722570        | '(' KR_function_ptr ')'
    25732571                { $$ = $2; }
     
    26112609type_ptr:
    26122610        ptrref_operator variable_type_redeclarator
    2613                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2611                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    26142612        | ptrref_operator type_qualifier_list variable_type_redeclarator
    2615                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2613                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    26162614        | '(' type_ptr ')' attribute_list_opt
    26172615                { $$ = $2->addQualifiers( $4 ); }
     
    26552653identifier_parameter_ptr:
    26562654        ptrref_operator identifier_parameter_declarator
    2657                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2655                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    26582656        | ptrref_operator type_qualifier_list identifier_parameter_declarator
    2659                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2657                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    26602658        | '(' identifier_parameter_ptr ')' attribute_list_opt
    26612659                { $$ = $2->addQualifiers( $4 ); }
     
    27152713type_parameter_ptr:
    27162714        ptrref_operator type_parameter_redeclarator
    2717                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2715                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    27182716        | ptrref_operator type_qualifier_list type_parameter_redeclarator
    2719                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2717                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    27202718        | '(' type_parameter_ptr ')' attribute_list_opt
    27212719                { $$ = $2->addQualifiers( $4 ); }
     
    27582756abstract_ptr:
    27592757        ptrref_operator
    2760                 { $$ = DeclarationNode::newPointer( 0, $1 ); }
     2758                { $$ = DeclarationNode::newPointer( 0 ); }
    27612759        | ptrref_operator type_qualifier_list
    2762                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2760                { $$ = DeclarationNode::newPointer( $2 ); }
    27632761        | ptrref_operator abstract_declarator
    2764                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2762                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    27652763        | ptrref_operator type_qualifier_list abstract_declarator
    2766                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2764                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    27672765        | '(' abstract_ptr ')' attribute_list_opt
    27682766                { $$ = $2->addQualifiers( $4 ); }
     
    28472845abstract_parameter_ptr:
    28482846        ptrref_operator
    2849                 { $$ = DeclarationNode::newPointer( nullptr, $1 ); }
     2847                { $$ = DeclarationNode::newPointer( nullptr ); }
    28502848        | ptrref_operator type_qualifier_list
    2851                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2849                { $$ = DeclarationNode::newPointer( $2 ); }
    28522850        | ptrref_operator abstract_parameter_declarator
    2853                 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
     2851                { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }
    28542852        | ptrref_operator type_qualifier_list abstract_parameter_declarator
    2855                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2853                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    28562854        | '(' abstract_parameter_ptr ')' attribute_list_opt
    28572855                { $$ = $2->addQualifiers( $4 ); }
     
    29262924variable_abstract_ptr:
    29272925        ptrref_operator
    2928                 { $$ = DeclarationNode::newPointer( 0, $1 ); }
     2926                { $$ = DeclarationNode::newPointer( 0 ); }
    29292927        | ptrref_operator type_qualifier_list
    2930                 { $$ = DeclarationNode::newPointer( $2, $1 ); }
     2928                { $$ = DeclarationNode::newPointer( $2 ); }
    29312929        | ptrref_operator variable_abstract_declarator
    2932                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2930                { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
    29332931        | ptrref_operator type_qualifier_list variable_abstract_declarator
    2934                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
     2932                { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
    29352933        | '(' variable_abstract_ptr ')' attribute_list_opt
    29362934                { $$ = $2->addQualifiers( $4 ); }
     
    29722970                // No SUE declaration in parameter list.
    29732971        ptrref_operator type_specifier_nobody
    2974                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2972                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29752973        | type_qualifier_list ptrref_operator type_specifier_nobody
    2976                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2974                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29772975        | ptrref_operator cfa_abstract_function
    2978                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2976                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29792977        | type_qualifier_list ptrref_operator cfa_abstract_function
    2980                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2978                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29812979        | ptrref_operator cfa_identifier_parameter_declarator_tuple
    2982                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     2980                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    29832981        | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple
    2984                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     2982                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    29852983        ;
    29862984
     
    30603058cfa_abstract_ptr:                                                                               // CFA
    30613059        ptrref_operator type_specifier
    3062                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     3060                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    30633061        | type_qualifier_list ptrref_operator type_specifier
    3064                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     3062                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    30653063        | ptrref_operator cfa_abstract_function
    3066                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     3064                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    30673065        | type_qualifier_list ptrref_operator cfa_abstract_function
    3068                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     3066                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    30693067        | ptrref_operator cfa_abstract_declarator_tuple
    3070                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
     3068                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    30713069        | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple
    3072                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
     3070                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    30733071        ;
    30743072
Note: See TracChangeset for help on using the changeset viewer.