Changes in src/Parser/parser.yy [dc2b4d6:ca78437]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
rdc2b4d6 rca78437 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // parser.yy --7 // cfa.y -- 8 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 // Last Modified By : Andrew Beach12 // Last Modified On : Mon Ju l 17 12:17:00 201713 // Update Count : 24 5511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jun 12 12:59:00 2017 13 // Update Count : 2402 14 14 // 15 15 … … 48 48 #include <cstdio> 49 49 #include <stack> 50 #include "lex.h" 51 #include "parser.h" 50 52 #include "ParseNode.h" 51 53 #include "TypedefTable.h" … … 86 88 bool forall = false; // aggregate have one or more forall qualifiers ? 87 89 %} 88 89 // Types declaration90 %union91 {92 Token tok;93 ParseNode * pn;94 ExpressionNode * en;95 DeclarationNode * decl;96 DeclarationNode::Aggregate aggKey;97 DeclarationNode::TypeClass tclass;98 StatementNode * sn;99 ConstantExpr * constant;100 ForCtl * fctl;101 LabelNode * label;102 InitializerNode * in;103 OperKinds op;104 std::string * str;105 bool flag;106 CatchStmt::Kind catch_kind;107 }108 90 109 91 //************************* TERMINAL TOKENS ******************************** … … 129 111 %token ATTRIBUTE EXTENSION // GCC 130 112 %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 WITH// CFA113 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT // CFA 132 114 %token ASM // C99, extension ISO/IEC 9899:1999 Section J.5.10(1) 133 115 %token ALIGNAS ALIGNOF GENERIC STATICASSERT // C11 … … 151 133 %token ELLIPSIS // ... 152 134 153 %token EXPassign MULTassign DIVassign MODassign // \= *= /= %=135 %token MULTassign DIVassign MODassign // *= /= %=/ 154 136 %token PLUSassign MINUSassign // += -= 155 137 %token LSassign RSassign // <<= >>= … … 157 139 158 140 %token ATassign // @= 141 142 // Types declaration 143 %union 144 { 145 Token tok; 146 ParseNode * pn; 147 ExpressionNode * en; 148 DeclarationNode * decl; 149 DeclarationNode::Aggregate aggKey; 150 DeclarationNode::TypeClass tclass; 151 StatementNode * sn; 152 ConstantExpr * constant; 153 ForCtl * fctl; 154 LabelNode * label; 155 InitializerNode * in; 156 OperKinds op; 157 std::string * str; 158 bool flag; 159 } 159 160 160 161 %type<tok> identifier no_attr_identifier zero_one … … 168 169 %type<op> ptrref_operator unary_operator assignment_operator 169 170 %type<en> primary_expression postfix_expression unary_expression 170 %type<en> cast_expression exponential_expression multiplicative_expression additive_expression 171 %type<en> shift_expression relational_expression equality_expression 172 %type<en> AND_expression exclusive_OR_expression inclusive_OR_expression 173 %type<en> logical_AND_expression logical_OR_expression 174 %type<en> conditional_expression constant_expression assignment_expression assignment_expression_opt 171 %type<en> cast_expression multiplicative_expression additive_expression shift_expression 172 %type<en> relational_expression equality_expression AND_expression exclusive_OR_expression 173 %type<en> inclusive_OR_expression logical_AND_expression logical_OR_expression conditional_expression 174 %type<en> constant_expression assignment_expression assignment_expression_opt 175 175 %type<en> comma_expression comma_expression_opt 176 %type<en> argument_expression_list argument_expression default_initialize_opt176 %type<en> argument_expression_list argument_expression assignment_opt 177 177 %type<fctl> for_control_expression 178 178 %type<en> subrange … … 185 185 // statements 186 186 %type<sn> labeled_statement compound_statement expression_statement selection_statement 187 %type<sn> iteration_statement jump_statement 188 %type<sn> with_statement exception_statement asm_statement 187 %type<sn> iteration_statement jump_statement exception_statement asm_statement 189 188 %type<sn> fall_through_opt fall_through 190 189 %type<sn> statement statement_list 191 190 %type<sn> block_item_list block_item 192 %type<sn> with_clause_opt191 %type<sn> case_clause 193 192 %type<en> case_value 194 %type<sn> case_ clause case_value_list case_label case_label_list193 %type<sn> case_value_list case_label case_label_list 195 194 %type<sn> switch_clause_list_opt switch_clause_list choose_clause_list_opt choose_clause_list 196 195 %type<sn> /* handler_list */ handler_clause finally_clause 197 %type<catch_kind> handler_key198 196 199 197 // declarations … … 574 572 ; 575 573 576 exponential_expression:574 multiplicative_expression: 577 575 cast_expression 578 | exponential_expression '\\' cast_expression 579 { $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); } 580 ; 581 582 multiplicative_expression: 583 exponential_expression 584 | multiplicative_expression '*' exponential_expression 576 | multiplicative_expression '*' cast_expression 585 577 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); } 586 | multiplicative_expression '/' exponential_expression578 | multiplicative_expression '/' cast_expression 587 579 { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); } 588 | multiplicative_expression '%' exponential_expression580 | multiplicative_expression '%' cast_expression 589 581 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); } 590 582 ; … … 685 677 '=' { $$ = OperKinds::Assign; } 686 678 | ATassign { $$ = OperKinds::AtAssn; } 687 | EXPassign { $$ = OperKinds::ExpAssn; }688 679 | MULTassign { $$ = OperKinds::MulAssn; } 689 680 | DIVassign { $$ = OperKinds::DivAssn; } … … 738 729 | iteration_statement 739 730 | jump_statement 740 | with_statement741 731 | exception_statement 742 732 | asm_statement … … 946 936 ; 947 937 948 with_statement:949 WITH '(' tuple_expression_list ')' compound_statement950 { $$ = (StatementNode *)0; } // FIX ME951 ;952 953 938 exception_statement: 954 939 TRY compound_statement handler_clause … … 974 959 975 960 handler_clause: 976 // TEMPORARY, TEST EXCEPTIONS 977 handler_key '(' push push INTEGERconstant pop ')' compound_statement pop 978 { $$ = new StatementNode( build_catch( $1, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); } 979 | handler_clause handler_key '(' push push INTEGERconstant pop ')' compound_statement pop 980 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); } 981 982 | handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop 983 { $$ = new StatementNode( build_catch( $1, $5, nullptr, $9 ) ); } 984 | handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop 985 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $10 ) ) ); } 986 ; 987 988 handler_predicate_opt: 989 //empty 990 | ';' conditional_expression 991 ; 992 993 handler_key: 994 CATCH 995 { $$ = CatchStmt::Terminate; } 996 | CATCHRESUME 997 { $$ = CatchStmt::Resume; } 961 CATCH '(' push push exception_declaration pop ')' compound_statement pop 962 { $$ = new StatementNode( build_catch( CatchStmt::Terminate, $5, nullptr, $8 ) ); } 963 | handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop 964 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Terminate, $6, nullptr, $9 ) ) ); } 965 | CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop 966 { $$ = new StatementNode( build_catch( CatchStmt::Resume, $5, nullptr, $8 ) ); } 967 | handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop 968 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Resume, $6, nullptr, $9 ) ) ); } 998 969 ; 999 970 … … 1680 1651 | aggregate_key attribute_list_opt typegen_name // CFA 1681 1652 { $$ = $3->addQualifiers( $2 ); } 1682 1683 // Temp, testing TreeStruct1684 | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name1685 {1686 typedefTable.makeTypedef( *$4 ); // create typedef1687 if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $1688 forall = false; // reset1689 }1690 '{' field_declaration_list '}'1691 {1692 $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,1693 $4, nullptr, nullptr, $7, true )->addQualifiers( $3 );1694 }1695 | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name TYPEDEFname1696 {1697 typedefTable.makeTypedef( *$4 ); // create typedef1698 if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $1699 forall = false; // reset1700 }1701 '{' field_declaration_list '}'1702 {1703 $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,1704 $4, $5, nullptr, $8, true )->addQualifiers( $3 );1705 }1706 1653 ; 1707 1654 … … 1882 1829 cfa_parameter_declaration: // CFA, new & old style parameter declaration 1883 1830 parameter_declaration 1884 | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt1831 | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt 1885 1832 { $$ = $1->addName( $2 ); } 1886 | cfa_abstract_tuple identifier_or_type_name default_initialize_opt1833 | cfa_abstract_tuple identifier_or_type_name assignment_opt 1887 1834 // To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator). 1888 1835 { $$ = $1->addName( $2 ); } 1889 | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt1836 | type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt 1890 1837 { $$ = $2->addName( $3 )->addQualifiers( $1 ); } 1891 1838 | cfa_function_specifier … … 1904 1851 parameter_declaration: 1905 1852 // No SUE declaration in parameter list. 1906 declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt1853 declaration_specifier_nobody identifier_parameter_declarator assignment_opt 1907 1854 { 1908 1855 typedefTable.addToEnclosingScope( TypedefTable::ID ); 1909 1856 $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); 1910 1857 } 1911 | declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt1858 | declaration_specifier_nobody type_parameter_redeclarator assignment_opt 1912 1859 { 1913 1860 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 1917 1864 1918 1865 abstract_parameter_declaration: 1919 declaration_specifier_nobody default_initialize_opt1866 declaration_specifier_nobody assignment_opt 1920 1867 { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); } 1921 | declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt1868 | declaration_specifier_nobody abstract_parameter_declarator assignment_opt 1922 1869 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); } 1923 1870 ; … … 2220 2167 { 2221 2168 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" 2222 linkage = LinkageSpec::linkage Update( linkage,$2 );2169 linkage = LinkageSpec::linkageCheck( $2 ); 2223 2170 } 2224 2171 '{' external_definition_list_opt '}' … … 2256 2203 ; 2257 2204 2258 with_clause_opt:2259 // empty2260 { $$ = (StatementNode *)0; } // FIX ME2261 | WITH '(' tuple_expression_list ')'2262 { $$ = (StatementNode *)0; } // FIX ME2263 ;2264 2265 2205 function_definition: 2266 cfa_function_declaration with_clause_opt compound_statement// CFA2206 cfa_function_declaration compound_statement // CFA 2267 2207 { 2268 2208 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2269 2209 typedefTable.leaveScope(); 2270 $$ = $1->addFunctionBody( $ 3);2271 } 2272 | declaration_specifier function_declarator with_clause_optcompound_statement2210 $$ = $1->addFunctionBody( $2 ); 2211 } 2212 | declaration_specifier function_declarator compound_statement 2273 2213 { 2274 2214 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2275 2215 typedefTable.leaveScope(); 2276 $$ = $2->addFunctionBody( $ 4)->addType( $1 );2277 } 2278 | type_qualifier_list function_declarator with_clause_optcompound_statement2216 $$ = $2->addFunctionBody( $3 )->addType( $1 ); 2217 } 2218 | type_qualifier_list function_declarator compound_statement 2279 2219 { 2280 2220 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2281 2221 typedefTable.leaveScope(); 2282 $$ = $2->addFunctionBody( $ 4)->addQualifiers( $1 );2283 } 2284 | declaration_qualifier_list function_declarator with_clause_optcompound_statement2222 $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 ); 2223 } 2224 | declaration_qualifier_list function_declarator compound_statement 2285 2225 { 2286 2226 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2287 2227 typedefTable.leaveScope(); 2288 $$ = $2->addFunctionBody( $ 4)->addQualifiers( $1 );2289 } 2290 | declaration_qualifier_list type_qualifier_list function_declarator with_clause_optcompound_statement2228 $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 ); 2229 } 2230 | declaration_qualifier_list type_qualifier_list function_declarator compound_statement 2291 2231 { 2292 2232 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2293 2233 typedefTable.leaveScope(); 2294 $$ = $3->addFunctionBody( $ 5)->addQualifiers( $2 )->addQualifiers( $1 );2234 $$ = $3->addFunctionBody( $4 )->addQualifiers( $2 )->addQualifiers( $1 ); 2295 2235 } 2296 2236 2297 2237 // Old-style K&R function definition, OBSOLESCENT (see 4) 2298 | declaration_specifier KR_function_declarator push KR_declaration_list_opt with_clause_optcompound_statement2238 | declaration_specifier KR_function_declarator push KR_declaration_list_opt compound_statement 2299 2239 { 2300 2240 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2301 2241 typedefTable.leaveScope(); 2302 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 6)->addType( $1 );2303 } 2304 | type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_optcompound_statement2242 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addType( $1 ); 2243 } 2244 | type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement 2305 2245 { 2306 2246 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2307 2247 typedefTable.leaveScope(); 2308 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 6)->addQualifiers( $1 );2248 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 ); 2309 2249 } 2310 2250 2311 2251 // Old-style K&R function definition with "implicit int" type_specifier, OBSOLESCENT (see 4) 2312 | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_optcompound_statement2252 | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement 2313 2253 { 2314 2254 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2315 2255 typedefTable.leaveScope(); 2316 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 6)->addQualifiers( $1 );2317 } 2318 | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_optcompound_statement2256 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 ); 2257 } 2258 | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement 2319 2259 { 2320 2260 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2321 2261 typedefTable.leaveScope(); 2322 $$ = $3->addOldDeclList( $5 )->addFunctionBody( $ 7)->addQualifiers( $2 )->addQualifiers( $1 );2262 $$ = $3->addOldDeclList( $5 )->addFunctionBody( $6 )->addQualifiers( $2 )->addQualifiers( $1 ); 2323 2263 } 2324 2264 ; … … 2383 2323 | TYPEGENname 2384 2324 | CONST 2385 { $$ = Token{ new string( "__const__" ) , { nullptr, -1 }}; }2325 { $$ = Token{ new string( "__const__" ) }; } 2386 2326 ; 2387 2327 … … 3082 3022 ; 3083 3023 3084 default_initialize_opt:3024 assignment_opt: 3085 3025 // empty 3086 3026 { $$ = nullptr; }
Note:
See TracChangeset
for help on using the changeset viewer.