diff --git a/documentation/plthy.pdf b/documentation/plthy.pdf index c0ac042..e08cd59 100644 Binary files a/documentation/plthy.pdf and b/documentation/plthy.pdf differ diff --git a/documentation/plthy.tex b/documentation/plthy.tex index e446aee..2ea4afe 100644 --- a/documentation/plthy.tex +++ b/documentation/plthy.tex @@ -57,5 +57,7 @@ \end{enumerate} \begin{enumerate}[label={\textbf{C\protect\threedigits{\theenumi}:}}, leftmargin = *] \item Because assertion incorrect + \item Unknown error + \item Incorrect type \end{enumerate} \end{document} \ No newline at end of file diff --git a/examples/pol_not_calc.plthy b/examples/pol_not_calc.plthy new file mode 100644 index 0000000..919f85a --- /dev/null +++ b/examples/pol_not_calc.plthy @@ -0,0 +1,32 @@ +hello| +define split<1> as [ + set {} -> list| + set '' -> word| + set 0 -> i| + do [ + do [ + set variable list + {variable word;} -> list| + set '' -> word| + ] else [ + set variable word + argument #1{variable i} -> word| + ] if argument #1{variable i} = ' '| + set variable i + 1 -> i| + ] until variable i = do len| + do skip else set variable list + {variable word;} -> list if variable word = ''| + return variable list| +]| + +define calc<1> as [ + set {} -> middle| + set 1 -> i| + do [ + set variable middle + {argument #1{variable i};} -> middle| + set variable i + 1 -> i| + ] until variable i = do len - 1| + return variable middle| +]| + +set do input<':';> -> x| +set do "split" -> list| +do print;>| +goodbye| \ No newline at end of file diff --git a/plthy_impl/ast_nodes.py b/plthy_impl/ast_nodes.py index 4dd155a..4087961 100644 --- a/plthy_impl/ast_nodes.py +++ b/plthy_impl/ast_nodes.py @@ -7,7 +7,10 @@ BUILTIN_ARGS = { "print": "*", "input" : "*", "random": 2, - "len": 1 + "len": 1, + "int": 1, + "str": 1, + "flo": 1 } def rep_join(l): @@ -36,6 +39,26 @@ class ExpInt(Exp): def eval(self, vtable, ftable): return vtable, ftable, self.value +class ExpFloat(Exp): + def __init__(self, value: int): + self.value = value + + def __repr__(self) -> str: + return f"exp_float({self.value})" + + def eval(self, vtable, ftable): + return vtable, ftable, self.value + +class ExpBool(Exp): + def __init__(self, value: int): + self.value = value + + def __repr__(self) -> str: + return f"exp_bool({self.value})" + + def eval(self, vtable, ftable): + return vtable, ftable, self.value + class ExpString(Exp): def __init__(self, value: str): self.value = value @@ -67,23 +90,11 @@ class ExpABinop(Exp): def eval(self, vtable, ftable): vtable, ftable, r1 = self.exp1.eval(vtable, ftable) - if isinstance(r1,str): - if r1.isdigit(): - r1 = int(r1) - else: - try: - r1 = float(r1) - except ValueError: - pass vtable, ftable, r2 = self.exp2.eval(vtable, ftable) - if isinstance(r2,str): - if r2.isdigit(): - r2 = int(r2) - else: - try: - r2 = float(r2) - except ValueError: - pass + + if not (type(r1) is type(r2) or (type(r1) is float and type(r2) is int) or (type(r1) is int and type(r2) is float)): + print(f"C003: Incorrect type pairing {type(r1)} and {type(r2)} for {self.op}") + if self.op == "+": return vtable, ftable, r1+r2 elif self.op == "-": @@ -175,7 +186,14 @@ class Builtin(Command): prints = [] for arg in self.args: vtable, ftable, result = arg.eval(vtable, ftable) - prints.append(str(result)) + if isinstance(result, str) or isinstance(result, int) or isinstance(result, float): + prints.append(str(result)) + elif isinstance(result, list): + result = f"{'{'}{''.join([str(i)+";" for i in result])}{'}'}" + prints.append(str(result)) + else: + print(f"C003: Incorrect type {type(result)} for builtin print") + exit() print(" ".join(prints)) @@ -204,6 +222,10 @@ class Builtin(Command): vtable, ftable, result = self.args[0].eval(vtable,ftable) return vtable, ftable, len(result) + elif self.builtin == "int": + vtable, ftable, result = self.args[0].eval(vtable,ftable) + + return vtable, ftable, int(result) else: raise Exception(f"Unknown builtin {self.builtin}") @@ -281,7 +303,6 @@ class Scope(Statement): vtable, ftable, _ = statement.eval(vtable, ftable) if "#return" in vtable: result = vtable["#return"] - del vtable["#return"] break return vtable, ftable, result @@ -417,6 +438,12 @@ class Program(BaseBox): ftable = {} for statement in self.statements: - vtable, ftable, _ = statement.eval(vtable, ftable) + try: + vtable, ftable, _ = statement.eval(vtable, ftable) + except Exception as e: + print(f"C002: Unknown error in statement {statement}") + raise e if "#return" in vtable: - break + del vtable["#return"] + if not isinstance(vtable,Scope): + break diff --git a/plthy_impl/lexer.py b/plthy_impl/lexer.py index 6774483..2a9565a 100644 --- a/plthy_impl/lexer.py +++ b/plthy_impl/lexer.py @@ -25,13 +25,18 @@ BUILTIN_TOKENS = [("BUILTIN", i+"<") for i in [ "print", "input", "random", - "len" + "len", + "int", + "str", + "flo" ]] DATA_TOKENS = [ ("DATA_STRING", r"\'.*?\'"), ("DATA_INT", r"\d+"), - ("DATA_FLOAT", r"\d+(\.\d+)") + ("DATA_FLOAT", r"\d+(\.\d+)"), + ("DATA_BOOL", "true"), + ("DATA_BOOL", "false") ] SYMBOL_TOKENS = [ diff --git a/plthy_impl/parser.py b/plthy_impl/parser.py index 12c771c..e799d72 100644 --- a/plthy_impl/parser.py +++ b/plthy_impl/parser.py @@ -106,9 +106,12 @@ class Parser(): @self.pg.production('expression : DATA_FLOAT') def exp_float(tokens): - return ast_nodes.ExpInt(float(tokens[0].value)) + return ast_nodes.ExpFloat(float(tokens[0].value)) - # Boolean + @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') def exp_list(tokens): diff --git a/tests/12_list.expected b/tests/12_list.expected index 58a437d..9229c15 100644 --- a/tests/12_list.expected +++ b/tests/12_list.expected @@ -1,3 +1,3 @@ -[1, 2, 3] +{1;2;3;} 3 2 diff --git a/tests/22_reverse.expected b/tests/22_reverse.expected new file mode 100644 index 0000000..1e7a6a2 --- /dev/null +++ b/tests/22_reverse.expected @@ -0,0 +1 @@ +{5;4;3;2;1;} diff --git a/tests/22_reverse.plthy b/tests/22_reverse.plthy new file mode 100644 index 0000000..0dcec73 --- /dev/null +++ b/tests/22_reverse.plthy @@ -0,0 +1,10 @@ +hello| +set {1;2;3;4;5;} -> list| +set {} -> reversed| +set 0 -> i| +do [ + set {variable list{variable i};} + variable reversed -> reversed| + set variable i + 1 -> i| +] until variable i = do len| +do print| +goodbye| \ No newline at end of file diff --git a/tests/23_int.expected b/tests/23_int.expected new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/tests/23_int.expected @@ -0,0 +1 @@ +4 diff --git a/tests/23_int.plthy b/tests/23_int.plthy new file mode 100644 index 0000000..fd21060 --- /dev/null +++ b/tests/23_int.plthy @@ -0,0 +1,4 @@ +hello| +set '2' -> x| +do print<2 + do int;>| +goodbye| \ No newline at end of file