Changeset bc07190 for src/Parser/parser.yy
- Timestamp:
- Jun 29, 2024, 7:33:28 AM (18 months ago)
- Branches:
- master
- Children:
- 011c29e
- Parents:
- 62a38e7 (diff), 115ac1ce (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r62a38e7 rbc07190 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jun 24 22:45:20202413 // Update Count : 6 68412 // Last Modified On : Thu Jun 27 14:45:57 2024 13 // Update Count : 6705 14 14 // 15 15 … … 224 224 #define UPDOWN( compop, left, right ) (compop == OperKinds::LThan || compop == OperKinds::LEThan ? left : right) 225 225 #define MISSING_ANON_FIELD "illegal syntax, missing loop fields with an anonymous loop index is meaningless as loop index is unavailable in loop body." 226 #define MISSING_LOW "illegal syntax, missing low value for up-to range so index is uninitialized." 227 #define MISSING_HIGH "illegal syntax, missing high value for down-to range so index is uninitialized." 228 229 static ForCtrl * makeForCtrl( const CodeLocation & location, DeclarationNode * init, enum OperKinds compop, 230 ExpressionNode * comp, ExpressionNode * inc ) { 226 #define MISSING_LOW "illegal syntax, missing low value for ascanding range so index is uninitialized." 227 #define MISSING_HIGH "illegal syntax, missing high value for descending range so index is uninitialized." 228 229 static ForCtrl * makeForCtrl( const CodeLocation & location, DeclarationNode * init, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 231 230 // Wrap both comp/inc if they are non-null. 232 231 if ( comp ) comp = new ExpressionNode( build_binary_val( location, … … 243 242 } 244 243 245 ForCtrl * forCtrl( const CodeLocation & location, DeclarationNode * index, ExpressionNode * start, enumOperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {244 ForCtrl * forCtrl( const CodeLocation & location, DeclarationNode * index, ExpressionNode * start, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 246 245 if ( index->initializer ) { 247 246 SemanticError( yylloc, "illegal syntax, direct initialization disallowed. Use instead: type var; initialization ~ comparison ~ increment." ); … … 254 253 } // forCtrl 255 254 256 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, string * index, ExpressionNode * start, enumOperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {255 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, string * index, ExpressionNode * start, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 257 256 ast::ConstantExpr * constant = dynamic_cast<ast::ConstantExpr *>(type->expr.get()); 258 257 if ( constant && (constant->rep == "0" || constant->rep == "1") ) { … … 268 267 #define MISSING_LOOP_INDEX "illegal syntax, only a single identifier or declaration allowed in initialization, e.g., for ( i; ... ) or for ( int i; ... ). Expression disallowed." 269 268 270 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, ExpressionNode * index, ExpressionNode * start, enumOperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {269 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, ExpressionNode * index, ExpressionNode * start, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 271 270 if ( auto identifier = dynamic_cast<ast::NameExpr *>(index->expr.get()) ) { 272 271 return forCtrl( location, type, new string( identifier->name ), start, compop, comp, inc ); 273 // } else if ( auto commaExpr = dynamic_cast<ast::CommaExpr *>( index->expr.get() ) ) {274 // if ( auto identifier = commaExpr->arg2.as<ast::NameExpr>() ) {275 // return forCtrl( location, type, new string( identifier->name ), start, compop, comp, inc );276 // } else {277 // SemanticError( yylloc, "illegal syntax, loop-index name missing. Expression disallowed." ); return nullptr;278 // } // if279 272 } else { 280 273 SemanticError( yylloc, MISSING_LOOP_INDEX ); return nullptr; … … 282 275 } // forCtrl 283 276 284 ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, ExpressionNode * range_over_expr ) {277 ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, __attribute__((unused)) OperKinds compop, ExpressionNode * range_over_expr ) { 285 278 if ( auto identifier = dynamic_cast<ast::NameExpr *>(index_expr->expr.get()) ) { 286 279 DeclarationNode * indexDecl = DeclarationNode::newName( new std::string(identifier->name) ); 287 280 assert( range_over_expr ); 288 return new ForCtrl( new StatementNode( indexDecl ), range_over_expr ); 289 // } else if (auto commaExpr = dynamic_cast<ast::CommaExpr *>( index_expr->expr.get() )) { 290 // if ( auto identifier = commaExpr->arg1.as<ast::NameExpr>() ) { 291 // assert( range_over_expr ); 292 // DeclarationNode * indexDecl = distAttr( 293 // DeclarationNode::newTypeof( range_over_expr, true ), 294 // DeclarationNode::newName( new std::string( identifier->name) ) ); 295 // return new ForCtrl( new StatementNode( indexDecl ), range_over_expr ); 296 // } else { 297 // SemanticError( yylloc, "illegal syntax, loop-index name missing. Comma expression disallowed." ); return nullptr; 298 // } // if 281 return new ForCtrl( new StatementNode( indexDecl ), range_over_expr, compop ); 299 282 } else { 300 283 SemanticError( yylloc, MISSING_LOOP_INDEX ); return nullptr; … … 426 409 %token ANDassign ERassign ORassign // &= ^= |= 427 410 428 %token ErangeUp Eq ErangeDown ErangeDownEq //~= -~ -~=411 %token ErangeUp ErangeUpEq ErangeDown ErangeDownEq // +~ +~=/~= -~ -~= 429 412 %token ATassign // @= 430 413 … … 1522 1505 { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; } 1523 1506 1507 // These rules accept a comma_expression for the initialization, when only an identifier is correct. Being 1508 // permissive allows for a better error message from forCtrl. 1524 1509 | comma_expression ';' comma_expression // CFA 1525 1510 { $$ = forCtrl( yylloc, $3, $1, NEW_ZERO, OperKinds::LThan, $3->clone(), NEW_ONE ); } … … 1541 1526 } 1542 1527 | comma_expression ';' '@' updowneq '@' // CFA, invalid syntax rule 1543 { SemanticError( yylloc, "illegal syntax, missing low/high value for up/down-torange so index is uninitialized." ); $$ = nullptr; }1528 { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; } 1544 1529 1545 1530 | comma_expression ';' comma_expression updowneq comma_expression '~' comma_expression // CFA … … 1570 1555 } 1571 1556 | comma_expression ';' '@' updowneq '@' '~' '@' // CFA 1572 { SemanticError( yylloc, "illegal syntax, missing low/high value for up/down-torange so index is uninitialized." ); $$ = nullptr; }1557 { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; } 1573 1558 1574 1559 | declaration comma_expression // CFA … … 1618 1603 } 1619 1604 | declaration '@' updowneq '@' '~' '@' // CFA, invalid syntax rule 1620 { SemanticError( yylloc, "illegal syntax, missing low/high value for up/down-torange so index is uninitialized." ); $$ = nullptr; }1605 { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; } 1621 1606 1622 1607 | comma_expression ';' enum_key // CFA, enum type 1623 1608 { 1624 $$ = enumRangeCtrl( $1, new ExpressionNode( new ast::TypeExpr( yylloc, $3->buildType() ) ) );1609 $$ = enumRangeCtrl( $1, OperKinds::LEThan, new ExpressionNode( new ast::TypeExpr( yylloc, $3->buildType() ) ) ); 1625 1610 } 1626 1611 | comma_expression ';' downupdowneq enum_key // CFA, enum type, reverse direction 1627 1612 { 1628 if ( $3 == OperKinds::LEThan || $3 == OperKinds::GEThan ) { 1629 SemanticError( yylloc, "illegal syntax, all enumeration ranges are equal (all values). Remove \"=~\"." ); $$ = nullptr; 1630 } 1631 SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr; 1613 if ( $3 == OperKinds::GThan ) { 1614 SemanticError( yylloc, "all enumeration ranges are equal (all values). Add an equal, e.g., ~=, -~=." ); $$ = nullptr; 1615 $3 = OperKinds::GEThan; 1616 } // if 1617 $$ = enumRangeCtrl( $1, $3, new ExpressionNode( new ast::TypeExpr( yylloc, $4->buildType() ) ) ); 1632 1618 } 1633 1619 ; … … 1642 1628 ; 1643 1629 1630 // This rule exists to handle the ambiguity with unary operator '~'. The rule is the same as updowneq minus the '~'. 1631 // Specifically, "for ( ~5 )" means the complement of 5, not loop 0..4. Hence, in this case "for ( ~= 5 )", i.e., 0..5, 1632 // it is not possible to just remove the '='. The entire '~=' must be removed. 1644 1633 downupdowneq: 1645 ErangeDown 1634 ErangeUp 1635 { $$ = OperKinds::LThan; } 1636 | ErangeDown 1646 1637 { $$ = OperKinds::GThan; } 1647 1638 | ErangeUpEq … … 1652 1643 1653 1644 updown: 1654 '~' 1645 '~' // shorthand 0 ~ 10 => 0 +~ 10 1646 { $$ = OperKinds::LThan; } 1647 | ErangeUp 1655 1648 { $$ = OperKinds::LThan; } 1656 1649 | ErangeDown
Note:
See TracChangeset
for help on using the changeset viewer.