Skip to content

Commit

Permalink
Implement WHILE/WEND parsing.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Nov 21, 2017
1 parent b23ff70 commit bc33189
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
3 changes: 2 additions & 1 deletion mojobasic_internal.h
Expand Up @@ -511,7 +511,8 @@ enum Token
TOKEN_GET,
TOKEN_PUT,
TOKEN_STEP,
TOKEN_USING
TOKEN_USING,
TOKEN_WEND
};


Expand Down
27 changes: 26 additions & 1 deletion mojobasic_parser.cpp
Expand Up @@ -109,6 +109,7 @@ class Parser
AstIfStatement *parseIf();
AstForStatement *parseFor();
AstStatement *parseDo();
AstStatement *parseWhile();
AstStatement *parseEnd();
AstExitStatement *parseExit();
AstSelectStatement *parseSelect();
Expand Down Expand Up @@ -286,6 +287,7 @@ void Parser::convertToParserToken(TokenData &data)
TOKENCMP(PUT);
TOKENCMP(STEP);
TOKENCMP(USING);
TOKENCMP(WEND);
#undef TOKENCMP
} // if
} // Parser::convertToParserToken
Expand Down Expand Up @@ -446,7 +448,7 @@ AstStatement *Parser::parseStatement() {
else if (want(TOKEN_IF)) return parseIf();
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_WHILE)) return parseWhile();
else if (want(TOKEN_SELECT)) return parseSelect();
else if (want(TOKEN_EXIT)) return parseExit();
else if (want(TOKEN_END)) return parseEnd();
Expand Down Expand Up @@ -898,6 +900,29 @@ AstStatement *Parser::parseDo() {
return new AstDoStatement(position, bIsConditionalAtStart, bIsWhile, collector.newStatementBlock(), cond);
} // Parser::parseDo

AstStatement *Parser::parseWhile() {
const SourcePosition position(previousToken.position);
AstExpression *cond = parseExpression();

needEndOfStatement();

StatementCollector collector(currentToken.position);
while (true) {
if (!parseStatements(collector)) {
if (want(TOKEN_WEND)) {
break;
} else if (want(TOKEN_EOI)) {
fail("Expected WEND");
break;
} else {
failAndDumpStatement("Syntax error");
}
}
}

return new AstWhileStatement(position, cond, collector.newStatementBlock());
} // Parser::parseWhile

AstSelectStatement *Parser::parseSelect()
{
const SourcePosition position(previousToken.position);
Expand Down
1 change: 1 addition & 0 deletions mojobasic_preprocessor.cpp
Expand Up @@ -236,6 +236,7 @@ static void MOJOBASIC_print_debug_token(const char *subsystem, const char *token
TOKENCASE(TOKEN_PUT);
TOKENCASE(TOKEN_STEP);
TOKENCASE(TOKEN_USING);
TOKENCASE(TOKEN_WEND);
#undef TOKENCASE

default:
Expand Down

0 comments on commit bc33189

Please sign in to comment.