Changeset 525f7ad for src/Parser
- Timestamp:
- Jun 19, 2024, 3:20:39 PM (18 months ago)
- Branches:
- master
- Children:
- 57e43cd
- Parents:
- 1725989
- Location:
- src/Parser
- Files:
-
- 4 edited
-
StatementNode.cpp (modified) (1 diff)
-
StatementNode.hpp (modified) (1 diff)
-
lex.ll (modified) (1 diff)
-
parser.yy (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/StatementNode.cpp
r1725989 r525f7ad 211 211 buildMoveList( forctl->init, astinit ); 212 212 213 if ( forctl->range_over ) { 214 ast::Expr * range_over = maybeMoveBuild( forctl->range_over ); 215 delete forctl; 216 return new ast::ForStmt( location, 217 std::move( astinit ), 218 range_over, 219 buildMoveSingle( stmt ), 220 buildMoveOptional( else_ ) 221 ); 222 } 223 213 224 ast::Expr * astcond = nullptr; // maybe empty 214 225 astcond = maybeMoveBuild( forctl->condition ); -
src/Parser/StatementNode.hpp
r1725989 r525f7ad 63 63 struct ForCtrl { 64 64 ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) : 65 init( stmt ), condition( condition ), change( change ) {} 65 init( stmt ), condition( condition ), change( change ), range_over( nullptr ) {} 66 ForCtrl( StatementNode * decl, ExpressionNode * _range_over) : 67 init( decl ), condition( nullptr ), change( nullptr ), range_over( _range_over ) {} 66 68 67 69 StatementNode * init; 68 70 ExpressionNode * condition; 69 71 ExpressionNode * change; 72 ExpressionNode * range_over; 70 73 }; 71 74 -
src/Parser/lex.ll
r1725989 r525f7ad 321 321 __signed__ { KEYWORD_RETURN(SIGNED); } // GCC 322 322 sizeof { KEYWORD_RETURN(SIZEOF); } 323 __count_e__ { KEYWORD_RETURN(COUNT); } // GCC 323 324 static { KEYWORD_RETURN(STATIC); } 324 325 _Static_assert { KEYWORD_RETURN(STATICASSERT); } // C11 -
src/Parser/parser.yy
r1725989 r525f7ad 284 284 } // forCtrl 285 285 286 ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, ExpressionNode * range_over_expr ) { 287 if ( auto identifier = dynamic_cast<ast::NameExpr *>(index_expr->expr.get()) ) { 288 DeclarationNode * indexDecl = 289 DeclarationNode::newName( new std::string(identifier->name) ); 290 assert( range_over_expr ); 291 auto node = new StatementNode( indexDecl ); // <- this cause this error 292 return new ForCtrl( node, range_over_expr ); 293 } else if (auto commaExpr = dynamic_cast<ast::CommaExpr *>( index_expr->expr.get() )) { 294 if ( auto identifier = commaExpr->arg1.as<ast::NameExpr>() ) { 295 assert( range_over_expr ); 296 DeclarationNode * indexDecl = distAttr( 297 DeclarationNode::newTypeof( range_over_expr, true ), 298 DeclarationNode::newName( new std::string( identifier->name) ) ); 299 return new ForCtrl( new StatementNode( indexDecl ), range_over_expr ); 300 } else { 301 SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr; 302 } // if 303 } else { 304 SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr; 305 } // if 306 } // enumRangeCtrl 307 286 308 static void IdentifierBeforeIdentifier( string & identifier1, string & identifier2, const char * kind ) { 287 309 SemanticError( yylloc, "syntax error, adjacent identifiers \"%s\" and \"%s\" are not meaningful in an %s.\n" … … 368 390 %token DECIMAL32 DECIMAL64 DECIMAL128 // GCC 369 391 %token ZERO_T ONE_T // CFA 370 %token SIZEOF TYPEOF VA_LIST VA_ARG AUTO_TYPE // GCC392 %token SIZEOF TYPEOF VA_LIST VA_ARG AUTO_TYPE COUNT // GCC 371 393 %token OFFSETOF BASETYPEOF TYPEID // CFA 372 394 %token ENUM STRUCT UNION … … 968 990 // $$ = new ExpressionNode( build_offsetOf( $3, build_varref( $5 ) ) ); 969 991 } 992 | COUNT '(' type ')' 993 { 994 // SemanticError( yylloc, "Count is currently unimplemented. "); $$ = nullptr; 995 $$ = new ExpressionNode( new ast::CountExpr( yylloc, maybeMoveBuildType( $3 ) ) ); 996 } 970 997 ; 971 998 … … 1599 1626 { SemanticError( yylloc, "syntax error, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; } 1600 1627 1601 | comma_expression ';' enum_key // CFA, enum type 1602 { 1603 SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr; 1604 //$$ = forCtrl( new ExpressionNode( build_varref( $3 ) ), $1, nullptr, OperKinds::Range, nullptr, nullptr ); 1605 } 1606 | comma_expression ';' downupdowneq enum_key // CFA, enum type, reverse direction 1628 | comma_expression ';' enum_type // CFA, enum type 1629 { 1630 $$ = enumRangeCtrl( $1, new ExpressionNode( new ast::TypeExpr(yylloc, $3->buildType() ) ) ); 1631 } 1632 | comma_expression ';' downupdowneq enum_type // CFA, enum type, reverse direction 1607 1633 { 1608 1634 if ( $3 == OperKinds::LEThan || $3 == OperKinds::GEThan ) { … … 1611 1637 SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr; 1612 1638 } 1613 ;1614 1615 enum_key:1616 TYPEDEFname1617 | ENUM identifier_or_type_name1618 1639 ; 1619 1640
Note:
See TracChangeset
for help on using the changeset viewer.