mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-18 09:24:42 -04:00
added repeat until
This commit is contained in:
parent
1b6c3d6e64
commit
a09ca163b3
@ -168,6 +168,16 @@ public class Parser {
|
|||||||
return c -> {
|
return c -> {
|
||||||
while (Value.toBool(cond.value(c))) inner.execute(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)) {
|
} else if (nextIs(OPENBRACE)) {
|
||||||
Statements s = new Statements();
|
Statements s = new Statements();
|
||||||
while (!nextIs(CLOSEDBRACE))
|
while (!nextIs(CLOSEDBRACE))
|
||||||
|
@ -17,7 +17,8 @@ class Tokenizer {
|
|||||||
enum Token {
|
enum Token {
|
||||||
UNKNOWN, IDENT, AND, OR, XOR, NOT, OPEN, CLOSE, NUMBER, EOL, EOF, SHIFTLEFT, SHIFTRIGHT, COMMA, EQUAL,
|
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,
|
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<>();
|
private static HashMap<String, Token> statementMap = new HashMap<>();
|
||||||
@ -31,6 +32,8 @@ class Tokenizer {
|
|||||||
statementMap.put("printf", Token.PRINTF);
|
statementMap.put("printf", Token.PRINTF);
|
||||||
statementMap.put("func", Token.FUNC);
|
statementMap.put("func", Token.FUNC);
|
||||||
statementMap.put("panic", Token.PANIC);
|
statementMap.put("panic", Token.PANIC);
|
||||||
|
statementMap.put("repeat", Token.REPEAT);
|
||||||
|
statementMap.put("until", Token.UNTIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Reader in;
|
private final Reader in;
|
||||||
|
@ -184,6 +184,11 @@ public class ParserTest extends TestCase {
|
|||||||
assertEquals("Hello 0123456789 World!", c.toString());
|
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 {
|
public void testParseTemplateArray() throws IOException, ParserException, HGSEvalException {
|
||||||
Context c = exec("<? a=newList(); a[0]=1; a[1]=7; print(a[1], \",\" ,sizeOf(a)); ?>;");
|
Context c = exec("<? a=newList(); a[0]=1; a[1]=7; print(a[1], \",\" ,sizeOf(a)); ?>;");
|
||||||
assertEquals("7,2;", c.toString());
|
assertEquals("7,2;", c.toString());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user