added repeat until

This commit is contained in:
hneemann 2018-03-15 18:49:52 +01:00
parent 1b6c3d6e64
commit a09ca163b3
3 changed files with 19 additions and 1 deletions

View File

@ -168,6 +168,16 @@ public class Parser {
return c -> {
while (Value.toBool(cond.value(c))) inner.execute(c);
};
} else if (nextIs(REPEAT)) {
Statement inner = parseStatement();
expect(UNTIL);
Expression cond = parseExpression();
if (isRealStatement) expect(SEMICOLON);
return c -> {
do {
inner.execute(c);
} while (!Value.toBool(cond.value(c)));
};
} else if (nextIs(OPENBRACE)) {
Statements s = new Statements();
while (!nextIs(CLOSEDBRACE))

View File

@ -17,7 +17,8 @@ class Tokenizer {
enum Token {
UNKNOWN, IDENT, AND, OR, XOR, NOT, OPEN, CLOSE, NUMBER, EOL, EOF, SHIFTLEFT, SHIFTRIGHT, COMMA, EQUAL,
ADD, SUB, MUL, GREATER, LESS, DIV, MOD, END, IF, ELSE, FOR, WHILE, SEMICOLON, NOTEQUAL, STRING,
OPENBRACE, CLOSEDBRACE, CODEEND, OPENSQUARE, CLOSEDSQUARE, DOT, PRINT, STATIC, FUNC, PRINTF, GREATEREQUAL, LESSEQUAL, PANIC
OPENBRACE, CLOSEDBRACE, CODEEND, OPENSQUARE, CLOSEDSQUARE, DOT, PRINT, STATIC, FUNC, PRINTF,
GREATEREQUAL, LESSEQUAL, REPEAT, UNTIL, PANIC
}
private static HashMap<String, Token> statementMap = new HashMap<>();
@ -31,6 +32,8 @@ class Tokenizer {
statementMap.put("printf", Token.PRINTF);
statementMap.put("func", Token.FUNC);
statementMap.put("panic", Token.PANIC);
statementMap.put("repeat", Token.REPEAT);
statementMap.put("until", Token.UNTIL);
}
private final Reader in;

View File

@ -184,6 +184,11 @@ public class ParserTest extends TestCase {
assertEquals("Hello 0123456789 World!", c.toString());
}
public void testParseTemplateRepeat() throws IOException, ParserException, HGSEvalException {
Context c = exec("Hello <? i=0; repeat { =i; i++; } until i=10; ?> World!");
assertEquals("Hello 0123456789 World!", c.toString());
}
public void testParseTemplateArray() throws IOException, ParserException, HGSEvalException {
Context c = exec("<? a=newList(); a[0]=1; a[1]=7; print(a[1], \",\" ,sizeOf(a)); ?>;");
assertEquals("7,2;", c.toString());