diff --git a/main.py b/main.py index 693cb8c..8f350ba 100644 --- a/main.py +++ b/main.py @@ -450,6 +450,15 @@ class Parser: if lexeme == "next": self._handle_next_control() continue + if lexeme == "begin": + self._handle_begin_control() + continue + if lexeme == "while": + self._handle_while_control() + continue + if lexeme == "repeat": + self._handle_repeat_control() + continue if self._maybe_expand_macro(token): continue self._handle_token(token) @@ -723,6 +732,22 @@ class Parser: entry = self._pop_control(("for",)) self._append_node(ForNext(loop_label=entry["loop"], end_label=entry["end"])) + def _handle_begin_control(self) -> None: + begin_label = self._new_label("begin") + end_label = self._new_label("end") + self._append_node(Label(name=begin_label)) + self._push_control({"type": "begin", "begin": begin_label, "end": end_label}) + + def _handle_while_control(self) -> None: + entry = self._pop_control(("begin",)) + self._append_node(BranchZero(target=entry["end"])) + self._push_control(entry) + + def _handle_repeat_control(self) -> None: + entry = self._pop_control(("begin",)) + self._append_node(Jump(target=entry["begin"])) + self._append_node(Label(name=entry["end"])) + def _begin_definition(self, token: Token) -> None: if self._eof(): raise ParseError(f"definition name missing after ':' at {token.line}:{token.column}") diff --git a/while_test.sl b/while_test.sl new file mode 100644 index 0000000..8555f83 --- /dev/null +++ b/while_test.sl @@ -0,0 +1,13 @@ +import stdlib/stdlib.sl +import stdlib/io.sl + +: main + 10 + begin + dup 0 > + while + dup puti cr + 1 - + repeat + drop +; \ No newline at end of file