|
@@ -81,7 +81,7 @@ def find_file(filename, include_paths):
|
|
|
else:
|
|
|
raise Exception("Could not resolve file %s. Tried: %s" % (filename, attempts))
|
|
|
|
|
|
-def do_compile(inputfile, grammarfile, compile_visitor = None, compile_visitor2 = None, include_paths = []):
|
|
|
+def do_compile(inputfile, grammarfile, visitors=[], include_paths = []):
|
|
|
import os.path
|
|
|
global working_file
|
|
|
working_file = os.path.abspath(inputfile)
|
|
@@ -89,19 +89,8 @@ def do_compile(inputfile, grammarfile, compile_visitor = None, compile_visitor2
|
|
|
result = do_parse(inputfile, grammarfile)
|
|
|
error = result["status"] != Parser.Constants.Success
|
|
|
if error:
|
|
|
- print 'not a valid input file!'
|
|
|
- print '{}:{}: error: {}'.format(result['line'], result['column'],
|
|
|
- result['text'])
|
|
|
- for r in result['partialresults']:
|
|
|
- print r
|
|
|
- if isinstance(r['tree'], Tree):
|
|
|
- print r['tree'].head, [x.head for x in r['tree'].tail if hasattr(x, 'head')]
|
|
|
- # print "-"*20+"partial-result"+"-"*20
|
|
|
- # from prettyprint_visitor import PrintVisitor
|
|
|
- # pv = PrintVisitor()
|
|
|
- # pv.visit(r['tree'])
|
|
|
- # print pv.dump()
|
|
|
-
|
|
|
+ msg = "Not a valid input file!\n%s:%s: error: %s" % (result['line'], result['column'], result['text'])
|
|
|
+ raise Exception(msg)
|
|
|
else:
|
|
|
for child in result["tree"].tail:
|
|
|
child.inputfile = inputfile
|
|
@@ -121,10 +110,8 @@ def do_compile(inputfile, grammarfile, compile_visitor = None, compile_visitor2
|
|
|
name = str(j.tail[0])[1:-1]
|
|
|
subtree = do_parse(find_file(name, include_paths), grammarfile)["tree"].tail
|
|
|
if subtree is None:
|
|
|
- if compile_visitor is None:
|
|
|
- return False
|
|
|
- else:
|
|
|
- return None
|
|
|
+ raise Exception("Parsing error for included file %s" % find_file(name, include_paths))
|
|
|
+
|
|
|
for t in subtree:
|
|
|
t.inputfile = name
|
|
|
included.add(f)
|
|
@@ -141,87 +128,41 @@ def do_compile(inputfile, grammarfile, compile_visitor = None, compile_visitor2
|
|
|
# The outer for finally finished, so there were no includes remaining, thus terminate the infinite while loop
|
|
|
break
|
|
|
|
|
|
- if compile_visitor is None:
|
|
|
- return not error
|
|
|
- else:
|
|
|
- if error:
|
|
|
- return None
|
|
|
- else:
|
|
|
- try:
|
|
|
- compile_visitor.visit(result["tree"])
|
|
|
- if compile_visitor2:
|
|
|
- compile_visitor2.visit(result["tree"])
|
|
|
- except RuntimeError as e:
|
|
|
- print e.message
|
|
|
- sys.exit(1)
|
|
|
-
|
|
|
- if compile_visitor2:
|
|
|
- return compile_visitor2.dump()
|
|
|
- else:
|
|
|
- return compile_visitor.dump()
|
|
|
-
|
|
|
-def main(input_file, grammar_file, mode, args):
|
|
|
- if mode == "None":
|
|
|
- visitor = None
|
|
|
- visitor2 = None
|
|
|
- elif mode == "PP":
|
|
|
- from prettyprint_visitor import PrettyPrintVisitor
|
|
|
- visitor = PrettyPrintVisitor()
|
|
|
- visitor2 = None
|
|
|
- elif mode == "P":
|
|
|
- from prettyprint_visitor import PrintVisitor
|
|
|
- visitor = PrintVisitor()
|
|
|
- visitor2 = None
|
|
|
- elif mode == "S":
|
|
|
- from semantics_visitor import SemanticsVisitor
|
|
|
- visitor = SemanticsVisitor()
|
|
|
- visitor2 = None
|
|
|
- elif mode == "SP":
|
|
|
- from semantics_visitor import SemanticsVisitor
|
|
|
- from prettyprint_visitor import PrettyPrintVisitor
|
|
|
- visitor = SemanticsVisitor()
|
|
|
- visitor2 = PrettyPrintVisitor()
|
|
|
- elif mode == "BS":
|
|
|
- from semantics_visitor import SemanticsVisitor
|
|
|
- from bootstrap_visitor import BootstrapVisitor
|
|
|
- visitor = SemanticsVisitor()
|
|
|
- visitor2 = BootstrapVisitor(args)
|
|
|
- elif mode == "PS":
|
|
|
- from semantics_visitor import SemanticsVisitor
|
|
|
- from primitives_visitor import PrimitivesVisitor
|
|
|
- visitor = SemanticsVisitor()
|
|
|
- visitor2 = PrimitivesVisitor(args)
|
|
|
- elif mode == "PO":
|
|
|
- from semantics_visitor import SemanticsVisitor
|
|
|
- from primitives_object_visitor import PrimitivesObjectVisitor
|
|
|
- visitor = SemanticsVisitor()
|
|
|
- visitor2 = PrimitivesObjectVisitor(args)
|
|
|
- elif mode == "CS":
|
|
|
- from semantics_visitor import SemanticsVisitor
|
|
|
- from constructors_visitor import ConstructorsVisitor
|
|
|
- visitor = SemanticsVisitor()
|
|
|
- visitor2 = ConstructorsVisitor(args)
|
|
|
- elif mode == "CO":
|
|
|
- from semantics_visitor import SemanticsVisitor
|
|
|
- from constructors_object_visitor import ConstructorsObjectVisitor
|
|
|
- visitor = SemanticsVisitor()
|
|
|
- visitor2 = ConstructorsObjectVisitor(args)
|
|
|
- else:
|
|
|
- print("Visitor not understood: " + str(mode))
|
|
|
- sys.exit(1)
|
|
|
- return do_compile(input_file, grammar_file, visitor, visitor2)
|
|
|
+ for visitor in visitors:
|
|
|
+ visitor.visit(result["tree"])
|
|
|
+
|
|
|
+ if visitors:
|
|
|
+ return visitors[-1].dump()
|
|
|
+
|
|
|
+def main(input_file, grammar_file, mode, args=[]):
|
|
|
+ from prettyprint_visitor import PrettyPrintVisitor
|
|
|
+ from prettyprint_visitor import PrintVisitor
|
|
|
+ from semantics_visitor import SemanticsVisitor
|
|
|
+ from bootstrap_visitor import BootstrapVisitor
|
|
|
+ from primitives_visitor import PrimitivesVisitor
|
|
|
+ from primitives_object_visitor import PrimitivesObjectVisitor
|
|
|
+ from constructors_visitor import ConstructorsVisitor
|
|
|
+ from constructors_object_visitor import ConstructorsObjectVisitor
|
|
|
+
|
|
|
+ modes = {
|
|
|
+ "N" : [],
|
|
|
+ "P" : [PrintVisitor],
|
|
|
+ "PP" : [PrettyPrintVisitor],
|
|
|
+ "S" : [SemanticsVisitor],
|
|
|
+ "PS" : [SemanticsVisitor, PrimitivesVisitor],
|
|
|
+ "PO" : [SemanticsVisitor, PrimitivesObjectVisitor],
|
|
|
+ "BS" : [SemanticsVisitor, BootstrapVisitor],
|
|
|
+ "CS" : [SemanticsVisitor, ConstructorsVisitor],
|
|
|
+ "CO" : [SemanticsVisitor, ConstructorsObjectVisitor],
|
|
|
+ }
|
|
|
+ return do_compile(input_file, grammar_file, [v(args) for v in modes[mode]])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
if len(sys.argv) <= 2:
|
|
|
print("Invocation: ")
|
|
|
- print(" %s input_file grammar_file [mode]" % sys.argv[0])
|
|
|
+ print(" %s input_file grammar_file mode [mode_params]*" % sys.argv[0])
|
|
|
sys.exit(1)
|
|
|
else:
|
|
|
value = main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4:])
|
|
|
- if value is None:
|
|
|
- sys.exit(1)
|
|
|
- else:
|
|
|
- if isinstance(value, list):
|
|
|
- print '\n'.join([repr(x) for x in value])
|
|
|
- sys.exit(0)
|
|
|
-
|
|
|
+ if value is not None:
|
|
|
+ print(value)
|