Changes in src/Parser/parser.yy [ca78437:dc2b4d6]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
rca78437 rdc2b4d6 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // cfa.y --7 // parser.yy -- 8 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Ju n 12 12:59:00 201713 // Update Count : 24 0211 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Jul 17 12:17:00 2017 13 // Update Count : 2455 14 14 // 15 15 … … 48 48 #include <cstdio> 49 49 #include <stack> 50 #include "lex.h"51 #include "parser.h"52 50 #include "ParseNode.h" 53 51 #include "TypedefTable.h" … … 88 86 bool forall = false; // aggregate have one or more forall qualifiers ? 89 87 %} 88 89 // Types declaration 90 %union 91 { 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 } 90 108 91 109 //************************* TERMINAL TOKENS ******************************** … … 111 129 %token ATTRIBUTE EXTENSION // GCC 112 130 %token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN 113 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT // CFA131 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH // CFA 114 132 %token ASM // C99, extension ISO/IEC 9899:1999 Section J.5.10(1) 115 133 %token ALIGNAS ALIGNOF GENERIC STATICASSERT // C11 … … 133 151 %token ELLIPSIS // ... 134 152 135 %token MULTassign DIVassign MODassign // *= /= %=/153 %token EXPassign MULTassign DIVassign MODassign // \= *= /= %= 136 154 %token PLUSassign MINUSassign // += -= 137 155 %token LSassign RSassign // <<= >>= … … 139 157 140 158 %token ATassign // @= 141 142 // Types declaration143 %union144 {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 }160 159 161 160 %type<tok> identifier no_attr_identifier zero_one … … 169 168 %type<op> ptrref_operator unary_operator assignment_operator 170 169 %type<en> primary_expression postfix_expression unary_expression 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 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 175 175 %type<en> comma_expression comma_expression_opt 176 %type<en> argument_expression_list argument_expression assignment_opt176 %type<en> argument_expression_list argument_expression default_initialize_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 exception_statement asm_statement 187 %type<sn> iteration_statement jump_statement 188 %type<sn> with_statement exception_statement asm_statement 188 189 %type<sn> fall_through_opt fall_through 189 190 %type<sn> statement statement_list 190 191 %type<sn> block_item_list block_item 191 %type<sn> case_clause192 %type<sn> with_clause_opt 192 193 %type<en> case_value 193 %type<sn> case_ value_list case_label case_label_list194 %type<sn> case_clause case_value_list case_label case_label_list 194 195 %type<sn> switch_clause_list_opt switch_clause_list choose_clause_list_opt choose_clause_list 195 196 %type<sn> /* handler_list */ handler_clause finally_clause 197 %type<catch_kind> handler_key 196 198 197 199 // declarations … … 572 574 ; 573 575 576 exponential_expression: 577 cast_expression 578 | exponential_expression '\\' cast_expression 579 { $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); } 580 ; 581 574 582 multiplicative_expression: 575 cast_expression576 | multiplicative_expression '*' cast_expression583 exponential_expression 584 | multiplicative_expression '*' exponential_expression 577 585 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); } 578 | multiplicative_expression '/' cast_expression586 | multiplicative_expression '/' exponential_expression 579 587 { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); } 580 | multiplicative_expression '%' cast_expression588 | multiplicative_expression '%' exponential_expression 581 589 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); } 582 590 ; … … 677 685 '=' { $$ = OperKinds::Assign; } 678 686 | ATassign { $$ = OperKinds::AtAssn; } 687 | EXPassign { $$ = OperKinds::ExpAssn; } 679 688 | MULTassign { $$ = OperKinds::MulAssn; } 680 689 | DIVassign { $$ = OperKinds::DivAssn; } … … 729 738 | iteration_statement 730 739 | jump_statement 740 | with_statement 731 741 | exception_statement 732 742 | asm_statement … … 936 946 ; 937 947 948 with_statement: 949 WITH '(' tuple_expression_list ')' compound_statement 950 { $$ = (StatementNode *)0; } // FIX ME 951 ; 952 938 953 exception_statement: 939 954 TRY compound_statement handler_clause … … 959 974 960 975 handler_clause: 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 ) ) ); } 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; } 969 998 ; 970 999 … … 1651 1680 | aggregate_key attribute_list_opt typegen_name // CFA 1652 1681 { $$ = $3->addQualifiers( $2 ); } 1682 1683 // Temp, testing TreeStruct 1684 | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name 1685 { 1686 typedefTable.makeTypedef( *$4 ); // create typedef 1687 if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $ 1688 forall = false; // reset 1689 } 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 TYPEDEFname 1696 { 1697 typedefTable.makeTypedef( *$4 ); // create typedef 1698 if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $ 1699 forall = false; // reset 1700 } 1701 '{' field_declaration_list '}' 1702 { 1703 $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct, 1704 $4, $5, nullptr, $8, true )->addQualifiers( $3 ); 1705 } 1653 1706 ; 1654 1707 … … 1829 1882 cfa_parameter_declaration: // CFA, new & old style parameter declaration 1830 1883 parameter_declaration 1831 | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt1884 | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt 1832 1885 { $$ = $1->addName( $2 ); } 1833 | cfa_abstract_tuple identifier_or_type_name assignment_opt1886 | cfa_abstract_tuple identifier_or_type_name default_initialize_opt 1834 1887 // To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator). 1835 1888 { $$ = $1->addName( $2 ); } 1836 | type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt1889 | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt 1837 1890 { $$ = $2->addName( $3 )->addQualifiers( $1 ); } 1838 1891 | cfa_function_specifier … … 1851 1904 parameter_declaration: 1852 1905 // No SUE declaration in parameter list. 1853 declaration_specifier_nobody identifier_parameter_declarator assignment_opt1906 declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt 1854 1907 { 1855 1908 typedefTable.addToEnclosingScope( TypedefTable::ID ); 1856 1909 $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); 1857 1910 } 1858 | declaration_specifier_nobody type_parameter_redeclarator assignment_opt1911 | declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt 1859 1912 { 1860 1913 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 1864 1917 1865 1918 abstract_parameter_declaration: 1866 declaration_specifier_nobody assignment_opt1919 declaration_specifier_nobody default_initialize_opt 1867 1920 { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); } 1868 | declaration_specifier_nobody abstract_parameter_declarator assignment_opt1921 | declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt 1869 1922 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); } 1870 1923 ; … … 2167 2220 { 2168 2221 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" 2169 linkage = LinkageSpec::linkage Check($2 );2222 linkage = LinkageSpec::linkageUpdate( linkage, $2 ); 2170 2223 } 2171 2224 '{' external_definition_list_opt '}' … … 2203 2256 ; 2204 2257 2258 with_clause_opt: 2259 // empty 2260 { $$ = (StatementNode *)0; } // FIX ME 2261 | WITH '(' tuple_expression_list ')' 2262 { $$ = (StatementNode *)0; } // FIX ME 2263 ; 2264 2205 2265 function_definition: 2206 cfa_function_declaration compound_statement// CFA2266 cfa_function_declaration with_clause_opt compound_statement // CFA 2207 2267 { 2208 2268 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2209 2269 typedefTable.leaveScope(); 2210 $$ = $1->addFunctionBody( $ 2);2211 } 2212 | declaration_specifier function_declarator compound_statement2270 $$ = $1->addFunctionBody( $3 ); 2271 } 2272 | declaration_specifier function_declarator with_clause_opt compound_statement 2213 2273 { 2214 2274 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2215 2275 typedefTable.leaveScope(); 2216 $$ = $2->addFunctionBody( $ 3)->addType( $1 );2217 } 2218 | type_qualifier_list function_declarator compound_statement2276 $$ = $2->addFunctionBody( $4 )->addType( $1 ); 2277 } 2278 | type_qualifier_list function_declarator with_clause_opt compound_statement 2219 2279 { 2220 2280 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2221 2281 typedefTable.leaveScope(); 2222 $$ = $2->addFunctionBody( $ 3)->addQualifiers( $1 );2223 } 2224 | declaration_qualifier_list function_declarator compound_statement2282 $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 ); 2283 } 2284 | declaration_qualifier_list function_declarator with_clause_opt compound_statement 2225 2285 { 2226 2286 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2227 2287 typedefTable.leaveScope(); 2228 $$ = $2->addFunctionBody( $ 3)->addQualifiers( $1 );2229 } 2230 | declaration_qualifier_list type_qualifier_list function_declarator compound_statement2288 $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 ); 2289 } 2290 | declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement 2231 2291 { 2232 2292 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2233 2293 typedefTable.leaveScope(); 2234 $$ = $3->addFunctionBody( $ 4)->addQualifiers( $2 )->addQualifiers( $1 );2294 $$ = $3->addFunctionBody( $5 )->addQualifiers( $2 )->addQualifiers( $1 ); 2235 2295 } 2236 2296 2237 2297 // Old-style K&R function definition, OBSOLESCENT (see 4) 2238 | declaration_specifier KR_function_declarator push KR_declaration_list_opt compound_statement2298 | declaration_specifier KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement 2239 2299 { 2240 2300 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2241 2301 typedefTable.leaveScope(); 2242 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 5)->addType( $1 );2243 } 2244 | type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement2302 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addType( $1 ); 2303 } 2304 | type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement 2245 2305 { 2246 2306 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2247 2307 typedefTable.leaveScope(); 2248 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 5)->addQualifiers( $1 );2308 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 ); 2249 2309 } 2250 2310 2251 2311 // Old-style K&R function definition with "implicit int" type_specifier, OBSOLESCENT (see 4) 2252 | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement2312 | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement 2253 2313 { 2254 2314 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2255 2315 typedefTable.leaveScope(); 2256 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 5)->addQualifiers( $1 );2257 } 2258 | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement2316 $$ = $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_opt compound_statement 2259 2319 { 2260 2320 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2261 2321 typedefTable.leaveScope(); 2262 $$ = $3->addOldDeclList( $5 )->addFunctionBody( $ 6)->addQualifiers( $2 )->addQualifiers( $1 );2322 $$ = $3->addOldDeclList( $5 )->addFunctionBody( $7 )->addQualifiers( $2 )->addQualifiers( $1 ); 2263 2323 } 2264 2324 ; … … 2323 2383 | TYPEGENname 2324 2384 | CONST 2325 { $$ = Token{ new string( "__const__" ) }; }2385 { $$ = Token{ new string( "__const__" ), { nullptr, -1 } }; } 2326 2386 ; 2327 2387 … … 3022 3082 ; 3023 3083 3024 assignment_opt:3084 default_initialize_opt: 3025 3085 // empty 3026 3086 { $$ = nullptr; }
Note:
See TracChangeset
for help on using the changeset viewer.