|
|
@@ -224,16 +224,16 @@ static void cleanContext(Context* c) {
|
|
|
CLEAN_LIST(c, BreakContinue, loopJumps);
|
|
|
}
|
|
|
|
|
|
-[[noreturn]] static void unexpectedToken(Context* c, Token token, int line) {
|
|
|
+[[noreturn]] static void unexpectedToken(Context* c, Token token) {
|
|
|
char buffer[128];
|
|
|
tokenizerPrintToken(&token, buffer, sizeof(buffer));
|
|
|
- THROW_ERROR("Unexpected %s token %d", buffer, line);
|
|
|
+ THROW_ERROR("Unexpected %s token", buffer);
|
|
|
}
|
|
|
|
|
|
static Token consumeToken(Context* c, TokenType type) {
|
|
|
Token actual = tokenizerNext(c->tokenizer);
|
|
|
if(actual.type != type) {
|
|
|
- unexpectedToken(c, actual, __LINE__);
|
|
|
+ unexpectedToken(c, actual);
|
|
|
}
|
|
|
return actual;
|
|
|
}
|
|
|
@@ -290,7 +290,7 @@ static void compileConstant(Context* c) {
|
|
|
token = consumeToken(c, TT_LITERAL);
|
|
|
compileReadVariable(c, token, true);
|
|
|
} else {
|
|
|
- unexpectedToken(c, token, __LINE__);
|
|
|
+ unexpectedToken(c, token);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -385,9 +385,17 @@ static void compileIf(Context* c) {
|
|
|
compileExpression(c);
|
|
|
size_t posIndex = codePushInstructionI32(c, JUMP_ON_0, 0);
|
|
|
consumeNewline(c);
|
|
|
- while(!peekToken(c, TT_END)) {
|
|
|
+ while(!peekToken(c, TT_END) && !peekToken(c, TT_ELSE)) {
|
|
|
compileLine(c, tokenizerNext(c->tokenizer));
|
|
|
}
|
|
|
+ if(consumeTokenIf(c, TT_ELSE)) {
|
|
|
+ size_t elseEnd = codePushInstructionI32(c, JUMP, 0);
|
|
|
+ codeRewriteI32(c, posIndex, (i32)codeGetWritePosition(c));
|
|
|
+ posIndex = elseEnd;
|
|
|
+ while(!peekToken(c, TT_END)) {
|
|
|
+ compileLine(c, tokenizerNext(c->tokenizer));
|
|
|
+ }
|
|
|
+ }
|
|
|
consumeToken(c, TT_END);
|
|
|
consumeNewline(c);
|
|
|
codeRewriteI32(c, posIndex, (i32)codeGetWritePosition(c));
|
|
|
@@ -620,7 +628,7 @@ static void compileLine(Context* c, Token token) {
|
|
|
token = consumeToken(c, TT_LITERAL);
|
|
|
compileSetVariable(c, token.stringValue, true);
|
|
|
} else if(token.type != TT_LITERAL) {
|
|
|
- unexpectedToken(c, token, __LINE__);
|
|
|
+ unexpectedToken(c, token);
|
|
|
} else {
|
|
|
compileLineLiteral(c, token);
|
|
|
}
|