✨
This commit is contained in:
Binary file not shown.
@ -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}
|
32
examples/pol_not_calc.plthy
Normal file
32
examples/pol_not_calc.plthy
Normal 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|
|
@ -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
|
||||||
|
@ -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 = [
|
||||||
|
@ -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):
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
[1, 2, 3]
|
{1;2;3;}
|
||||||
3
|
3
|
||||||
2
|
2
|
||||||
|
1
tests/22_reverse.expected
Normal file
1
tests/22_reverse.expected
Normal file
@ -0,0 +1 @@
|
|||||||
|
{5;4;3;2;1;}
|
10
tests/22_reverse.plthy
Normal file
10
tests/22_reverse.plthy
Normal 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
1
tests/23_int.expected
Normal file
@ -0,0 +1 @@
|
|||||||
|
4
|
4
tests/23_int.plthy
Normal file
4
tests/23_int.plthy
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
hello|
|
||||||
|
set '2' -> x|
|
||||||
|
do print<2 + do int<variable x;>;>|
|
||||||
|
goodbye|
|
Reference in New Issue
Block a user