Continue the AST interpreter

This commit is contained in:
antoine-royer 2024-04-07 18:31:25 +02:00
parent 28bc3f0f83
commit f6dff63e0a
1 changed files with 43 additions and 12 deletions

View File

@ -226,7 +226,8 @@ class Parser():
# --- Comparison and Condition's rules --- #
def condition(self): return self.condition_or()
def condition(self):
return self.condition_or()
def condition_or(self):
elmnt_1 = self.condition_and()
@ -371,12 +372,19 @@ def node_interpreter(node):
if node.type in ("Number", "Text", "Variable"):
return node.value
elif node.type == "Operation":
if node.value == "1/":
return f"1 / {node_interpreter(node.sub_node[0])}"
return f"{node_interpreter(node.sub_node[0])} {node.value} {node_interpreter(node.sub_node[1])}"
if node.type == "User's request":
return f"{node.sub_node[0].value} = input(\"{node.sub_node[0].value} \")\n"
if node.type == "Operation":
if node.value == "1/":
return f"(1 / {node_interpreter(node.sub_node[0])})"
elif node.value == "-":
return f"(-{node_interpreter(node.sub_node[0])})"
else:
return f"{node_interpreter(node.sub_node[0])} {node.value} {node_interpreter(node.sub_node[1])}"
if node.type == "Expression":
return node_interpreter(node.sub_node[0])
@ -385,20 +393,26 @@ def node_interpreter(node):
if node.sub_node[0].type == "Text":
return f"print({node.sub_node[0].value})\n"
elif node.sub_node[0].type == "Expression":
return "print(f\"{" + node_interpreter(node.sub_node[0]) + "}\")"
return "print(f\"{" + node_interpreter(node.sub_node[0]) + "}\")\n"
if node.type == "Statement":
instructions = ast_interpreter(node.sub_node[1:]).split("\n")
instructions = "\n ".join(instructions)
if node.value == "if":
return f"if {node_interpreter(node.sub_node[0])}:\n {instructions}\n"
return f"if {node_interpreter(node.sub_node[0])}:\n {instructions}\n"
elif node.value == "for":
pass
return f"for {node.sub_node[0].value} in range({node.sub_node[1].value}, {node.sub_node[2].value}):\n {instructions}\n"
elif node.value == "while":
return f"while {node_interpreter(node.sub_node[0])}:\n {instructions}\n"
return f"while {node_interpreter(node.sub_node[0])}:\n {instructions}\n"
if node.type == "Condition":
if len(node.sub_node) > 1:
return f"{node_interpreter(node.sub_node[0])} {node.value.lower()} {node_interpreter(node.sub_node[1])}"
else:
return node_interpreter(node.sub_node[0])
if node.type == "Comparison":
if node.value == "EGA":
@ -416,6 +430,10 @@ def node_interpreter(node):
elif node.value == "INF_EGA":
return f"{node.sub_node[0].value} <= {node_interpreter(node.sub_node[1])}"
if node.type == "Function":
args = [f"{node_interpreter(i)}" for i in node.sub_node]
return f"{node.value}(" + ", ".join(args) + ")\n"
return ""
@ -450,11 +468,24 @@ def compylateur(code, file=False):
print(python_code)
txt = """afficher "var"
si var égale 2 alors
txt = """demander la valeur de var
afficher "var :"
afficher var
var prend la valeur int(var, 10)
si var égale 2 ou var est inférieur ou égal à 10 alors
var prend la valeur var + 1
afficher var / 2
fin si
pour i allant de 0 à 5,
afficher i
fin pour
tant que i est supérieur à 0,
afficher i
i prend la valeur i - 1
fin tant que
afficher "fin du programme."
"""
compylateur(txt)