Changes in src/Parser/parser.yy [ac235a8:d63aeba]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (35 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
rac235a8 rd63aeba 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 9 17:56:42202313 // Update Count : 6 32512 // Last Modified On : Wed Mar 22 21:26:01 2023 13 // Update Count : 6002 14 14 // 15 15 … … 44 44 45 45 #include <cstdio> 46 #include <sstream>47 46 #include <stack> 48 47 using namespace std; … … 271 270 SemanticError( yylloc, ::toString( "Identifier \"", identifier, "\" cannot appear before a ", kind, ".\n" 272 271 "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter." ) ); 272 } // IdentifierBeforeType 273 274 static bool TypedefForall( DeclarationNode * decl ) { 275 if ( decl->type->forall || (decl->type->kind == TypeData::Aggregate && decl->type->aggregate.params) ) { 276 SemanticError( yylloc, "forall qualifier in typedef is currently unimplemented." ); 277 return true; 278 } // if 279 return false; 273 280 } // IdentifierBeforeType 274 281 … … 352 359 353 360 // names and constants: lexer differentiates between identifier and typedef names 354 %token<tok> IDENTIFIER TYPEDIMname TYPEDEFname TYPEGENname355 %token<tok> TIMEOUT W AND WORCATCH RECOVER CATCHRESUME FIXUP FINALLY // CFA361 %token<tok> IDENTIFIER QUOTED_IDENTIFIER TYPEDIMname TYPEDEFname TYPEGENname 362 %token<tok> TIMEOUT WOR CATCH RECOVER CATCHRESUME FIXUP FINALLY // CFA 356 363 %token<tok> INTEGERconstant CHARACTERconstant STRINGliteral 357 364 %token<tok> DIRECTIVE … … 422 429 %type<catch_kind> handler_key 423 430 %type<sn> mutex_statement 424 %type<en> when_clause when_clause_opt waitfor waituntiltimeout425 %type<sn> waitfor_statement waituntil_statement426 %type<wfs> w or_waitfor_clause waituntil_clause wand_waituntil_clause wor_waituntil_clause431 %type<en> when_clause when_clause_opt waitfor timeout 432 %type<sn> waitfor_statement 433 %type<wfs> waitfor_clause 427 434 428 435 // declarations … … 528 535 // Similar issues exit with the waitfor statement. 529 536 530 // Order of these lines matters (low-to-high precedence). THEN is left associative over W AND/WOR/TIMEOUT/ELSE, WAND/WOR531 // is leftassociative over TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE.537 // Order of these lines matters (low-to-high precedence). THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left 538 // associative over TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE. 532 539 %precedence THEN // rule precedence for IF/WAITFOR statement 533 %precedence ANDAND // token precedence for start of WAND in WAITFOR statement534 %precedence WAND // token precedence for start of WAND in WAITFOR statement535 %precedence OROR // token precedence for start of WOR in WAITFOR statement536 540 %precedence WOR // token precedence for start of WOR in WAITFOR statement 537 541 %precedence TIMEOUT // token precedence for start of TIMEOUT in WAITFOR statement … … 620 624 quasi_keyword: // CFA 621 625 TIMEOUT 622 | WAND623 626 | WOR 624 627 | CATCH … … 771 774 { $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $4 ) ) ); } 772 775 | postfix_expression ICR 773 { $$ = new ExpressionNode( build_unary_val( OperKinds::IncrPost, $1 ) ); }776 { $$ = new ExpressionNode( build_unary_val( OperKinds::IncrPost, $1 ) ); } 774 777 | postfix_expression DECR 775 { $$ = new ExpressionNode( build_unary_val( OperKinds::DecrPost, $1 ) ); }778 { $$ = new ExpressionNode( build_unary_val( OperKinds::DecrPost, $1 ) ); } 776 779 | '(' type_no_function ')' '{' initializer_list_opt comma_opt '}' // C99, compound-literal 777 780 { $$ = new ExpressionNode( build_compoundLiteral( $2, new InitializerNode( $5, true ) ) ); } … … 801 804 '@' // CFA, default parameter 802 805 { SemanticError( yylloc, "Default parameter for argument is currently unimplemented." ); $$ = nullptr; } 803 // { $$ = new ExpressionNode( build_constantInteger( *new string( "2" ) ) ); }806 // { $$ = new ExpressionNode( build_constantInteger( *new string( "2" ) ) ); } 804 807 | assignment_expression 805 808 ; … … 876 879 } 877 880 | unary_operator cast_expression 878 { $$ = new ExpressionNode( build_unary_val( $1, $2 ) ); }881 { $$ = new ExpressionNode( build_unary_val( $1, $2 ) ); } 879 882 | ICR unary_expression 880 { $$ = new ExpressionNode( build_unary_val( OperKinds::Incr, $2 ) ); }883 { $$ = new ExpressionNode( build_unary_val( OperKinds::Incr, $2 ) ); } 881 884 | DECR unary_expression 882 { $$ = new ExpressionNode( build_unary_val( OperKinds::Decr, $2 ) ); }885 { $$ = new ExpressionNode( build_unary_val( OperKinds::Decr, $2 ) ); } 883 886 | SIZEOF unary_expression 884 887 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild( $2 ) ) ); } … … 1133 1136 | mutex_statement 1134 1137 | waitfor_statement 1135 | waituntil_statement1136 1138 | exception_statement 1137 1139 | enable_disable_statement … … 1243 1245 | declaration comma_expression // semi-colon separated 1244 1246 { $$ = new CondCtl( $1, $2 ); } 1245 ;1247 ; 1246 1248 1247 1249 // CASE and DEFAULT clauses are only allowed in the SWITCH statement, precluding Duff's device. In addition, a case … … 1326 1328 } 1327 1329 | FOR '(' for_control_expression_list ')' statement %prec THEN 1328 { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ) ) ); }1330 { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ) ) ); } 1329 1331 | FOR '(' for_control_expression_list ')' statement ELSE statement // CFA 1330 1332 { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ), $7 ) ); } … … 1518 1520 SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr; 1519 1521 } 1520 ;1522 ; 1521 1523 1522 1524 downupdowneq: … … 1527 1529 | ErangeDownEq 1528 1530 { $$ = OperKinds::GEThan; } 1529 ;1531 ; 1530 1532 1531 1533 updown: … … 1534 1536 | ErangeDown 1535 1537 { $$ = OperKinds::GThan; } 1536 ;1538 ; 1537 1539 1538 1540 updowneq: … … 1542 1544 | ErangeDownEq 1543 1545 { $$ = OperKinds::GEThan; } 1544 ;1546 ; 1545 1547 1546 1548 jump_statement: … … 1625 1627 ; 1626 1628 1629 waitfor: 1630 WAITFOR '(' cast_expression ')' 1631 { $$ = $3; } 1632 // | WAITFOR '(' cast_expression ',' argument_expression_list_opt ')' 1633 // { $$ = (ExpressionNode *)$3->set_last( $5 ); } 1634 | WAITFOR '(' cast_expression_list ':' argument_expression_list_opt ')' 1635 { $$ = (ExpressionNode *)($3->set_last( $5 )); } 1636 ; 1637 1627 1638 cast_expression_list: 1628 1639 cast_expression … … 1633 1644 1634 1645 timeout: 1635 TIMEOUT '(' comma_expression ')' { $$ = $3; } 1636 ; 1637 1638 wor: 1639 OROR 1640 | WOR 1641 1642 waitfor: 1643 WAITFOR '(' cast_expression ')' 1644 { $$ = $3; } 1645 | WAITFOR '(' cast_expression_list ':' argument_expression_list_opt ')' 1646 { $$ = (ExpressionNode *)($3->set_last( $5 )); } 1647 ; 1648 1649 wor_waitfor_clause: 1646 TIMEOUT '(' comma_expression ')' { $$ = $3; } 1647 ; 1648 1649 waitfor_clause: 1650 1650 when_clause_opt waitfor statement %prec THEN 1651 // Called first: create header for WaitForStmt. 1652 { $$ = build_waitfor( new WaitForStmt(), $1, $2, maybe_build_compound( $3 ) ); } 1653 | wor_waitfor_clause wor when_clause_opt waitfor statement %prec THEN 1654 { $$ = build_waitfor( $1, $3, $4, maybe_build_compound( $5 ) ); } 1655 | wor_waitfor_clause wor when_clause_opt ELSE statement 1656 { $$ = build_waitfor_else( $1, $3, maybe_build_compound( $5 ) ); } 1657 | wor_waitfor_clause wor when_clause_opt timeout statement %prec THEN 1658 { $$ = build_waitfor_timeout( $1, $3, $4, maybe_build_compound( $5 ) ); } 1651 { $$ = build_waitfor( $2, maybe_build_compound( $3 ), $1 ); } 1652 | when_clause_opt waitfor statement WOR waitfor_clause 1653 { $$ = build_waitfor( $2, maybe_build_compound( $3 ), $1, $5 ); } 1654 | when_clause_opt timeout statement %prec THEN 1655 { $$ = build_waitfor_timeout( $2, maybe_build_compound( $3 ), $1 ); } 1656 | when_clause_opt ELSE statement 1657 { $$ = build_waitfor_timeout( nullptr, maybe_build_compound( $3 ), $1 ); } 1659 1658 // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless) 1660 | w or_waitfor_clause wor when_clause_opt timeout statement worELSE statement // syntax error1659 | when_clause_opt timeout statement WOR ELSE statement // syntax error 1661 1660 { SemanticError( yylloc, "else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; } 1662 | wor_waitfor_clause wor when_clause_opt timeout statement wor when_clause ELSE statement 1663 { $$ = build_waitfor_else( build_waitfor_timeout( $1, $3, $4, maybe_build_compound( $5 ) ), $7, maybe_build_compound( $9 ) ); } 1661 | when_clause_opt timeout statement WOR when_clause ELSE statement 1662 { $$ = build_waitfor_timeout( $2, maybe_build_compound( $3 ), $1, maybe_build_compound( $7 ), $5 ); } 1663 ; 1664 1664 1665 1665 waitfor_statement: 1666 wor_waitfor_clause %prec THEN 1667 { $$ = new StatementNode( $1 ); } 1668 ; 1669 1670 wand: 1671 ANDAND 1672 | WAND 1673 ; 1674 1675 waituntil: 1676 WAITUNTIL '(' cast_expression ')' 1677 { $$ = $3; } 1678 ; 1679 1680 waituntil_clause: 1681 when_clause_opt waituntil statement 1682 { printf( "waituntil_clause 1\n" ); $$ = nullptr; } 1683 | '(' wor_waituntil_clause ')' 1684 { printf( "waituntil_clause 2\n" ); $$ = nullptr; } 1685 ; 1686 1687 wand_waituntil_clause: 1688 waituntil_clause %prec THEN 1689 { printf( "wand_waituntil_clause 1\n" ); $$ = nullptr; } 1690 | waituntil_clause wand wand_waituntil_clause 1691 { printf( "wand_waituntil_clause 2\n" ); $$ = nullptr; } 1692 ; 1693 1694 wor_waituntil_clause: 1695 wand_waituntil_clause 1696 { printf( "wor_waituntil_clause 1\n" ); $$ = nullptr; } 1697 | wor_waituntil_clause wor wor_waituntil_clause %prec THEN 1698 { printf( "wor_waituntil_clause 2\n" ); $$ = nullptr; } 1699 | wor_waituntil_clause wor when_clause_opt ELSE statement 1700 { printf( "wor_waituntil_clause 3\n" ); $$ = nullptr; } 1701 | wor_waituntil_clause wor when_clause_opt timeout statement %prec THEN 1702 { printf( "wor_waituntil_clause 4\n" ); $$ = nullptr; } 1703 // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless) 1704 | wor_waituntil_clause wor when_clause_opt timeout statement wor ELSE statement // syntax error 1705 { SemanticError( yylloc, "else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; } 1706 | wor_waituntil_clause wor when_clause_opt timeout statement wor when_clause ELSE statement 1707 { printf( "wor_waituntil_clause 6\n" ); $$ = nullptr; } 1708 ; 1709 1710 waituntil_statement: 1711 wor_waituntil_clause %prec THEN 1712 // SKULLDUGGERY: create an empty compound statement to test parsing of waituntil statement. 1713 { $$ = new StatementNode( build_compound( (StatementNode *)0 ) ); } 1666 when_clause_opt waitfor statement %prec THEN 1667 { $$ = new StatementNode( build_waitfor( $2, $3, $1 ) ); } 1668 | when_clause_opt waitfor statement WOR waitfor_clause 1669 { $$ = new StatementNode( build_waitfor( $2, $3, $1, $5 ) ); } 1714 1670 ; 1715 1671 1716 1672 exception_statement: 1717 TRY compound_statement handler_clause %prec THEN1673 TRY compound_statement handler_clause %prec THEN 1718 1674 { $$ = new StatementNode( build_try( $2, $3, nullptr ) ); } 1719 1675 | TRY compound_statement finally_clause … … 1875 1831 { 1876 1832 // printf( "C_DECLARATION1 %p %s\n", $$, $$->name ? $$->name->c_str() : "(nil)" ); 1877 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {1833 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) { 1878 1834 // printf( "\tattr %s\n", attr->name.c_str() ); 1879 1835 // } // for … … 2011 1967 { 2012 1968 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "4" ); 2013 if ( $2->type->forall || ($2->type->kind == TypeData::Aggregate && $2->type->aggregate.params) ) { 2014 SemanticError( yylloc, "forall qualifier in typedef is currently unimplemented." ); $$ = nullptr; 2015 } else $$ = $3->addType( $2 )->addTypedef(); // watchout frees $2 and $3 1969 if ( TypedefForall( $2 ) ) $$ = nullptr; 1970 else $$ = $3->addType( $2 )->addTypedef(); // watchout frees $2 and $3 2016 1971 } 2017 1972 | typedef_declaration pop ',' push declarator … … 2021 1976 } 2022 1977 | type_qualifier_list TYPEDEF type_specifier declarator // remaining OBSOLESCENT (see 2 ) 2023 { SemanticError( yylloc, "Type qualifiers/specifiers before TYPEDEF is deprecated, move after TYPEDEF." ); $$ = nullptr; } 1978 { 1979 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname, "6" ); 1980 if ( TypedefForall( $1 ) ) $$ = nullptr; 1981 else $$ = $4->addQualifiers( $1 )->addType( $3 )->addTypedef(); 1982 } 2024 1983 | type_specifier TYPEDEF declarator 2025 { SemanticError( yylloc, "Type qualifiers/specifiers before TYPEDEF is deprecated, move after TYPEDEF." ); $$ = nullptr; } 1984 { 1985 typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "7" ); 1986 if ( TypedefForall( $1 ) ) $$ = nullptr; 1987 else $$ = $3->addType( $1 )->addTypedef(); 1988 } 2026 1989 | type_specifier TYPEDEF type_qualifier_list declarator 2027 { SemanticError( yylloc, "Type qualifiers/specifiers before TYPEDEF is deprecated, move after TYPEDEF." ); $$ = nullptr; } 1990 { 1991 typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname, "8" ); 1992 if ( TypedefForall( $3 ) ) $$ = nullptr; 1993 else $$ = $4->addQualifiers( $1 )->addType( $1 )->addTypedef(); 1994 } 2028 1995 ; 2029 1996 … … 2032 1999 TYPEDEF identifier '=' assignment_expression 2033 2000 { 2034 SemanticError( yylloc, "T YPEDEFexpression is deprecated, use typeof(...) instead." ); $$ = nullptr;2001 SemanticError( yylloc, "Typedef expression is deprecated, use typeof(...) instead." ); $$ = nullptr; 2035 2002 } 2036 2003 | typedef_expression pop ',' push identifier '=' assignment_expression 2037 2004 { 2038 SemanticError( yylloc, "T YPEDEFexpression is deprecated, use typeof(...) instead." ); $$ = nullptr;2005 SemanticError( yylloc, "Typedef expression is deprecated, use typeof(...) instead." ); $$ = nullptr; 2039 2006 } 2040 2007 ; … … 2334 2301 { 2335 2302 // printf( "sue_declaration_specifier %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" ); 2336 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {2303 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) { 2337 2304 // printf( "\tattr %s\n", attr->name.c_str() ); 2338 2305 // } // for … … 2350 2317 { 2351 2318 // printf( "sue_type_specifier %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" ); 2352 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {2319 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) { 2353 2320 // printf( "\tattr %s\n", attr->name.c_str() ); 2354 2321 // } // for … … 2428 2395 { 2429 2396 // printf( "elaborated_type %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" ); 2430 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {2397 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) { 2431 2398 // printf( "\tattr %s\n", attr->name.c_str() ); 2432 2399 // } // for … … 2555 2522 $$ = fieldDecl( $1, $2 ); 2556 2523 // printf( "type_specifier2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" ); 2557 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {2524 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) { 2558 2525 // printf( "\tattr %s\n", attr->name.c_str() ); 2559 2526 // } // for … … 2562 2529 { $$ = fieldDecl( $2, $3 ); distExt( $$ ); } 2563 2530 | STATIC type_specifier field_declaring_list_opt ';' // CFA 2564 { SemanticError( yylloc, "STATIC aggregate field qualifier currently unimplemented." ); $$ = nullptr; }2531 { SemanticError( yylloc, "STATIC aggregate field qualifier currently unimplemented." ); $$ = nullptr; } 2565 2532 | INLINE type_specifier field_abstract_list_opt ';' // CFA 2566 2533 { … … 2573 2540 } 2574 2541 | INLINE aggregate_control ';' // CFA 2575 { SemanticError( yylloc, "INLINE aggregate control currently unimplemented." ); $$ = nullptr; }2542 { SemanticError( yylloc, "INLINE aggregate control currently unimplemented." ); $$ = nullptr; } 2576 2543 | typedef_declaration ';' // CFA 2577 2544 | cfa_field_declaring_list ';' // CFA, new style field declaration … … 2656 2623 { $$ = DeclarationNode::newEnum( $3->name, $6, true, false, nullptr, $4 )->addQualifiers( $2 ); } 2657 2624 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt '{' enumerator_list comma_opt '}' 2658 {2625 { 2659 2626 if ( $3->storageClasses.val != 0 || $3->type->qualifiers.any() ) 2660 2627 { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } … … 3190 3157 { 3191 3158 distQual( $5, $1 ); 3192 forall = false;3159 forall = false; 3193 3160 $$ = $5; 3194 3161 } … … 3201 3168 { 3202 3169 distQual( $5, $1 ); 3203 forall = false;3170 forall = false; 3204 3171 $$ = $5; 3205 3172 } … … 3212 3179 { 3213 3180 distQual( $6, $1->addQualifiers( $2 ) ); 3214 forall = false;3181 forall = false; 3215 3182 $$ = $6; 3216 3183 } … … 3419 3386 | '(' attribute_list variable_ptr ')' array_dimension 3420 3387 { $$ = $3->addQualifiers( $2 )->addArray( $5 ); } 3421 | '(' variable_array ')' multi_array_dimension // redundant parenthesis3388 | '(' variable_array ')' multi_array_dimension // redundant parenthesis 3422 3389 { $$ = $2->addArray( $4 ); } 3423 3390 | '(' attribute_list variable_array ')' multi_array_dimension // redundant parenthesis … … 3842 3809 | ErangeUpEq 3843 3810 { $$ = OperKinds::LEThan; } 3844 ;3811 ; 3845 3812 3846 3813 multi_array_dimension:
Note:
See TracChangeset
for help on using the changeset viewer.