Implementing Variables class + dump and trace

This commit is contained in:
tonitch
2025-03-20 00:17:50 +01:00
parent 0e11654fd2
commit e7eca3b46d
4 changed files with 85 additions and 42 deletions

55
spf.py
View File

@ -7,32 +7,13 @@ import argparse
import lark
import sys
from enum import Enum
variables = {}
class VariableType(Enum):
boolean = 1
integer = 2
string = 3
list = 4
class Variable():
def __init__(self, type, value):
self.type = type
self.value = value
def __str__(self):
if self.type == "booléen":
return "Vrai" if self.value else "Faux"
return f"{self.value}"
def __repr__(self):
if self.type == "texte":
return f"\"{self.value}\""
return f"{self.value}"
from modules.Variables import Variables
class SPFInterpreter(lark.visitors.Interpreter):
def __init__(self, trace=False):
super().__init__()
self.variables = Variables(trace)
def afficher(self, el):
for toprint in el.children[1:]:
print(self.visit_children(toprint)[0])
@ -41,26 +22,20 @@ class SPFInterpreter(lark.visitors.Interpreter):
def declaration(self, el):
type = el.children[0].value
name = el.children[1].value
assert el.children[2].value == "=", "Unexpected"
assert el.children[3].data == "expression", "Unexpected"
value = self.visit_children(el.children[3])[0]
variables[name] = Variable(type, value)
value = self.visit_children(el.children[3])[0] if el.children[2].value == "=" else None
self.variables.declare(type, name, value)
def assignation(self, el):
name = el.children[0].value
assert name in variables, f"Unknown variable : {el.children[0].value} not in {variables}"
assert el.children[1].value == "=", "Unexpected"
assert el.children[2].data == "expression", "Unexpected"
assert el.children[1].value == "=" and el.children[2].data == "expression", "Unexpected"
value = self.visit_children(el.children[2])[0]
variables[name] = value #TODO: vérifier type
self.variables.assign(name, value)
def expressionleft(self, el):
return self.visit_children(el)[0]
def variable(self, el):
assert el.children[0].value in variables, f"Unknown variable : {el.children[0].value} not in {variables}"
return variables[el.children[0].value]
return self.variables.get(el.children[0].value)
# Literals
string = lambda self, el: el.children[0][1:-1]
@ -68,6 +43,9 @@ class SPFInterpreter(lark.visitors.Interpreter):
true = lambda self, _: True
false = lambda self, _: False
def dump(self):
self.variables.dump()
def main():
@ -81,9 +59,6 @@ def main():
action="store_true")
args = arg_parser.parse_args()
if args.trace:
print("Trace activated (TODO)", file=sys.stderr)
with open("spf.lark") as grammar:
spf_parser = lark.Lark(grammar, parser="lalr", strict=True, debug=True)
@ -91,11 +66,11 @@ def main():
program = spf_input.read()
parsed = spf_parser.parse(program)
interpreter = SPFInterpreter()
interpreter = SPFInterpreter(args.trace)
interpreted = interpreter.visit(parsed)
if args.dump:
print(variables, file=sys.stderr)
interpreted.dump()
if __name__ == "__main__":