TMP: Brain broke, I need a break, don't use this commit
This commit is contained in:
+50
-7
@@ -765,11 +765,17 @@ static Toy_AstFlag iterable(Toy_Bucket** bucketHandle, Toy_Parser* parser, Toy_A
|
||||
//infix must advance
|
||||
advance(parser);
|
||||
|
||||
Toy_Ast* expr = NULL;
|
||||
parsePrecedence(bucketHandle, parser, &expr, PREC_CALL);
|
||||
Toy_private_emitAstIterable(bucketHandle, rootHandle, expr);
|
||||
//check for the correct operands
|
||||
if ((*rootHandle)->type != TOY_AST_VAR_DECLARE) {
|
||||
printError(parser, parser->previous, "Expected iterator name not found");
|
||||
Toy_private_emitAstError(bucketHandle, rootHandle);
|
||||
return TOY_AST_FLAG_NONE;
|
||||
}
|
||||
|
||||
//TODO: check for var declare without assignment
|
||||
Toy_Ast* expr = NULL;
|
||||
parsePrecedence(bucketHandle, parser, rootHandle, PREC_CALL);
|
||||
|
||||
Toy_private_emitAstIterable(bucketHandle, rootHandle, expr);
|
||||
|
||||
return TOY_AST_FLAG_NONE;
|
||||
}
|
||||
@@ -785,7 +791,7 @@ static void parsePrecedence(Toy_Bucket** bucketHandle, Toy_Parser* parser, Toy_A
|
||||
if (prefix == NULL) {
|
||||
//make a nice error message
|
||||
if (Toy_private_findKeywordByType(parser->previous.type)) {
|
||||
printError(parser, parser->previous, "Found reserved keyword instead");
|
||||
printError(parser, parser->previous, "Expected expression, found reserved keyword instead");
|
||||
}
|
||||
else {
|
||||
printError(parser, parser->previous, "Expected expression");
|
||||
@@ -909,12 +915,49 @@ static void makeForStmt(Toy_Bucket** bucketHandle, Toy_Parser* parser, Toy_Ast**
|
||||
Toy_Ast* condBranch = NULL;
|
||||
Toy_Ast* thenBranch = NULL;
|
||||
|
||||
//BUG: wtf am I doing here?
|
||||
|
||||
//for (condBranch)
|
||||
consume(parser, TOY_TOKEN_OPERATOR_PAREN_LEFT, "Expected '(' after 'for' keyword");
|
||||
consume(parser, TOY_TOKEN_KEYWORD_VAR, "Expected 'var' in 'for' conditional");
|
||||
|
||||
//WARN: duped from var declare
|
||||
consume(parser, TOY_TOKEN_NAME, "Expected variable name after 'var' keyword");
|
||||
|
||||
if (parser->previous.length > 255) {
|
||||
printError(parser, parser->previous, "Can't have a variable name longer than 255 characters");
|
||||
Toy_private_emitAstError(bucketHandle, rootHandle);
|
||||
return;
|
||||
}
|
||||
|
||||
Toy_Token nameToken = parser->previous;
|
||||
|
||||
//read the type specifier if present
|
||||
Toy_ValueType varType = TOY_VALUE_ANY;
|
||||
bool constant = false;
|
||||
|
||||
if (match(parser, TOY_TOKEN_OPERATOR_COLON)) {
|
||||
varType = readType(parser);
|
||||
if (match(parser, TOY_TOKEN_KEYWORD_CONST)) {
|
||||
constant = true;
|
||||
}
|
||||
}
|
||||
|
||||
//build the name string & emit a var declare
|
||||
Toy_String* nameStr = Toy_toStringLength(bucketHandle, nameToken.lexeme, nameToken.length);
|
||||
Toy_private_emitAstVariableDeclaration(bucketHandle, &condBranch, nameStr, varType, constant, NULL);
|
||||
|
||||
//continue to the 'in' keyword
|
||||
consume(parser, TOY_TOKEN_KEYWORD_IN, "Expected 'in' inside 'for' condition");
|
||||
makeExpr(bucketHandle, parser, &condBranch);
|
||||
|
||||
consume(parser, TOY_TOKEN_OPERATOR_PAREN_RIGHT, "Expected ')' after 'for' condition");
|
||||
|
||||
//TODO: check for an iterable node
|
||||
if (condBranch->type != TOY_AST_ITERABLE) {
|
||||
printError(parser, parser->previous, "Expected 'in' in for condition");
|
||||
Toy_private_emitAstError(bucketHandle, rootHandle);
|
||||
return;
|
||||
}
|
||||
|
||||
//{ thenBranch }
|
||||
makeDeclarationStmt(bucketHandle, parser, &thenBranch, true);
|
||||
@@ -1125,7 +1168,7 @@ static void makeStmt(Toy_Bucket** bucketHandle, Toy_Parser* parser, Toy_Ast** ro
|
||||
return;
|
||||
}
|
||||
|
||||
//TODO: import
|
||||
//import?
|
||||
|
||||
//print
|
||||
else if (match(parser, TOY_TOKEN_KEYWORD_PRINT)) {
|
||||
|
||||
Reference in New Issue
Block a user