This commit is contained in:
2024-02-23 15:00:52 +01:00
parent f394a9cde2
commit 1a793bebe7
9 changed files with 114 additions and 10 deletions

View File

@ -6,7 +6,8 @@ from rply.token import BaseBox
BUILTIN_ARGS = {
"print": "*",
"input" : "*",
"random": 2
"random": 2,
"len": 1
}
def rep_join(l):
@ -70,13 +71,19 @@ class ExpABinop(Exp):
if r1.isdigit():
r1 = int(r1)
else:
r1 = float(r1)
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:
r2 = float(r2)
try:
r2 = float(r2)
except ValueError:
pass
if self.op == "+":
return vtable, ftable, r1+r2
elif self.op == "-":
@ -91,6 +98,8 @@ class ExpABinop(Exp):
return vtable, ftable, r1 > r2
elif self.op == "<":
return vtable, ftable, r1 < r2
elif self.op == "mod":
return vtable, ftable, r1 % r2
else:
raise Exception(f"Unknown binop {self.op}")
@ -149,7 +158,7 @@ class Command(BaseBox):
class Builtin(Command):
def __init__(self, builtin, args: list[Exp]):
self.builtin = builtin.value
self.builtin = builtin.value[:-1]
self.args = args
self.position = builtin.source_pos.lineno
expected_args = BUILTIN_ARGS[self.builtin]
@ -191,6 +200,10 @@ class Builtin(Command):
r = random.randint(r1, r2)
return vtable, ftable, r
elif self.builtin == "len":
vtable, ftable, result = self.args[0].eval(vtable,ftable)
return vtable, ftable, len(result)
else:
raise Exception(f"Unknown builtin {self.builtin}")

View File

@ -21,10 +21,11 @@ KEYWORD_TOKENS = [("KEYWORD_"+i.upper(), i) for i in [
"else"
]]
BUILTIN_TOKENS = [("BUILTIN", i) for i in [
BUILTIN_TOKENS = [("BUILTIN", i+"<") for i in [
"print",
"input",
"random"
"random",
"len"
]]
DATA_TOKENS = [
@ -56,6 +57,7 @@ SYMBOL_TOKENS = [
("SYMBOL_LT", r"\<"),
("SYMBOL_GT", r"\>"),
("SYMBOL_EQUALS", r"\="),
("SYMBOL_MOD", r"mod")
# ("SYMBOL_DOLLAR", r"\$")
]

View File

@ -8,12 +8,12 @@ class Parser():
self.pg = ParserGenerator(
[i[0] for i in ALL_TOKENS],
precedence=[
('left', ["KEYWORD_SET", "SYMBOL_SET", "KEYWORD_IF", "KEYWORD_MAYBE", "KEYWORD_RETURN"]),
('left', ["KEYWORD_SET","KEYWORD_IF", "KEYWORD_MAYBE", "KEYWORD_RETURN"]),
('left', [ "KEYWORD_BECAUSE", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]),
('left', ["KEYWORD_DO", "BUILTIN"]),
('left', ["SYMBOL_EQUALS", "SYMBOL_LT","SYMBOL_GT"]),
('left', ["SYMBOL_PLUS", "SYMBOL_MINUS", "SYMBOL_OR", "SYMBOL_AND"]),
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE", "SYMBOL_TILDE"])
('left', ["SYMBOL_LCURL", "SYMBOL_TIMES", "SYMBOL_DIVIDE", "SYMBOL_TILDE", "SYMBOL_MOD", "ID"])
]
)
@ -78,9 +78,9 @@ class Parser():
def command_until(tokens):
return ast_nodes.CommandUntil(tokens[0],tokens[2])
@self.pg.production('command : BUILTIN SYMBOL_LT expressions SYMBOL_GT')
@self.pg.production('command : BUILTIN expressions SYMBOL_GT')
def command_builtin(tokens):
return ast_nodes.Builtin(tokens[0], tokens[2])
return ast_nodes.Builtin(tokens[0], tokens[1])
@self.pg.production('command : SYMBOL_QUOTE ID SYMBOL_QUOTE SYMBOL_LT expressions SYMBOL_GT')
def command_call(tokens):
@ -129,6 +129,7 @@ class Parser():
@self.pg.production('expression : expression SYMBOL_EQUALS expression')
@self.pg.production('expression : expression SYMBOL_LT expression')
@self.pg.production('expression : expression SYMBOL_GT expression')
@self.pg.production('expression : expression SYMBOL_MOD expression')
def exp_a_binop(tokens):
return ast_nodes.ExpABinop(tokens[1].value,tokens[0],tokens[2])