From 3979f563aa537af01b8ce674e532d4c67c34e35e Mon Sep 17 00:00:00 2001 From: Russell Joyce Date: Thu, 18 Jun 2020 17:05:10 +0100 Subject: [PATCH] Added support for commas in for loop update statement --- c-tests/loop-comma.c | 12 ++++++++++++ parse.c | 8 ++++++++ 2 files changed, 20 insertions(+) create mode 100644 c-tests/loop-comma.c diff --git a/c-tests/loop-comma.c b/c-tests/loop-comma.c new file mode 100644 index 0000000..8c089e6 --- /dev/null +++ b/c-tests/loop-comma.c @@ -0,0 +1,12 @@ +int main(void) +{ + int i = 0; + int j = 0; + int k = 0; + + for (i = 0; i < 2; i++, j++) { + k += 2; + } + + return k - (j * 2); +} diff --git a/parse.c b/parse.c index 70fd420..c2cb0bf 100644 --- a/parse.c +++ b/parse.c @@ -509,6 +509,10 @@ void ParseFor(struct ParseState *Parser) ParserCopyPos(&PreIncrement, Parser); ParseStatementMaybeRun(Parser, false, false); + while (LexGetToken(Parser, NULL, false) == TokenComma) { + LexGetToken(Parser, NULL, true); + ParseStatementMaybeRun(Parser, false, false); + } if (LexGetToken(Parser, NULL, true) != TokenCloseBracket) ProgramFail(Parser, "')' expected"); @@ -525,6 +529,10 @@ void ParseFor(struct ParseState *Parser) while (Condition && Parser->Mode == RunModeRun) { ParserCopyPos(Parser, &PreIncrement); ParseStatement(Parser, false); + while (LexGetToken(Parser, NULL, false) == TokenComma) { + LexGetToken(Parser, NULL, true); + ParseStatement(Parser, false); + } ParserCopyPos(Parser, &PreConditional); if (LexGetToken(Parser, NULL, false) == TokenSemicolon)