Adding error handling support
This commit is contained in:
56
spf.py
56
spf.py
@@ -8,6 +8,7 @@ import lark
|
||||
import sys
|
||||
from enum import Enum
|
||||
from modules.Variables import Variables
|
||||
from modules.errors import *
|
||||
|
||||
class SPFInterpreter(lark.visitors.Interpreter):
|
||||
def __init__(self, trace=False):
|
||||
@@ -24,11 +25,19 @@ class SPFInterpreter(lark.visitors.Interpreter):
|
||||
type = el.children[0].value
|
||||
name = el.children[1].value
|
||||
old = self.variables.variables.copy()
|
||||
self.variables.declare(type, name)
|
||||
try:
|
||||
self.variables.declare(type, name)
|
||||
except SPFException as e:
|
||||
e.errorline = el.meta.line
|
||||
raise e
|
||||
|
||||
target = self.visit_children(el.children[2])[0]
|
||||
for i in target:
|
||||
self.variables.assign(name, i)
|
||||
try:
|
||||
self.variables.assign(name, i)
|
||||
except SPFException as e:
|
||||
e.errorline = el.meta.line
|
||||
raise e
|
||||
self.visit_children(el.children[3])
|
||||
self.variables.variables = old.copy()
|
||||
|
||||
@@ -40,20 +49,33 @@ class SPFInterpreter(lark.visitors.Interpreter):
|
||||
|
||||
def append(self, el):
|
||||
(_, toadd, var) = self.visit_children(el);
|
||||
var_val = self.variables.get(var.value)
|
||||
try:
|
||||
var_val = self.variables.get(var.value)
|
||||
except SPFException as e:
|
||||
e.errorline = el.meta.line
|
||||
raise e
|
||||
|
||||
var_val.append(toadd)
|
||||
|
||||
def declaration(self, el):
|
||||
type = el.children[0].value
|
||||
name = el.children[1].value
|
||||
value = self.visit_children(el.children[3])[0] if len(el.children) >= 3 else None
|
||||
self.variables.declare(type, name, value)
|
||||
try:
|
||||
self.variables.declare(type, name, value)
|
||||
except SPFException as e:
|
||||
e.errorline = el.meta.line
|
||||
raise e
|
||||
|
||||
def assignation(self, el):
|
||||
name = el.children[0].value
|
||||
assert el.children[1].value == "=" and el.children[2].data == "expression", "Unexpected"
|
||||
value = self.visit_children(el.children[2])[0]
|
||||
self.variables.assign(name, value)
|
||||
try:
|
||||
self.variables.assign(name, value)
|
||||
except SPFException as e:
|
||||
e.errorline = el.meta.line
|
||||
raise e
|
||||
|
||||
def expression(self, el):
|
||||
return self.visit_children(el)[0]
|
||||
@@ -108,7 +130,6 @@ class SPFInterpreter(lark.visitors.Interpreter):
|
||||
|
||||
def priority(self, el):
|
||||
result = self.visit_children(el)
|
||||
print(result)
|
||||
if len(result) < 2:
|
||||
return result[0]
|
||||
elif result[0].type == "SIZE_OP":
|
||||
@@ -120,13 +141,22 @@ class SPFInterpreter(lark.visitors.Interpreter):
|
||||
|
||||
def list_get(self, el):
|
||||
result = self.visit_children(el)
|
||||
return result[0][result[1] - 1] # Index start at 1 (like lua)
|
||||
try:
|
||||
return result[0][result[1] - 1] # Index start at 1 (like lua)
|
||||
except IndexError:
|
||||
e = SPFIndexError(result[0], result[1])
|
||||
e.errorline = el.meta.line
|
||||
raise e
|
||||
|
||||
def finalterm(self, el):
|
||||
return self.visit_children(el)[0]
|
||||
|
||||
def variable(self, el):
|
||||
return self.variables.get(el.children[0].value)
|
||||
try:
|
||||
return self.variables.get(el.children[0].value)
|
||||
except SPFException as e:
|
||||
e.errorline = el.meta.line
|
||||
raise e
|
||||
|
||||
def test(self,el):
|
||||
old = self.variables.variables.copy()
|
||||
@@ -167,11 +197,16 @@ def main():
|
||||
args = arg_parser.parse_args()
|
||||
|
||||
with open("spf.lark") as grammar:
|
||||
spf_parser = lark.Lark(grammar, parser="lalr", strict=True, debug=True)
|
||||
spf_parser = lark.Lark(grammar, parser="lalr", strict=True, debug=True, propagate_positions=True)
|
||||
|
||||
with open(args.spf_file) as spf_input:
|
||||
program = spf_input.read()
|
||||
parsed = spf_parser.parse(program)
|
||||
try:
|
||||
parsed = spf_parser.parse(program)
|
||||
except lark.UnexpectedInput as u:
|
||||
e = SPFSyntaxError()
|
||||
e.errorline = u.line
|
||||
raise e
|
||||
|
||||
if args.pretty:
|
||||
print(parsed.pretty())
|
||||
@@ -183,7 +218,6 @@ def main():
|
||||
if args.dump:
|
||||
interpreter.dump()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user