Changes in / [343c8be:d96d4f0]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r343c8be rd96d4f0 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jun 25 18:44:14202413 // Update Count : 66 9212 // Last Modified On : Mon Jun 24 22:45:20 2024 13 // Update Count : 6684 14 14 // 15 15 … … 227 227 #define MISSING_HIGH "illegal syntax, missing high value for down-to range so index is uninitialized." 228 228 229 static ForCtrl * makeForCtrl( const CodeLocation & location, DeclarationNode * init, OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 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; … … 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 ); } … … 1607 1622 | comma_expression ';' enum_key // CFA, enum type 1608 1623 { 1609 $$ = enumRangeCtrl( $1, OperKinds::LThan,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 … … 1614 1629 SemanticError( yylloc, "illegal syntax, all enumeration ranges are equal (all values). Remove \"=~\"." ); $$ = nullptr; 1615 1630 } 1616 $$ = enumRangeCtrl( $1, $3, new ExpressionNode( new ast::TypeExpr( yylloc, $4->buildType() ) ) );1631 SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr; 1617 1632 } 1618 1633 ;
Note:
See TracChangeset
for help on using the changeset viewer.