Changes in src/Parser/parser.yy [01afd8d:253d0b4]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r01afd8d r253d0b4 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jun 27 14:45:57202413 // Update Count : 6 70512 // Last Modified On : Mon Jun 24 22:45:20 2024 13 // Update Count : 6684 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 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 ) { 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 ) { 230 231 // Wrap both comp/inc if they are non-null. 231 232 if ( comp ) comp = new ExpressionNode( build_binary_val( location, … … 242 243 } 243 244 244 ForCtrl * forCtrl( const CodeLocation & location, DeclarationNode * index, ExpressionNode * start, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {245 ForCtrl * forCtrl( const CodeLocation & location, DeclarationNode * index, ExpressionNode * start, enum OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 245 246 if ( index->initializer ) { 246 247 SemanticError( yylloc, "illegal syntax, direct initialization disallowed. Use instead: type var; initialization ~ comparison ~ increment." ); … … 253 254 } // forCtrl 254 255 255 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, string * index, ExpressionNode * start, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {256 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, string * index, ExpressionNode * start, enum OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 256 257 ast::ConstantExpr * constant = dynamic_cast<ast::ConstantExpr *>(type->expr.get()); 257 258 if ( constant && (constant->rep == "0" || constant->rep == "1") ) { … … 267 268 #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." 268 269 269 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, ExpressionNode * index, ExpressionNode * start, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {270 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, ExpressionNode * index, ExpressionNode * start, enum OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 270 271 if ( auto identifier = dynamic_cast<ast::NameExpr *>(index->expr.get()) ) { 271 272 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 // } // if 272 279 } else { 273 280 SemanticError( yylloc, MISSING_LOOP_INDEX ); return nullptr; … … 275 282 } // forCtrl 276 283 277 ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, __attribute__((unused)) OperKinds compop,ExpressionNode * range_over_expr ) {284 ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, ExpressionNode * range_over_expr ) { 278 285 if ( auto identifier = dynamic_cast<ast::NameExpr *>(index_expr->expr.get()) ) { 279 286 DeclarationNode * indexDecl = DeclarationNode::newName( new std::string(identifier->name) ); 280 287 assert( range_over_expr ); 281 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 282 299 } else { 283 300 SemanticError( yylloc, MISSING_LOOP_INDEX ); return nullptr; … … 409 426 %token ANDassign ERassign ORassign // &= ^= |= 410 427 411 %token ErangeUp ErangeUpEq ErangeDown ErangeDownEq // +~ +~=/~= -~ -~=428 %token ErangeUpEq ErangeDown ErangeDownEq // ~= -~ -~= 412 429 %token ATassign // @= 413 430 … … 1505 1522 { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; } 1506 1523 1507 // These rules accept a comma_expression for the initialization, when only an identifier is correct. Being1508 // permissive allows for a better error message from forCtrl.1509 1524 | comma_expression ';' comma_expression // CFA 1510 1525 { $$ = forCtrl( yylloc, $3, $1, NEW_ZERO, OperKinds::LThan, $3->clone(), NEW_ONE ); } … … 1526 1541 } 1527 1542 | comma_expression ';' '@' updowneq '@' // CFA, invalid syntax rule 1528 { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descendingrange so index is uninitialized." ); $$ = nullptr; }1543 { SemanticError( yylloc, "illegal syntax, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; } 1529 1544 1530 1545 | comma_expression ';' comma_expression updowneq comma_expression '~' comma_expression // CFA … … 1555 1570 } 1556 1571 | comma_expression ';' '@' updowneq '@' '~' '@' // CFA 1557 { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descendingrange so index is uninitialized." ); $$ = nullptr; }1572 { SemanticError( yylloc, "illegal syntax, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; } 1558 1573 1559 1574 | declaration comma_expression // CFA … … 1603 1618 } 1604 1619 | declaration '@' updowneq '@' '~' '@' // CFA, invalid syntax rule 1605 { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descendingrange so index is uninitialized." ); $$ = nullptr; }1620 { SemanticError( yylloc, "illegal syntax, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; } 1606 1621 1607 1622 | comma_expression ';' enum_key // CFA, enum type 1608 1623 { 1609 $$ = enumRangeCtrl( $1, OperKinds::LEThan,new ExpressionNode( new ast::TypeExpr( yylloc, $3->buildType() ) ) );1624 $$ = enumRangeCtrl( $1, new ExpressionNode( new ast::TypeExpr( yylloc, $3->buildType() ) ) ); 1610 1625 } 1611 1626 | comma_expression ';' downupdowneq enum_key // CFA, enum type, reverse direction 1612 1627 { 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() ) ) ); 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; 1618 1632 } 1619 1633 ; … … 1628 1642 ; 1629 1643 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.1633 1644 downupdowneq: 1634 ErangeUp 1635 { $$ = OperKinds::LThan; } 1636 | ErangeDown 1645 ErangeDown 1637 1646 { $$ = OperKinds::GThan; } 1638 1647 | ErangeUpEq … … 1643 1652 1644 1653 updown: 1645 '~' // shorthand 0 ~ 10 => 0 +~ 10 1646 { $$ = OperKinds::LThan; } 1647 | ErangeUp 1654 '~' 1648 1655 { $$ = OperKinds::LThan; } 1649 1656 | ErangeDown
Note:
See TracChangeset
for help on using the changeset viewer.