From 6234f3fb505731edbbadfc335363085599b65f64 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Fri, 23 Feb 2024 16:00:19 +0100 Subject: [PATCH] :sparkles: --- documentation/plthy.pdf | Bin 20709 -> 21095 bytes documentation/plthy.tex | 2 ++ examples/pol_not_calc.plthy | 32 +++++++++++++++++ plthy_impl/ast_nodes.py | 69 +++++++++++++++++++++++++----------- plthy_impl/lexer.py | 9 +++-- plthy_impl/parser.py | 7 ++-- tests/12_list.expected | 2 +- tests/22_reverse.expected | 1 + tests/22_reverse.plthy | 10 ++++++ tests/23_int.expected | 1 + tests/23_int.plthy | 4 +++ 11 files changed, 111 insertions(+), 26 deletions(-) create mode 100644 examples/pol_not_calc.plthy create mode 100644 tests/22_reverse.expected create mode 100644 tests/22_reverse.plthy create mode 100644 tests/23_int.expected create mode 100644 tests/23_int.plthy diff --git a/documentation/plthy.pdf b/documentation/plthy.pdf index c0ac042daaef455ec25f4e8dde9d58ab521ae87f..e08cd59bbfcfc5d6bfa951ecd143a23ffe31e460 100644 GIT binary patch delta 9520 zcmai(Q*@_K@TX(jn%K5&V`AH$c!D>!zp-sjjES90Y)x!q;$(mS-J9L3z3S?7x~k8q zr>j1vyAKP&k4wN4c_4V$lK2P##-5;X2*^BWZjRQbVVL5y(I|lo8vuw&pP9cY)T-`c zV}%*0P+;8NQ>VB8jB zB3^a5lL6T)l=pSt*Ac!i<}!U-{XWpqU%waS<`GSD>z=a9Gnnw@|GonJ+t~l-Xg)9S z`@{J@S+`*WoOd6i^;pSnviXP9-O9h~%cuBYDC!)surk<0@|M4sY1!7>f$&zoGmI;% z6KtSbtu8tKjIv?17?V%BiGe5H(5(ZNe9eXQ-6@x-XA_a$_xFU=K2Bt?T?}S!xZHqY zR1<6FfE!a-I&c6yx6>I=N{x3ljcFBA+ArqY{rX+5{`y5^2^0TUzfe%!NRvT%cl;L8 z23>Z#7XAau-l8S^M*W1=yA4XSuM0{JOAy2yY*A5=(Hu`JIW8-PU*?r>`*U`=&Oj9W zequBDY5@MV51V1bRFk7?@RtUeoHPP~c~U4u>(jaFY*x^db08$(zbVC9L$c^*83$SI z?>;zksk4Q~<-d+l!GsvFcfHP`{2}z8n>6eH8MVy%T0Y}1O)sxA7XKi=f1tp#2uhmT zsiFP4fI46=!hy&bf}y89*vWJ+q^{xp!x@F_;Jn

mte$87E+ZLo<<)EMb>6d+XYl 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 delta 9125 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 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