Changes in src/Parser/parser.yy [3d56d15b:b048dc3]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (54 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r3d56d15b rb048dc3 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jun 22 13:59:11201813 // Update Count : 3 58612 // Last Modified On : Thu May 24 18:11:59 2018 13 // Update Count : 3369 14 14 // 15 15 … … 136 136 } // build_postfix_name 137 137 138 bool forall = false, xxx = false , yyy = false;// aggregate have one or more forall qualifiers ?138 bool forall = false, xxx = false; // aggregate have one or more forall qualifiers ? 139 139 140 140 // https://www.gnu.org/software/bison/manual/bison.html#Location-Type … … 175 175 bool flag; 176 176 CatchStmt::Kind catch_kind; 177 GenericExpr * genexpr;178 177 } 179 178 … … 260 259 %type<flag> asm_volatile_opt 261 260 %type<en> handler_predicate_opt 262 %type<genexpr> generic_association generic_assoc_list263 261 264 262 // statements 265 263 %type<sn> statement labeled_statement compound_statement 266 264 %type<sn> statement_decl statement_decl_list statement_list_nodecl 267 %type<sn> selection_statement if_statement265 %type<sn> selection_statement 268 266 %type<sn> switch_clause_list_opt switch_clause_list 269 267 %type<en> case_value … … 304 302 %type<en> enumerator_value_opt 305 303 306 %type<decl> external_definition external_definition_list external_definition_list_opt 307 308 %type<decl> exception_declaration 304 %type<decl> exception_declaration external_definition external_definition_list external_definition_list_opt 309 305 310 306 %type<decl> field_declaration field_declaration_list_opt field_declarator_opt field_declaring_list … … 328 324 %type<decl> cfa_identifier_parameter_declarator_tuple cfa_identifier_parameter_ptr 329 325 330 %type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_ ellipsis_list_opt326 %type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_type_list_opt 331 327 332 328 %type<decl> cfa_typedef_declaration cfa_variable_declaration cfa_variable_specifier … … 334 330 %type<decl> c_declaration static_assert 335 331 %type<decl> KR_function_declarator KR_function_no_ptr KR_function_ptr KR_function_array 336 %type<decl> KR_ parameter_list KR_parameter_list_opt332 %type<decl> KR_declaration_list KR_declaration_list_opt 337 333 338 334 %type<decl> parameter_declaration parameter_list parameter_type_list_opt … … 406 402 //************************* Namespace Management ******************************** 407 403 408 // The C grammar is not context free because it relies on the distinct terminal symbols "identifier" and "TYPEDEFname", 409 // which are lexically identical. 410 // 411 // typedef int foo; // identifier foo must now be scanned as TYPEDEFname 412 // foo f; // to allow it to appear in this context 413 // 414 // While it may be possible to write a purely context-free grammar, such a grammar would obscure the relationship 415 // between syntactic and semantic constructs. Cforall compounds this problem by introducing type names local to the 416 // scope of a declaration (for instance, those introduced through "forall" qualifiers), and by introducing "type 417 // generators" -- parameterized types. This latter type name creates a third class of identifiers, "TYPEGENname", which 418 // must be distinguished by the lexical scanner. 419 // 420 // Since the scanner cannot distinguish among the different classes of identifiers without some context information, 421 // there is a type table (typedefTable), which holds type names and identifiers that override type names, for each named 422 // scope. During parsing, semantic actions update the type table by adding new identifiers in the current scope. For 423 // each context that introduces a name scope, a new level is created in the type table and that level is popped on 424 // exiting the scope. Since type names can be local to a particular declaration, each declaration is itself a scope. 425 // This requires distinguishing between type names that are local to the current declaration scope and those that 426 // persist past the end of the declaration (i.e., names defined in "typedef" or "otype" declarations). 427 // 428 // The non-terminals "push" and "pop" denote the opening and closing of named scopes. Every push has a matching pop in 429 // the production rule. There are multiple lists of declarations, where each declaration is a named scope, so pop/push 430 // around the list separator. 431 // 432 // int f( forall(T) T (*f1) T , forall( S ) S (*f2)( S ) ); 433 // push pop push pop 404 // The grammar in the ANSI C standard is not strictly context-free, since it relies upon the distinct terminal symbols 405 // "identifier", "TYPEDEFname", and "TYPEGENname" that are lexically identical. While it is possible to write a purely 406 // context-free grammar, such a grammar would obscure the relationship between syntactic and semantic constructs. 407 // Hence, this grammar uses the ANSI style. 408 // 409 // Cforall compounds this problem by introducing type names local to the scope of a declaration (for instance, those 410 // introduced through "forall" qualifiers), and by introducing "type generators" -- parameterized types. This latter 411 // type name creates a third class of identifiers that must be distinguished by the scanner. 412 // 413 // Since the scanner cannot distinguish among the different classes of identifiers without some context information, it 414 // accesses a data structure (TypedefTable) to allow classification of an identifier that it has just read. Semantic 415 // actions during the parser update this data structure when the class of identifiers change. 416 // 417 // Because the Cforall language is block-scoped, an identifier can change its class in a local scope; it must revert to 418 // its original class at the end of the block. Since type names can be local to a particular declaration, each 419 // declaration is itself a scope. This requires distinguishing between type names that are local to the current 420 // declaration scope and those that persist past the end of the declaration (i.e., names defined in "typedef" or "otype" 421 // declarations). 422 // 423 // The non-terminals "push" and "pop" denote the opening and closing of scopes. Every push must have a matching pop, 424 // although it is regrettable the matching pairs do not always occur within the same rule. These non-terminals may 425 // appear in more contexts than strictly necessary from a semantic point of view. 434 426 435 427 push: … … 505 497 { $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $5 ) ), $2 ) ); } 506 498 | type_name '.' no_attr_identifier // CFA, nested type 507 // { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; } 508 { $$ = nullptr; } 499 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; } 509 500 | type_name '.' '[' field_list ']' // CFA, nested type / tuple field selector 510 // { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; } 511 { $$ = nullptr; } 501 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; } 512 502 | GENERIC '(' assignment_expression ',' generic_assoc_list ')' // C11 513 { 514 // add the missing control expression to the GenericExpr and return it 515 $5->control = maybeMoveBuild<Expression>( $3 ); 516 $$ = new ExpressionNode( $5 ); 517 } 503 { SemanticError( yylloc, "_Generic is currently unimplemented." ); $$ = nullptr; } 518 504 ; 519 505 520 506 generic_assoc_list: // C11 521 generic_association507 | generic_association 522 508 | generic_assoc_list ',' generic_association 523 {524 // steal the association node from the singleton and delete the wrapper525 $1->associations.splice($1->associations.end(), $3->associations);526 delete $3;527 $$ = $1;528 }529 509 ; 530 510 531 511 generic_association: // C11 532 512 type_no_function ':' assignment_expression 533 {534 // create a GenericExpr wrapper with one association pair535 $$ = new GenericExpr( nullptr, { { maybeMoveBuildType($1), maybeMoveBuild<Expression>($3) } } );536 }537 513 | DEFAULT ':' assignment_expression 538 { $$ = new GenericExpr( nullptr, { { maybeMoveBuild<Expression>($3) } } ); }539 514 ; 540 515 … … 648 623 // semantics checks, e.g., ++3, 3--, *3, &&3 649 624 | constant 625 { $$ = $1; } 650 626 | string_literal 651 627 { $$ = new ExpressionNode( $1 ); } … … 859 835 // '[' ']' 860 836 // { $$ = new ExpressionNode( build_tuple() ); } 861 // |'[' push assignment_expression pop ']'837 // '[' push assignment_expression pop ']' 862 838 // { $$ = new ExpressionNode( build_tuple( $3 ) ); } 863 '[' ',' tuple_expression_list']'864 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $ 3) ) ); }865 | '[' push assignment_expression pop ',' tuple_expression_list']'866 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_last( $ 6) ) ); }839 '[' push ',' tuple_expression_list pop ']' 840 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $4 ) ) ); } 841 | '[' push assignment_expression ',' tuple_expression_list pop ']' 842 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_last( $5 ) ) ); } 867 843 ; 868 844 … … 916 892 '{' '}' 917 893 { $$ = new StatementNode( build_compound( (StatementNode *)0 ) ); } 918 | '{' push 894 | '{' 895 // Two scopes are necessary because the block itself has a scope, but every declaration within the block also 896 // requires its own scope. 897 push push 919 898 local_label_declaration_opt // GCC, local labels 920 899 statement_decl_list // C99, intermix declarations and statements 921 900 pop '}' 922 { $$ = new StatementNode( build_compound( $ 4) ); }901 { $$ = new StatementNode( build_compound( $5 ) ); } 923 902 ; 924 903 925 904 statement_decl_list: // C99 926 905 statement_decl 927 | statement_decl_list statement_decl928 { if ( $1 != 0 ) { $1->set_last( $ 2); $$ = $1; } }906 | statement_decl_list push statement_decl 907 { if ( $1 != 0 ) { $1->set_last( $3 ); $$ = $1; } } 929 908 ; 930 909 … … 944 923 $$ = new StatementNode( $2 ); 945 924 } 946 | statement 925 | statement pop 947 926 ; 948 927 … … 959 938 960 939 selection_statement: 961 // pop causes a S/R conflict without separating the IF statement into a non-terminal even after resolving 962 // the inherent S/R conflict with THEN/ELSE. 963 push if_statement pop 964 { $$ = $2; } 940 IF '(' push if_control_expression ')' statement %prec THEN 941 // explicitly deal with the shift/reduce conflict on if/else 942 { $$ = new StatementNode( build_if( $4, $6, nullptr ) ); } 943 | IF '(' push if_control_expression ')' statement ELSE statement 944 { $$ = new StatementNode( build_if( $4, $6, $8 ) ); } 965 945 | SWITCH '(' comma_expression ')' case_clause 966 946 { $$ = new StatementNode( build_switch( true, $3, $5 ) ); } 967 | SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt pop'}' // CFA947 | SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA 968 948 { 969 949 StatementNode *sw = new StatementNode( build_switch( true, $3, $8 ) ); … … 977 957 | CHOOSE '(' comma_expression ')' case_clause // CFA 978 958 { $$ = new StatementNode( build_switch( false, $3, $5 ) ); } 979 | CHOOSE '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt pop'}' // CFA959 | CHOOSE '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA 980 960 { 981 961 StatementNode *sw = new StatementNode( build_switch( false, $3, $8 ) ); … … 984 964 ; 985 965 986 if_statement:987 IF '(' if_control_expression ')' statement %prec THEN988 // explicitly deal with the shift/reduce conflict on if/else989 { $$ = new StatementNode( build_if( $3, $5, nullptr ) ); }990 | IF '(' if_control_expression ')' statement ELSE statement991 { $$ = new StatementNode( build_if( $3, $5, $7 ) ); }992 ;993 994 966 if_control_expression: 995 comma_expression 967 comma_expression pop 996 968 { $$ = new IfCtl( nullptr, $1 ); } 997 | c_declaration // no semi-colon969 | c_declaration pop // no semi-colon 998 970 { $$ = new IfCtl( $1, nullptr ); } 999 | cfa_declaration // no semi-colon971 | cfa_declaration pop // no semi-colon 1000 972 { $$ = new IfCtl( $1, nullptr ); } 1001 973 | declaration comma_expression // semi-colon separated … … 1054 1026 1055 1027 iteration_statement: 1056 WHILE '(' push if_control_expression ')' statement pop1057 { $$ = new StatementNode( build_while( $ 4, $6) ); }1028 WHILE '(' comma_expression ')' statement 1029 { $$ = new StatementNode( build_while( $3, $5 ) ); } 1058 1030 | DO statement WHILE '(' comma_expression ')' ';' 1059 { $$ = new StatementNode( build_ do_while( $5, $2) ); }1060 | FOR '(' push for_control_expression ')' statement pop1031 { $$ = new StatementNode( build_while( $5, $2, true ) ); } 1032 | FOR '(' push for_control_expression ')' statement 1061 1033 { $$ = new StatementNode( build_for( $4, $6 ) ); } 1062 1034 ; 1063 1035 1064 1036 for_control_expression: 1065 comma_expression_opt ';' comma_expression_opt ';' comma_expression_opt1066 { $$ = new ForCtl( $1, $ 3, $5); }1037 comma_expression_opt pop ';' comma_expression_opt ';' comma_expression_opt 1038 { $$ = new ForCtl( $1, $4, $6 ); } 1067 1039 | declaration comma_expression_opt ';' comma_expression_opt // C99 1068 1040 { $$ = new ForCtl( $1, $2, $4 ); } … … 1186 1158 1187 1159 handler_clause: 1188 handler_key '(' push exception_declaration pop handler_predicate_opt ')' compound_statement pop1189 { $$ = new StatementNode( build_catch( $1, $ 4, $6, $8) ); }1190 | handler_clause handler_key '(' push exception_declaration pop handler_predicate_opt ')' compound_statement pop1191 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $ 5, $7, $9) ) ); }1160 handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop 1161 { $$ = new StatementNode( build_catch( $1, $5, $7, $9 ) ); } 1162 | handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop 1163 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, $8, $10 ) ) ); } 1192 1164 ; 1193 1165 … … 1293 1265 1294 1266 declaration_list_opt: // used at beginning of switch statement 1267 pop // empty 1268 { $$ = nullptr; } 1269 | declaration_list 1270 ; 1271 1272 declaration_list: 1273 declaration 1274 | declaration_list push declaration 1275 { $$ = $1->appendList( $3 ); } 1276 ; 1277 1278 KR_declaration_list_opt: // used to declare parameter types in K&R style functions 1295 1279 // empty 1296 1280 { $$ = nullptr; } 1297 | declaration_list 1298 ; 1299 1300 declaration_list: 1301 declaration 1302 | declaration_list declaration 1303 { $$ = $1->appendList( $2 ); } 1304 ; 1305 1306 KR_parameter_list_opt: // used to declare parameter types in K&R style functions 1307 // empty 1308 { $$ = nullptr; } 1309 | KR_parameter_list 1310 ; 1311 1312 KR_parameter_list: 1281 | KR_declaration_list 1282 ; 1283 1284 KR_declaration_list: 1313 1285 push c_declaration pop ';' 1314 1286 { $$ = $2; } 1315 | KR_ parameter_list push c_declaration pop ';'1287 | KR_declaration_list push c_declaration pop ';' 1316 1288 { $$ = $1->appendList( $3 ); } 1317 1289 ; … … 1333 1305 1334 1306 declaration: // old & new style declarations 1335 c_declaration ';'1336 | cfa_declaration ';'// CFA1337 | static_assert // C111307 c_declaration pop ';' 1308 | cfa_declaration pop ';' // CFA 1309 | static_assert 1338 1310 ; 1339 1311 … … 1341 1313 STATICASSERT '(' constant_expression ',' string_literal ')' ';' // C11 1342 1314 { $$ = DeclarationNode::newStaticAssert( $3, $5 ); } 1343 | STATICASSERT '(' constant_expression ')' ';' // CFA1344 { $$ = DeclarationNode::newStaticAssert( $3, build_constantStr( *new string( "\"\"" ) ) ); }1345 1315 1346 1316 // C declaration syntax is notoriously confusing and error prone. Cforall provides its own type, variable and function … … 1387 1357 cfa_function_declaration: // CFA 1388 1358 cfa_function_specifier 1359 { $$ = $1; } 1389 1360 | type_qualifier_list cfa_function_specifier 1390 1361 { $$ = $2->addQualifiers( $1 ); } … … 1393 1364 | declaration_qualifier_list type_qualifier_list cfa_function_specifier 1394 1365 { $$ = $3->addQualifiers( $1 )->addQualifiers( $2 ); } 1395 | cfa_function_declaration ',' identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop')'1366 | cfa_function_declaration ',' identifier_or_type_name '(' cfa_parameter_type_list_opt ')' 1396 1367 { 1397 1368 // Append the return type at the start (left-hand-side) to each identifier in the list. 1398 1369 DeclarationNode * ret = new DeclarationNode; 1399 1370 ret->type = maybeClone( $1->type->base ); 1400 $$ = $1->appendList( DeclarationNode::newFunction( $3, ret, $ 6, nullptr ) );1371 $$ = $1->appendList( DeclarationNode::newFunction( $3, ret, $5, nullptr ) ); 1401 1372 } 1402 1373 ; 1403 1374 1404 1375 cfa_function_specifier: // CFA 1405 // '[' ']' identifier_or_type_name '(' push cfa_parameter_ ellipsis_list_opt pop ')' // S/R conflict1376 // '[' ']' identifier_or_type_name '(' push cfa_parameter_type_list_opt pop ')' // S/R conflict 1406 1377 // { 1407 1378 // $$ = DeclarationNode::newFunction( $3, DeclarationNode::newTuple( 0 ), $6, 0, true ); 1408 1379 // } 1409 // '[' ']' identifier '(' push cfa_parameter_ ellipsis_list_opt pop ')'1380 // '[' ']' identifier '(' push cfa_parameter_type_list_opt pop ')' 1410 1381 // { 1411 1382 // typedefTable.setNextIdentifier( *$5 ); 1412 1383 // $$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, 0, true ); 1413 1384 // } 1414 // | '[' ']' TYPEDEFname '(' push cfa_parameter_ ellipsis_list_opt pop ')'1385 // | '[' ']' TYPEDEFname '(' push cfa_parameter_type_list_opt pop ')' 1415 1386 // { 1416 1387 // typedefTable.setNextIdentifier( *$5 ); … … 1420 1391 // identifier_or_type_name must be broken apart because of the sequence: 1421 1392 // 1422 // '[' ']' identifier_or_type_name '(' cfa_parameter_ ellipsis_list_opt ')'1393 // '[' ']' identifier_or_type_name '(' cfa_parameter_type_list_opt ')' 1423 1394 // '[' ']' type_specifier 1424 1395 // 1425 1396 // type_specifier can resolve to just TYPEDEFname (e.g., typedef int T; int f( T );). Therefore this must be 1426 1397 // flattened to allow lookahead to the '(' without having to reduce identifier_or_type_name. 1427 cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_ ellipsis_list_opt pop ')'1398 cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_type_list_opt pop ')' 1428 1399 // To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator). 1429 1400 { $$ = DeclarationNode::newFunction( $2, $1, $5, 0 ); } 1430 | cfa_function_return identifier_or_type_name '(' push cfa_parameter_ ellipsis_list_opt pop ')'1401 | cfa_function_return identifier_or_type_name '(' push cfa_parameter_type_list_opt pop ')' 1431 1402 { $$ = DeclarationNode::newFunction( $2, $1, $5, 0 ); } 1432 1403 ; … … 1443 1414 TYPEDEF cfa_variable_specifier 1444 1415 { 1445 typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname , "1");1416 typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname ); 1446 1417 $$ = $2->addTypedef(); 1447 1418 } 1448 1419 | TYPEDEF cfa_function_specifier 1449 1420 { 1450 typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname , "2");1421 typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname ); 1451 1422 $$ = $2->addTypedef(); 1452 1423 } 1453 1424 | cfa_typedef_declaration pop ',' push no_attr_identifier 1454 1425 { 1455 typedefTable.addToEnclosingScope( *$5, TYPEDEFname , "3");1426 typedefTable.addToEnclosingScope( *$5, TYPEDEFname ); 1456 1427 $$ = $1->appendList( $1->cloneType( $5 ) ); 1457 1428 } … … 1464 1435 TYPEDEF type_specifier declarator 1465 1436 { 1466 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname , "4");1437 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname ); 1467 1438 $$ = $3->addType( $2 )->addTypedef(); 1468 1439 } 1469 1440 | typedef_declaration pop ',' push declarator 1470 1441 { 1471 typedefTable.addToEnclosingScope( *$5->name, TYPEDEFname , "5");1442 typedefTable.addToEnclosingScope( *$5->name, TYPEDEFname ); 1472 1443 $$ = $1->appendList( $1->cloneBaseType( $5 )->addTypedef() ); 1473 1444 } 1474 1445 | type_qualifier_list TYPEDEF type_specifier declarator // remaining OBSOLESCENT (see 2 ) 1475 1446 { 1476 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname , "6");1447 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname ); 1477 1448 $$ = $4->addType( $3 )->addQualifiers( $1 )->addTypedef(); 1478 1449 } 1479 1450 | type_specifier TYPEDEF declarator 1480 1451 { 1481 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname , "7");1452 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname ); 1482 1453 $$ = $3->addType( $1 )->addTypedef(); 1483 1454 } 1484 1455 | type_specifier TYPEDEF type_qualifier_list declarator 1485 1456 { 1486 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname , "8");1457 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname ); 1487 1458 $$ = $4->addQualifiers( $1 )->addTypedef()->addType( $1 ); 1488 1459 } … … 1611 1582 1612 1583 forall: 1613 FORALL '(' type_parameter_list')' // CFA1614 { $$ = DeclarationNode::newForall( $ 3); }1584 FORALL '(' push type_parameter_list pop ')' // CFA 1585 { $$ = DeclarationNode::newForall( $4 ); } 1615 1586 ; 1616 1587 … … 1794 1765 { $$ = DeclarationNode::newFromTypedef( $1 ); } 1795 1766 | '.' TYPEDEFname 1796 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }1767 { $$ = DeclarationNode::newFromTypedef( $2 ); } // FIX ME 1797 1768 | type_name '.' TYPEDEFname 1798 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }1769 { $$ = DeclarationNode::newFromTypedef( $3 ); } // FIX ME 1799 1770 | typegen_name 1800 1771 | '.' typegen_name 1801 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }1772 { $$ = $2; } // FIX ME 1802 1773 | type_name '.' typegen_name 1803 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }1774 { $$ = $3; } // FIX ME 1804 1775 ; 1805 1776 … … 1823 1794 ; 1824 1795 1825 fred:1826 // empty1827 { yyy = false; }1828 ;1829 1830 1796 aggregate_type: // struct, union 1831 1797 aggregate_key attribute_list_opt '{' field_declaration_list_opt '}' 1832 1798 { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), nullptr, $4, true )->addQualifiers( $2 ); } 1833 | aggregate_key attribute_list_opt no_attr_identifier fred1834 { 1835 typedefTable.makeTypedef( *$3 , forall ? TYPEGENname : TYPEDEFname );// create typedef1836 //if ( forall ) typedefTable.changeKind( *$3, TYPEGENname ); // possibly update1799 | aggregate_key attribute_list_opt no_attr_identifier_or_type_name 1800 { 1801 typedefTable.makeTypedef( *$3 ); // create typedef 1802 if ( forall ) typedefTable.changeKind( *$3, TYPEGENname ); // possibly update 1837 1803 forall = false; // reset 1838 1804 } 1839 1805 '{' field_declaration_list_opt '}' 1840 { $$ = DeclarationNode::newAggregate( $1, $3, nullptr, $7, true )->addQualifiers( $2 ); } 1841 | aggregate_key attribute_list_opt type_name fred 1842 { 1843 typedefTable.makeTypedef( *$3->type->symbolic.name, forall ? TYPEGENname : TYPEDEFname ); // create typedef 1844 //if ( forall ) typedefTable.changeKind( *$3->type->symbolic.name, TYPEGENname ); // possibly update 1845 forall = false; // reset 1846 } 1847 '{' field_declaration_list_opt '}' 1848 { $$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, nullptr, $7, true )->addQualifiers( $2 ); } 1806 { $$ = DeclarationNode::newAggregate( $1, $3, nullptr, $6, true )->addQualifiers( $2 ); } 1849 1807 | aggregate_key attribute_list_opt '(' type_list ')' '{' field_declaration_list_opt '}' // CFA 1850 1808 { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $4, $7, false )->addQualifiers( $2 ); } … … 1853 1811 1854 1812 aggregate_type_nobody: // struct, union - {...} 1855 aggregate_key attribute_list_opt no_attr_identifier fred1856 { 1857 typedefTable.makeTypedef( *$3 , forall ? TYPEGENname : TYPEDEFname);1858 //if ( forall ) typedefTable.changeKind( *$3, TYPEGENname ); // possibly update1813 aggregate_key attribute_list_opt no_attr_identifier 1814 { 1815 typedefTable.makeTypedef( *$3 ); 1816 if ( forall ) typedefTable.changeKind( *$3, TYPEGENname ); // possibly update 1859 1817 forall = false; // reset 1860 1818 $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 ); 1861 1819 } 1862 | aggregate_key attribute_list_opt type_name fred 1820 | aggregate_key attribute_list_opt TYPEDEFname 1821 { 1822 typedefTable.makeTypedef( *$3 ); 1823 $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 ); 1824 } 1825 | aggregate_key attribute_list_opt typegen_name // CFA 1863 1826 { 1864 1827 // Create new generic declaration with same name as previous forward declaration, where the IDENTIFIER is … … 1874 1837 aggregate_key: 1875 1838 STRUCT 1876 { yyy = true;$$ = DeclarationNode::Struct; }1839 { $$ = DeclarationNode::Struct; } 1877 1840 | UNION 1878 { yyy = true;$$ = DeclarationNode::Union; }1841 { $$ = DeclarationNode::Union; } 1879 1842 | EXCEPTION 1880 { yyy = true;$$ = DeclarationNode::Exception; }1843 { $$ = DeclarationNode::Exception; } 1881 1844 | COROUTINE 1882 { yyy = true;$$ = DeclarationNode::Coroutine; }1845 { $$ = DeclarationNode::Coroutine; } 1883 1846 | MONITOR 1884 { yyy = true;$$ = DeclarationNode::Monitor; }1847 { $$ = DeclarationNode::Monitor; } 1885 1848 | THREAD 1886 { yyy = true;$$ = DeclarationNode::Thread; }1849 { $$ = DeclarationNode::Thread; } 1887 1850 ; 1888 1851 … … 1895 1858 1896 1859 field_declaration: 1897 type_specifier field_declaring_list ';' 1898 { $$ = distAttr( $1, $2 ); } 1860 cfa_field_declaring_list ';' // CFA, new style field declaration 1861 | EXTENSION cfa_field_declaring_list ';' // GCC 1862 { 1863 distExt( $2 ); // mark all fields in list 1864 $$ = $2; 1865 } 1866 | type_specifier field_declaring_list ';' 1867 { 1868 $$ = distAttr( $1, $2 ); } 1899 1869 | EXTENSION type_specifier field_declaring_list ';' // GCC 1900 { distExt( $3 ); $$ = distAttr( $2, $3 ); } // mark all fields in list 1901 | typedef_declaration ';' // CFA 1902 { SemanticError( yylloc, "Typedef in aggregate is currently unimplemented." ); $$ = nullptr; } 1903 | cfa_field_declaring_list ';' // CFA, new style field declaration 1904 | EXTENSION cfa_field_declaring_list ';' // GCC 1905 { distExt( $2 ); $$ = $2; } // mark all fields in list 1906 | cfa_typedef_declaration ';' // CFA 1907 { SemanticError( yylloc, "Typedef in aggregate is currently unimplemented." ); $$ = nullptr; } 1908 | static_assert // C11 1870 { 1871 distExt( $3 ); // mark all fields in list 1872 $$ = distAttr( $2, $3 ); 1873 } 1874 | static_assert 1909 1875 ; 1910 1876 … … 1945 1911 { $$ = nullptr; } 1946 1912 | bit_subrange_size 1913 { $$ = $1; } 1947 1914 ; 1948 1915 … … 1955 1922 ENUM attribute_list_opt '{' enumerator_list comma_opt '}' 1956 1923 { $$ = DeclarationNode::newEnum( new string( DeclarationNode::anonymous.newName() ), $4, true )->addQualifiers( $2 ); } 1957 | ENUM attribute_list_opt no_attr_identifier 1924 | ENUM attribute_list_opt no_attr_identifier_or_type_name 1958 1925 { typedefTable.makeTypedef( *$3 ); } 1959 1926 '{' enumerator_list comma_opt '}' 1960 1927 { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); } 1961 | ENUM attribute_list_opt type_name1962 '{' enumerator_list comma_opt '}'1963 { $$ = DeclarationNode::newEnum( $3->type->symbolic.name, $5, true )->addQualifiers( $2 ); }1964 1928 | enum_type_nobody 1965 1929 ; 1966 1930 1967 1931 enum_type_nobody: // enum - {...} 1968 ENUM attribute_list_opt no_attr_identifier 1932 ENUM attribute_list_opt no_attr_identifier_or_type_name 1969 1933 { 1970 1934 typedefTable.makeTypedef( *$3 ); 1971 1935 $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 ); 1972 }1973 | ENUM attribute_list_opt type_name1974 {1975 typedefTable.makeTypedef( *$3->type->symbolic.name );1976 $$ = DeclarationNode::newEnum( $3->type->symbolic.name, 0, false )->addQualifiers( $2 );1977 1936 } 1978 1937 ; … … 1992 1951 ; 1993 1952 1994 cfa_parameter_ ellipsis_list_opt: // CFA, abstract + real1953 cfa_parameter_type_list_opt: // CFA, abstract + real 1995 1954 // empty 1996 1955 { $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); } … … 2125 2084 { $$ = $2; } 2126 2085 | '=' VOID 2127 { $$ = n ew InitializerNode( true ); }2086 { $$ = nullptr; } 2128 2087 | ATassign initializer 2129 2088 { $$ = $2->set_maybeConstructed( false ); } … … 2202 2161 type_parameter_list: // CFA 2203 2162 type_parameter 2163 { $$ = $1; } 2204 2164 | type_parameter_list ',' type_parameter 2205 2165 { $$ = $1->appendList( $3 ); } … … 2215 2175 type_parameter: // CFA 2216 2176 type_class no_attr_identifier_or_type_name 2217 { typedefTable.addTo Scope( *$2, TYPEDEFname, "9"); }2177 { typedefTable.addToEnclosingScope( *$2, TYPEDEFname ); } 2218 2178 type_initializer_opt assertion_list_opt 2219 2179 { $$ = DeclarationNode::newTypeParam( $1, $2 )->addTypeInitializer( $4 )->addAssertions( $5 ); } … … 2249 2209 '|' no_attr_identifier_or_type_name '(' type_list ')' 2250 2210 { $$ = DeclarationNode::newTraitUse( $2, $4 ); } 2251 | '|' '{' push trait_declaration_list pop'}'2211 | '|' '{' push trait_declaration_list '}' 2252 2212 { $$ = $4; } 2253 // | '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list pop'}' '(' type_list ')'2254 //{ SemanticError( yylloc, "Generic data-type assertion is currently unimplemented." ); $$ = nullptr; }2213 | '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list '}' '(' type_list ')' 2214 { SemanticError( yylloc, "Generic data-type assertion is currently unimplemented." ); $$ = nullptr; } 2255 2215 ; 2256 2216 … … 2284 2244 no_attr_identifier_or_type_name 2285 2245 { 2286 typedefTable.addToEnclosingScope( *$1, TYPEDEFname , "10");2246 typedefTable.addToEnclosingScope( *$1, TYPEDEFname ); 2287 2247 $$ = DeclarationNode::newTypeDecl( $1, 0 ); 2288 2248 } 2289 | no_attr_identifier_or_type_name '(' type_parameter_list')'2290 { 2291 typedefTable.addToEnclosingScope( *$1, TYPEGENname , "11");2292 $$ = DeclarationNode::newTypeDecl( $1, $ 3);2249 | no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' 2250 { 2251 typedefTable.addToEnclosingScope( *$1, TYPEGENname ); 2252 $$ = DeclarationNode::newTypeDecl( $1, $4 ); 2293 2253 } 2294 2254 ; 2295 2255 2296 2256 trait_specifier: // CFA 2297 TRAIT no_attr_identifier_or_type_name '(' type_parameter_list')' '{' '}'2298 { $$ = DeclarationNode::newTrait( $2, $ 4, 0 ); }2299 | TRAIT no_attr_identifier_or_type_name '(' type_parameter_list ')' '{' push trait_declaration_list pop'}'2300 { $$ = DeclarationNode::newTrait( $2, $ 4, $8); }2257 TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' '}' 2258 { $$ = DeclarationNode::newTrait( $2, $5, 0 ); } 2259 | TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' push trait_declaration_list '}' 2260 { $$ = DeclarationNode::newTrait( $2, $5, $10 ); } 2301 2261 ; 2302 2262 2303 2263 trait_declaration_list: // CFA 2304 2264 trait_declaration 2305 | trait_declaration_list p op push trait_declaration2306 { $$ = $1->appendList( $ 4); }2265 | trait_declaration_list push trait_declaration 2266 { $$ = $1->appendList( $3 ); } 2307 2267 ; 2308 2268 2309 2269 trait_declaration: // CFA 2310 cfa_trait_declaring_list ';'2311 | trait_declaring_list ';'2270 cfa_trait_declaring_list pop ';' 2271 | trait_declaring_list pop ';' 2312 2272 ; 2313 2273 … … 2329 2289 2330 2290 translation_unit: 2331 // empty, input file 2291 // empty 2292 {} // empty input file 2332 2293 | external_definition_list 2333 2294 { parseTree = parseTree ? parseTree->appendList( $1 ) : $1; } … … 2335 2296 2336 2297 external_definition_list: 2337 push external_definition pop 2338 { $$ = $2; } 2298 external_definition 2339 2299 | external_definition_list 2340 2300 { forall = xxx; } 2341 push external_definition pop2301 push external_definition 2342 2302 { $$ = $1 ? $1->appendList( $4 ) : $4; } 2343 2303 ; … … 2349 2309 ; 2350 2310 2351 up:2352 { typedefTable.up(); }2353 ;2354 2355 down:2356 { typedefTable.down(); }2357 ;2358 2359 2311 external_definition: 2360 2312 declaration 2361 2313 | external_function_definition 2314 | ASM '(' string_literal ')' ';' // GCC, global assembler statement 2315 { 2316 $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) ); 2317 } 2318 | EXTERN STRINGliteral // C++-style linkage specifier 2319 { 2320 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" 2321 linkage = LinkageSpec::linkageUpdate( yylloc, linkage, $2 ); 2322 } 2323 '{' external_definition_list_opt '}' 2324 { 2325 linkage = linkageStack.top(); 2326 linkageStack.pop(); 2327 $$ = $5; 2328 } 2362 2329 | EXTENSION external_definition // GCC, multiple __extension__ allowed, meaning unknown 2363 2330 { … … 2365 2332 $$ = $2; 2366 2333 } 2367 | ASM '(' string_literal ')' ';' // GCC, global assembler statement2368 {2369 $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) );2370 }2371 | EXTERN STRINGliteral // C++-style linkage specifier2372 {2373 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall"2374 linkage = LinkageSpec::linkageUpdate( yylloc, linkage, $2 );2375 }2376 '{' up external_definition_list_opt down '}'2377 {2378 linkage = linkageStack.top();2379 linkageStack.pop();2380 $$ = $6;2381 }2382 2334 | type_qualifier_list 2383 { 2384 if ( $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); } 2385 if ( $1->type->forall ) xxx = forall = true; // remember generic type 2386 } 2387 '{' up external_definition_list_opt down '}' // CFA, namespace 2335 { if ( $1->type->forall ) xxx = forall = true; } // remember generic type 2336 push '{' external_definition_list '}' // CFA, namespace 2388 2337 { 2389 2338 for ( DeclarationNode * iter = $5; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) { … … 2397 2346 } 2398 2347 | declaration_qualifier_list 2399 { 2400 if ( $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); } 2401 if ( $1->type->forall ) xxx = forall = true; // remember generic type 2402 } 2403 '{' up external_definition_list_opt down '}' // CFA, namespace 2348 { if ( $1->type->forall ) xxx = forall = true; } // remember generic type 2349 push '{' external_definition_list '}' // CFA, namespace 2404 2350 { 2405 2351 for ( DeclarationNode * iter = $5; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) { … … 2414 2360 | declaration_qualifier_list type_qualifier_list 2415 2361 { 2416 if ( ($1->type && $1->type->qualifiers.val) || $2->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }2417 if ( ($1->type && $1->type->forall) ||$2->type->forall ) xxx = forall = true; // remember generic type2418 } 2419 '{' up external_definition_list_opt down '}'// CFA, namespace2362 // forall must be in the type_qualifier_list 2363 if ( $2->type->forall ) xxx = forall = true; // remember generic type 2364 } 2365 push '{' external_definition_list '}' // CFA, namespace 2420 2366 { 2421 2367 for ( DeclarationNode * iter = $6; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) { … … 2441 2387 | function_declarator compound_statement 2442 2388 { $$ = $1->addFunctionBody( $2 ); } 2443 | KR_function_declarator KR_ parameter_list_opt compound_statement2389 | KR_function_declarator KR_declaration_list_opt compound_statement 2444 2390 { $$ = $1->addOldDeclList( $2 )->addFunctionBody( $3 ); } 2445 2391 ; … … 2481 2427 2482 2428 // Old-style K&R function definition, OBSOLESCENT (see 4) 2483 | declaration_specifier KR_function_declarator KR_ parameter_list_opt with_clause_opt compound_statement2429 | declaration_specifier KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement 2484 2430 { 2485 2431 rebindForall( $1, $2 ); … … 2487 2433 } 2488 2434 // handles default int return type, OBSOLESCENT (see 1) 2489 | type_qualifier_list KR_function_declarator KR_ parameter_list_opt with_clause_opt compound_statement2435 | type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement 2490 2436 { $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 ); } 2491 2437 // handles default int return type, OBSOLESCENT (see 1) 2492 | declaration_qualifier_list KR_function_declarator KR_ parameter_list_opt with_clause_opt compound_statement2438 | declaration_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement 2493 2439 { $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 ); } 2494 2440 // handles default int return type, OBSOLESCENT (see 1) 2495 | declaration_qualifier_list type_qualifier_list KR_function_declarator KR_ parameter_list_opt with_clause_opt compound_statement2441 | declaration_qualifier_list type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement 2496 2442 { $$ = $3->addOldDeclList( $4 )->addFunctionBody( $6, $5 )->addQualifiers( $2 )->addQualifiers( $1 ); } 2497 2443 ; … … 2738 2684 typedef 2739 2685 // hide type name in enclosing scope by variable name 2740 { typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER , "ID"); }2686 { typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER ); } 2741 2687 | '(' paren_type ')' 2742 2688 { $$ = $2; } … … 3028 2974 '[' ']' 3029 2975 { $$ = DeclarationNode::newArray( 0, 0, false ); } 3030 // multi_array_dimension handles the '[' '*' ']' case2976 // multi_array_dimension handles the '[' '*' ']' case 3031 2977 | '[' push type_qualifier_list '*' pop ']' // remaining C99 3032 2978 { $$ = DeclarationNode::newVarArray( $3 ); } 3033 2979 | '[' push type_qualifier_list pop ']' 3034 2980 { $$ = DeclarationNode::newArray( 0, $3, false ); } 3035 // multi_array_dimension handles the '[' assignment_expression ']' case2981 // multi_array_dimension handles the '[' assignment_expression ']' case 3036 2982 | '[' push type_qualifier_list assignment_expression pop ']' 3037 2983 { $$ = DeclarationNode::newArray( $4, $3, false ); } … … 3169 3115 // 3170 3116 // cfa_abstract_tuple identifier_or_type_name 3171 // '[' cfa_parameter_list ']' identifier_or_type_name '(' cfa_parameter_ ellipsis_list_opt ')'3117 // '[' cfa_parameter_list ']' identifier_or_type_name '(' cfa_parameter_type_list_opt ')' 3172 3118 // 3173 3119 // since a function return type can be syntactically identical to a tuple type: … … 3228 3174 '[' push cfa_abstract_parameter_list pop ']' 3229 3175 { $$ = DeclarationNode::newTuple( $3 ); } 3230 | '[' push type_specifier_nobody ELLIPSIS pop ']'3231 { SemanticError( yylloc, "Tuple array currently unimplemented." ); $$ = nullptr; }3232 | '[' push type_specifier_nobody ELLIPSIS constant_expression pop ']'3233 { SemanticError( yylloc, "Tuple array currently unimplemented." ); $$ = nullptr; }3234 3176 ; 3235 3177 3236 3178 cfa_abstract_function: // CFA 3237 // '[' ']' '(' cfa_parameter_ ellipsis_list_opt ')'3179 // '[' ']' '(' cfa_parameter_type_list_opt ')' 3238 3180 // { $$ = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), $4, nullptr ); } 3239 cfa_abstract_tuple '(' push cfa_parameter_ ellipsis_list_opt pop ')'3181 cfa_abstract_tuple '(' push cfa_parameter_type_list_opt pop ')' 3240 3182 { $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); } 3241 | cfa_function_return '(' push cfa_parameter_ ellipsis_list_opt pop ')'3183 | cfa_function_return '(' push cfa_parameter_type_list_opt pop ')' 3242 3184 { $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); } 3243 3185 ; … … 3270 3212 3271 3213 %% 3272 3273 3214 // ----end of grammar---- 3274 3215
Note:
See TracChangeset
for help on using the changeset viewer.