Changes in src/Parser/parser.yy [135b431:9bd6105]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r135b431 r9bd6105 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Aug 23 14:53:20201713 // Update Count : 27 0212 // Last Modified On : Sat Aug 26 17:50:19 2017 13 // Update Count : 2712 14 14 // 15 15 … … 120 120 %token RESTRICT // C99 121 121 %token ATOMIC // C11 122 %token FORALL LVALUE MUTEX VIRTUAL// CFA122 %token FORALL MUTEX VIRTUAL // CFA 123 123 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED 124 124 %token BOOL COMPLEX IMAGINARY // C99 … … 188 188 %type<flag> asm_volatile_opt 189 189 %type<en> handler_predicate_opt 190 %type<en> when_clause_opt timeout191 190 192 191 // 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 201 196 %type<en> case_value 202 197 %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 205 203 %type<catch_kind> handler_key 204 %type<en> when_clause when_clause_opt waitfor timeout 205 %type<sn> waitfor_statement 206 206 %type<wfs> waitfor_clause 207 %type<en> waitfor208 207 209 208 // declarations … … 307 306 // Similar issues exit with the waitfor statement. 308 307 309 // Order of these lines matters . THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left associative over310 // 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. 311 310 %precedence THEN // rule precedence for IF/WAITFOR statement 312 311 %precedence WOR // token precedence for start of WOR in WAITFOR statement … … 569 568 | '&' { $$ = OperKinds::AddressOf; } 570 569 // GCC, address of label must be handled by semantic check for ref,ref,label 571 //| ANDAND { $$ = OperKinds::And; }570 | ANDAND { $$ = OperKinds::And; } 572 571 ; 573 572 … … 691 690 conditional_expression 692 691 | unary_expression assignment_operator assignment_expression 693 { $$ = new ExpressionNode( build_binary_ ptr( $2, $1, $3 ) ); }692 { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); } 694 693 ; 695 694 … … 777 776 push push 778 777 local_label_declaration_opt // GCC, local labels 779 block_item_list// C99, intermix declarations and statements778 statement_decl_list // C99, intermix declarations and statements 780 779 pop '}' 781 780 { $$ = new StatementNode( build_compound( $5 ) ); } 782 781 ; 783 782 784 block_item_list:// C99785 block_item786 | block_item_list push block_item783 statement_decl_list: // C99 784 statement_decl 785 | statement_decl_list push statement_decl 787 786 { if ( $1 != 0 ) { $1->set_last( $3 ); $$ = $1; } } 788 787 ; 789 788 790 block_item:789 statement_decl: 791 790 declaration // CFA, new & old style declarations 792 791 { $$ = new StatementNode( $1 ); } … … 806 805 ; 807 806 808 statement_list :807 statement_list_nodecl: 809 808 statement 810 | statement_list statement809 | statement_list_nodecl statement 811 810 { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } } 812 811 ; … … 818 817 819 818 selection_statement: 820 IF '(' push if_control_expression ')' statement %prec THEN819 IF '(' push if_control_expression ')' statement %prec THEN 821 820 // explicitly deal with the shift/reduce conflict on if/else 822 821 { $$ = new StatementNode( build_if( $4, $6, nullptr ) ); } … … 893 892 894 893 switch_clause_list: // CFA 895 case_label_list statement_list 894 case_label_list statement_list_nodecl 896 895 { $$ = $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 898 897 { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( $3 ) ) ) ) ); } 899 898 ; … … 908 907 case_label_list fall_through 909 908 { $$ = $1->append_last_case( $2 ); } 910 | case_label_list statement_list fall_through_opt909 | case_label_list statement_list_nodecl fall_through_opt 911 910 { $$ = $1->append_last_case( new StatementNode( build_compound( (StatementNode *)$2->set_last( $3 ) ) ) ); } 912 911 | choose_clause_list case_label_list fall_through 913 912 { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); } 914 | choose_clause_list case_label_list statement_list fall_through_opt913 | choose_clause_list case_label_list statement_list_nodecl fall_through_opt 915 914 { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( (StatementNode *)$3->set_last( $4 ) ) ) ) ) ); } 916 915 ; … … 981 980 ; 982 981 982 when_clause: 983 WHEN '(' comma_expression ')' 984 { $$ = $3; } 985 ; 986 983 987 when_clause_opt: 984 988 // empty 985 989 { $$ = nullptr; } 986 | WHEN '(' comma_expression ')' 987 { $$ = $3; } 990 | when_clause 988 991 ; 989 992 … … 1008 1011 1009 1012 waitfor_clause: 1010 when_clause_opt waitfor statement %prec THEN1013 when_clause_opt waitfor statement %prec THEN 1011 1014 { $$ = build_waitfor( $2, $3, $1 ); } 1012 1015 | when_clause_opt waitfor statement WOR waitfor_clause 1013 1016 { $$ = build_waitfor( $2, $3, $1, $5 ); } 1014 | when_clause_opt timeout statement %prec THEN1017 | when_clause_opt timeout statement %prec THEN 1015 1018 { $$ = build_waitfor_timeout( $2, $3, $1 ); } 1016 1019 | when_clause_opt ELSE statement 1017 1020 { $$ = 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 1019 1023 { $$ = build_waitfor_timeout( $2, $3, $1, $7, $5 ); } 1020 1024 ; 1021 1025 1022 1026 waitfor_statement: 1023 when_clause_opt waitfor statement %prec THEN1027 when_clause_opt waitfor statement %prec THEN 1024 1028 { $$ = new StatementNode( build_waitfor( $2, $3, $1 ) ); } 1025 1029 | when_clause_opt waitfor statement WOR waitfor_clause … … 1494 1498 | VOLATILE 1495 1499 { $$ = DeclarationNode::newTypeQualifier( Type::Volatile ); } 1496 | LVALUE // CFA1497 { $$ = DeclarationNode::newTypeQualifier( Type::Lvalue ); }1498 1500 | MUTEX 1499 1501 { $$ = DeclarationNode::newTypeQualifier( Type::Mutex ); } … … 2477 2479 variable_ptr: 2478 2480 ptrref_operator variable_declarator 2479 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2481 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2480 2482 | ptrref_operator type_qualifier_list variable_declarator 2481 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2483 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2482 2484 | '(' variable_ptr ')' attribute_list_opt 2483 2485 { $$ = $2->addQualifiers( $4 ); } // redundant parenthesis … … 2525 2527 function_ptr: 2526 2528 ptrref_operator function_declarator 2527 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2529 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2528 2530 | ptrref_operator type_qualifier_list function_declarator 2529 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2531 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2530 2532 | '(' function_ptr ')' 2531 2533 { $$ = $2; } … … 2565 2567 KR_function_ptr: 2566 2568 ptrref_operator KR_function_declarator 2567 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2569 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2568 2570 | ptrref_operator type_qualifier_list KR_function_declarator 2569 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2571 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2570 2572 | '(' KR_function_ptr ')' 2571 2573 { $$ = $2; } … … 2609 2611 type_ptr: 2610 2612 ptrref_operator variable_type_redeclarator 2611 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2613 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2612 2614 | ptrref_operator type_qualifier_list variable_type_redeclarator 2613 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2615 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2614 2616 | '(' type_ptr ')' attribute_list_opt 2615 2617 { $$ = $2->addQualifiers( $4 ); } … … 2653 2655 identifier_parameter_ptr: 2654 2656 ptrref_operator identifier_parameter_declarator 2655 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2657 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2656 2658 | ptrref_operator type_qualifier_list identifier_parameter_declarator 2657 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2659 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2658 2660 | '(' identifier_parameter_ptr ')' attribute_list_opt 2659 2661 { $$ = $2->addQualifiers( $4 ); } … … 2713 2715 type_parameter_ptr: 2714 2716 ptrref_operator type_parameter_redeclarator 2715 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2717 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2716 2718 | ptrref_operator type_qualifier_list type_parameter_redeclarator 2717 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2719 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2718 2720 | '(' type_parameter_ptr ')' attribute_list_opt 2719 2721 { $$ = $2->addQualifiers( $4 ); } … … 2756 2758 abstract_ptr: 2757 2759 ptrref_operator 2758 { $$ = DeclarationNode::newPointer( 0 ); }2760 { $$ = DeclarationNode::newPointer( 0, $1 ); } 2759 2761 | ptrref_operator type_qualifier_list 2760 { $$ = DeclarationNode::newPointer( $2 ); }2762 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2761 2763 | ptrref_operator abstract_declarator 2762 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2764 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2763 2765 | ptrref_operator type_qualifier_list abstract_declarator 2764 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2766 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2765 2767 | '(' abstract_ptr ')' attribute_list_opt 2766 2768 { $$ = $2->addQualifiers( $4 ); } … … 2845 2847 abstract_parameter_ptr: 2846 2848 ptrref_operator 2847 { $$ = DeclarationNode::newPointer( nullptr ); }2849 { $$ = DeclarationNode::newPointer( nullptr, $1 ); } 2848 2850 | ptrref_operator type_qualifier_list 2849 { $$ = DeclarationNode::newPointer( $2 ); }2851 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2850 2852 | ptrref_operator abstract_parameter_declarator 2851 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }2853 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); } 2852 2854 | ptrref_operator type_qualifier_list abstract_parameter_declarator 2853 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2855 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2854 2856 | '(' abstract_parameter_ptr ')' attribute_list_opt 2855 2857 { $$ = $2->addQualifiers( $4 ); } … … 2924 2926 variable_abstract_ptr: 2925 2927 ptrref_operator 2926 { $$ = DeclarationNode::newPointer( 0 ); }2928 { $$ = DeclarationNode::newPointer( 0, $1 ); } 2927 2929 | ptrref_operator type_qualifier_list 2928 { $$ = DeclarationNode::newPointer( $2 ); }2930 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2929 2931 | ptrref_operator variable_abstract_declarator 2930 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2932 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2931 2933 | ptrref_operator type_qualifier_list variable_abstract_declarator 2932 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2934 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2933 2935 | '(' variable_abstract_ptr ')' attribute_list_opt 2934 2936 { $$ = $2->addQualifiers( $4 ); } … … 2970 2972 // No SUE declaration in parameter list. 2971 2973 ptrref_operator type_specifier_nobody 2972 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2974 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2973 2975 | type_qualifier_list ptrref_operator type_specifier_nobody 2974 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2976 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2975 2977 | ptrref_operator cfa_abstract_function 2976 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2978 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2977 2979 | type_qualifier_list ptrref_operator cfa_abstract_function 2978 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2980 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2979 2981 | ptrref_operator cfa_identifier_parameter_declarator_tuple 2980 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2982 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2981 2983 | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple 2982 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2984 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2983 2985 ; 2984 2986 … … 3058 3060 cfa_abstract_ptr: // CFA 3059 3061 ptrref_operator type_specifier 3060 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }3062 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 3061 3063 | type_qualifier_list ptrref_operator type_specifier 3062 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }3064 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 3063 3065 | ptrref_operator cfa_abstract_function 3064 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }3066 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 3065 3067 | type_qualifier_list ptrref_operator cfa_abstract_function 3066 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }3068 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 3067 3069 | ptrref_operator cfa_abstract_declarator_tuple 3068 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }3070 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 3069 3071 | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple 3070 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }3072 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 3071 3073 ; 3072 3074
Note:
See TracChangeset
for help on using the changeset viewer.