✨
This commit is contained in:
Binary file not shown.
@ -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}
|
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": "*",
|
||||
"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)
|
||||
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:
|
||||
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:
|
||||
del vtable["#return"]
|
||||
if not isinstance(vtable,Scope):
|
||||
break
|
||||
|
@ -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 = [
|
||||
|
@ -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):
|
||||
|
@ -1,3 +1,3 @@
|
||||
[1, 2, 3]
|
||||
{1;2;3;}
|
||||
3
|
||||
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