Adding most operators
This commit is contained in:
85
spf.py
85
spf.py
@ -14,10 +14,23 @@ class SPFInterpreter(lark.visitors.Interpreter):
|
||||
super().__init__()
|
||||
self.variables = Variables(trace)
|
||||
|
||||
def while_loop(self, el):
|
||||
print("TODO: while")
|
||||
cond = el.children[0]
|
||||
instr = el.children[1:]
|
||||
print(cond.pretty())
|
||||
|
||||
def for_loop(self, el):
|
||||
print("TODO: for")
|
||||
|
||||
def afficher(self, el):
|
||||
ligne = ""
|
||||
for toprint in el.children[1:]:
|
||||
print(self.visit_children(toprint)[0])
|
||||
return
|
||||
ligne += str(self.visit_children(toprint)[0]) + " "
|
||||
print(ligne)
|
||||
|
||||
# def append(self, el):
|
||||
# (_, toadd, var) = self.visit_children(el);
|
||||
|
||||
def declaration(self, el):
|
||||
type = el.children[0].value
|
||||
@ -31,6 +44,67 @@ class SPFInterpreter(lark.visitors.Interpreter):
|
||||
value = self.visit_children(el.children[2])[0]
|
||||
self.variables.assign(name, value)
|
||||
|
||||
def equal(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left == right
|
||||
|
||||
def unequal(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left != right
|
||||
|
||||
def and_op(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left and right
|
||||
|
||||
def or_op(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left or right
|
||||
|
||||
def not_op(self, el):
|
||||
(sign, right) = self.visit_children(el)
|
||||
return not right
|
||||
|
||||
def lt(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left < right
|
||||
|
||||
def le(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left <= right
|
||||
|
||||
def gt(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left > right
|
||||
|
||||
def ge(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left >= right
|
||||
|
||||
|
||||
def plus(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left + right # Cool ça fonctionne pour les str
|
||||
|
||||
def minus(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left - right
|
||||
|
||||
def time(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left * right
|
||||
|
||||
def divide(self, el):
|
||||
(left, sign, right) = self.visit_children(el)
|
||||
return left / right
|
||||
|
||||
neg = lambda self, el:-self.visit_children(el)[1]
|
||||
|
||||
sizeof = lambda self, el:len(self.visit_children(el)[1])
|
||||
|
||||
|
||||
def expression(self, el):
|
||||
return self.visit_children(el)[0]
|
||||
|
||||
def expressionleft(self, el):
|
||||
return self.visit_children(el)[0]
|
||||
|
||||
@ -57,6 +131,9 @@ def main():
|
||||
arg_parser.add_argument("-t", "--trace",
|
||||
help="affichage de la mémoire au cours du programme",
|
||||
action="store_true")
|
||||
arg_parser.add_argument("-p", "--pretty",
|
||||
help="affichage de l'arbre et quite",
|
||||
action="store_true")
|
||||
args = arg_parser.parse_args()
|
||||
|
||||
with open("spf.lark") as grammar:
|
||||
@ -66,6 +143,10 @@ def main():
|
||||
program = spf_input.read()
|
||||
parsed = spf_parser.parse(program)
|
||||
|
||||
if args.pretty:
|
||||
print(parsed.pretty())
|
||||
return
|
||||
|
||||
interpreter = SPFInterpreter(args.trace)
|
||||
interpreted = interpreter.visit(parsed)
|
||||
|
||||
|
Reference in New Issue
Block a user