diff --git a/src/main/java/de/neemann/digital/hdl/hgs/Parser.java b/src/main/java/de/neemann/digital/hdl/hgs/Parser.java index 137dd9b8c..455e67365 100644 --- a/src/main/java/de/neemann/digital/hdl/hgs/Parser.java +++ b/src/main/java/de/neemann/digital/hdl/hgs/Parser.java @@ -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)) diff --git a/src/main/java/de/neemann/digital/hdl/hgs/Tokenizer.java b/src/main/java/de/neemann/digital/hdl/hgs/Tokenizer.java index 5cfa18a1b..a02512864 100644 --- a/src/main/java/de/neemann/digital/hdl/hgs/Tokenizer.java +++ b/src/main/java/de/neemann/digital/hdl/hgs/Tokenizer.java @@ -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 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; diff --git a/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java b/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java index ee8829e59..0dbffce86 100644 --- a/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java +++ b/src/test/java/de/neemann/digital/hdl/hgs/ParserTest.java @@ -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 World!"); + assertEquals("Hello 0123456789 World!", c.toString()); + } + public void testParseTemplateArray() throws IOException, ParserException, HGSEvalException { Context c = exec(";"); assertEquals("7,2;", c.toString());