This commit is contained in:
2024-02-23 16:00:19 +01:00
parent 1a793bebe7
commit 6234f3fb50
11 changed files with 111 additions and 26 deletions

Binary file not shown.

View File

@ -57,5 +57,7 @@
\end{enumerate} \end{enumerate}
\begin{enumerate}[label={\textbf{C\protect\threedigits{\theenumi}:}}, leftmargin = *] \begin{enumerate}[label={\textbf{C\protect\threedigits{\theenumi}:}}, leftmargin = *]
\item Because assertion incorrect \item Because assertion incorrect
\item Unknown error
\item Incorrect type
\end{enumerate} \end{enumerate}
\end{document} \end{document}

View File

@ -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<argument #1;>|
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<argument #1;> - 1|
return variable middle|
]|
set do input<':';> -> x|
set do "split"<variable x;> -> list|
do print<do "calc"<variable list;>;>|
goodbye|

View File

@ -7,7 +7,10 @@ BUILTIN_ARGS = {
"print": "*", "print": "*",
"input" : "*", "input" : "*",
"random": 2, "random": 2,
"len": 1 "len": 1,
"int": 1,
"str": 1,
"flo": 1
} }
def rep_join(l): def rep_join(l):
@ -36,6 +39,26 @@ class ExpInt(Exp):
def eval(self, vtable, ftable): def eval(self, vtable, ftable):
return vtable, ftable, self.value 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): class ExpString(Exp):
def __init__(self, value: str): def __init__(self, value: str):
self.value = value self.value = value
@ -67,23 +90,11 @@ class ExpABinop(Exp):
def eval(self, vtable, ftable): def eval(self, vtable, ftable):
vtable, ftable, r1 = self.exp1.eval(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) vtable, ftable, r2 = self.exp2.eval(vtable, ftable)
if isinstance(r2,str):
if r2.isdigit(): 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)):
r2 = int(r2) print(f"C003: Incorrect type pairing {type(r1)} and {type(r2)} for {self.op}")
else:
try:
r2 = float(r2)
except ValueError:
pass
if self.op == "+": if self.op == "+":
return vtable, ftable, r1+r2 return vtable, ftable, r1+r2
elif self.op == "-": elif self.op == "-":
@ -175,7 +186,14 @@ class Builtin(Command):
prints = [] prints = []
for arg in self.args: for arg in self.args:
vtable, ftable, result = arg.eval(vtable, ftable) 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)) print(" ".join(prints))
@ -204,6 +222,10 @@ class Builtin(Command):
vtable, ftable, result = self.args[0].eval(vtable,ftable) vtable, ftable, result = self.args[0].eval(vtable,ftable)
return vtable, ftable, len(result) return vtable, ftable, len(result)
elif self.builtin == "int":
vtable, ftable, result = self.args[0].eval(vtable,ftable)
return vtable, ftable, int(result)
else: else:
raise Exception(f"Unknown builtin {self.builtin}") raise Exception(f"Unknown builtin {self.builtin}")
@ -281,7 +303,6 @@ class Scope(Statement):
vtable, ftable, _ = statement.eval(vtable, ftable) vtable, ftable, _ = statement.eval(vtable, ftable)
if "#return" in vtable: if "#return" in vtable:
result = vtable["#return"] result = vtable["#return"]
del vtable["#return"]
break break
return vtable, ftable, result return vtable, ftable, result
@ -417,6 +438,12 @@ class Program(BaseBox):
ftable = {} ftable = {}
for statement in self.statements: 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: if "#return" in vtable:
break del vtable["#return"]
if not isinstance(vtable,Scope):
break

View File

@ -25,13 +25,18 @@ BUILTIN_TOKENS = [("BUILTIN", i+"<") for i in [
"print", "print",
"input", "input",
"random", "random",
"len" "len",
"int",
"str",
"flo"
]] ]]
DATA_TOKENS = [ DATA_TOKENS = [
("DATA_STRING", r"\'.*?\'"), ("DATA_STRING", r"\'.*?\'"),
("DATA_INT", r"\d+"), ("DATA_INT", r"\d+"),
("DATA_FLOAT", r"\d+(\.\d+)") ("DATA_FLOAT", r"\d+(\.\d+)"),
("DATA_BOOL", "true"),
("DATA_BOOL", "false")
] ]
SYMBOL_TOKENS = [ SYMBOL_TOKENS = [

View File

@ -106,9 +106,12 @@ class Parser():
@self.pg.production('expression : DATA_FLOAT') @self.pg.production('expression : DATA_FLOAT')
def exp_float(tokens): 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') @self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL')
def exp_list(tokens): def exp_list(tokens):

View File

@ -1,3 +1,3 @@
[1, 2, 3] {1;2;3;}
3 3
2 2

View File

@ -0,0 +1 @@
{5;4;3;2;1;}

10
tests/22_reverse.plthy Normal file
View File

@ -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<variable list;>|
do print<variable reversed;>|
goodbye|

1
tests/23_int.expected Normal file
View File

@ -0,0 +1 @@
4

4
tests/23_int.plthy Normal file
View File

@ -0,0 +1,4 @@
hello|
set '2' -> x|
do print<2 + do int<variable x;>;>|
goodbye|