Skip to content

Commit

Permalink
Implemented FOR parsing.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Nov 17, 2017
1 parent eac13d7 commit 0772574
Showing 1 changed file with 55 additions and 1 deletion.
56 changes: 55 additions & 1 deletion mojobasic_parser.cpp
Expand Up @@ -106,6 +106,7 @@ class Parser
AstSubCallStatement *parseLine();
AstSubCallStatement *parseGetOrPut(const bool bIsGet);
AstIfStatement *parseIf();
AstForStatement *parseFor();
AstStatement *parseDo();
AstStatement *parseEnd();
AstExitStatement *parseExit();
Expand Down Expand Up @@ -423,7 +424,7 @@ AstStatement *Parser::parseStatement() {
else if (want(TOKEN_ON)) return parseOn();
//else if (want(TOKEN_REDIM)) return parseReDim();
else if (want(TOKEN_IF)) return parseIf();
//else if (want(TOKEN_FOR)) return parseFor();
else if (want(TOKEN_FOR)) return parseFor();
else if (want(TOKEN_DO)) return parseDo();
//else if (want(TOKEN_WHILE)) return parseWhile();
else if (want(TOKEN_SELECT)) return parseSelect();
Expand Down Expand Up @@ -774,6 +775,59 @@ AstStatement *Parser::parseOn() {
return failAndDumpStatement("Syntax error"); // !!! FIXME: "expected ERROR,etc"?
} // Parser::parseOn

AstForStatement *Parser::parseFor()
{
const SourcePosition position(previousToken.position);
// !!! FIXME: we should have a parseLValue for this?
const char *counter = need(TOKEN_IDENTIFIER, "Expected variable") ? previousToken.string : "x";
if (!counter) {
fail("Expected variable");
}

need(TOKEN_ASSIGN, "Expected '='");

AstExpression *lower = parseExpression();
if (!lower) {
fail("Expected expression");
lower = new AstIntLiteralExpression(position, 1);
}

need(TOKEN_TO, "Expected TO");

AstExpression *upper = parseExpression();
if (!upper) {
fail("Expected expression");
upper = new AstIntLiteralExpression(position, 1);
}

AstExpression *step = NULL;
if (want(TOKEN_STEP)) {
step = parseExpression();
if (!step) {
fail("Expected expression");
}
}

needEndOfStatement();

StatementCollector collector(currentToken.position);
while (true) {
if (!parseStatements(collector)) {
if (want(TOKEN_NEXT)) {
wantIdentifier(counter); // just drop this if it's here.
break;
} else if (want(TOKEN_EOI)) {
fail("Expected NEXT");
break;
} else {
failAndDumpStatement("Syntax error");
}
}
}

return new AstForStatement(position, counter, lower, upper, step, collector.newStatementBlock());
} // Parser::parseFor

AstStatement *Parser::parseDo() {
const SourcePosition position(previousToken.position);
AstExpression *cond = NULL;
Expand Down

0 comments on commit 0772574

Please sign in to comment.