From ad9435b12dc51e05aec02a5d4cb990041ba0962a Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Fri, 12 Apr 2024 16:17:58 +0200 Subject: [PATCH] :sparkles: --- examples/pol_not_calc.plthy | 34 +++++++++++++++++++++++++------- plthy_impl/ast_nodes.py | 17 ++++++++++++++-- plthy_impl/parser.py | 1 - tests/04_scope.expected | 1 + tests/04_scope.plthy | 2 ++ tests/24_function_scope.expected | 1 + tests/24_function_scope.plthy | 5 +++++ 7 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 tests/24_function_scope.expected create mode 100644 tests/24_function_scope.plthy diff --git a/examples/pol_not_calc.plthy b/examples/pol_not_calc.plthy index aa323b0..1d74e96 100644 --- a/examples/pol_not_calc.plthy +++ b/examples/pol_not_calc.plthy @@ -21,10 +21,12 @@ define is_number<1> as [ set 0 -> i| do [ set 0 -> j| + set false -> num| do [ - do skip else return false if argument #1{variable i} = variable numbers{variable j}| + do set true -> num else skip if argument #1{variable i} = variable numbers{variable j}| set variable j + 1 -> j| ] until variable j = do len| + do skip else return false if variable num| set variable i + 1 -> i| ] until variable i = do len| return true| @@ -48,13 +50,31 @@ define unfold<1> as [ set {} -> n1l| set 1 -> n| - set 0 -> i| + set 0 -> k| do [ - set variable i+1 -> i| - set variable n1l + {argument #1{variable i};} -> n1l| - do skip else set variable n+2 -> n if do "is_number"| - ] until variable n = variable i| - do print| + set variable k+1 -> k| + set variable n1l + {argument #1{variable k};} -> n1l| + do skip else set variable n+2 -> n if do "is_number"| + ] until variable n = variable k| + + set {} -> n2l| + set variable n+1 -> n| + do [ + set variable k+1 -> k| + set variable n2l + {argument #1{variable k};} -> n2l| + do skip else set variable n+2 -> n if do "is_number"| + ] until variable n = variable k| + + do print| + + set do "unfold" -> n1| + do return 'error' if do str='error'| + + set do "unfold" -> n2| + do return 'error' if do str='error'| + + do print|skip| + return do "calc"| ]| set do input<':';> -> x| diff --git a/plthy_impl/ast_nodes.py b/plthy_impl/ast_nodes.py index dd56b6a..a5c5903 100644 --- a/plthy_impl/ast_nodes.py +++ b/plthy_impl/ast_nodes.py @@ -226,6 +226,10 @@ class Builtin(Command): vtable, ftable, result = self.args[0].eval(vtable,ftable) return vtable, ftable, int(result) + elif self.builtin == "str": + vtable, ftable, result = self.args[0].eval(vtable,ftable) + + return vtable, ftable, str(result) else: raise Exception(f"Unknown builtin {self.builtin}") @@ -298,9 +302,14 @@ class Scope(Statement): return f"scope([{rep_join(self.statements)}])" def eval(self, vtable, ftable): + if "#return" in vtable: + del vtable["#return"] + result = None for statement in self.statements: + # print(statement) vtable, ftable, _ = statement.eval(vtable, ftable) + # print(statement, vtable) if "#return" in vtable: result = vtable["#return"] break @@ -330,6 +339,7 @@ class Call(Statement): vtable["#ARGS"] += len(args) + vtable_old, ftable_old = vtable, ftable vtable, ftable, result = ftable[self.function_name][1].eval(vtable, ftable) if "#return" in vtable: @@ -337,7 +347,8 @@ class Call(Statement): vtable["#ARGS"] -= len(args) - return vtable, ftable, result + print(vtable, vtable_old) + return vtable_old, ftable_old, result class CommandIf(Command): def __init__(self, statement: Statement, condition): @@ -395,13 +406,15 @@ class CommandUntil(Command): return f"until({self.statement}, {self.condition})" def eval(self, vtable, ftable): + if "#return" in vtable: + del vtable["#return"] + while True: vtable, ftable, result = self.condition.eval(vtable, ftable) if not result: vtable, ftable, _ = self.statement.eval(vtable, ftable) if "#return" in vtable: result = vtable["#return"] - del vtable["#return"] return vtable, ftable, result else: return vtable, ftable, result diff --git a/plthy_impl/parser.py b/plthy_impl/parser.py index e799d72..793a464 100644 --- a/plthy_impl/parser.py +++ b/plthy_impl/parser.py @@ -110,7 +110,6 @@ class Parser(): @self.pg.production('expression : DATA_BOOL') def exp_bool(tokens): - return ast_nodes.ExpBool(tokens[0].value == "true") @self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL') diff --git a/tests/04_scope.expected b/tests/04_scope.expected index 7ed6ff8..fd3c81a 100644 --- a/tests/04_scope.expected +++ b/tests/04_scope.expected @@ -1 +1,2 @@ 5 +5 diff --git a/tests/04_scope.plthy b/tests/04_scope.plthy index 346168d..b9412cf 100644 --- a/tests/04_scope.plthy +++ b/tests/04_scope.plthy @@ -1,6 +1,8 @@ hello| +set 1 -> x| [ set 5 -> x| do print| ]| +do print| goodbye| \ No newline at end of file diff --git a/tests/24_function_scope.expected b/tests/24_function_scope.expected new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/tests/24_function_scope.expected @@ -0,0 +1 @@ +1 diff --git a/tests/24_function_scope.plthy b/tests/24_function_scope.plthy new file mode 100644 index 0000000..0f91416 --- /dev/null +++ b/tests/24_function_scope.plthy @@ -0,0 +1,5 @@ +hello| +set 1 -> x| +define f<0> as set 2 -> x| +do print| +goodbye| \ No newline at end of file