瀏覽代碼

Propagate self.inputfile throughout the parse tree

Yentl Van Tendeloo 9 年之前
父節點
當前提交
07844c2640

+ 2 - 2
interface/HUTN/hutn_compiler/compiler.py

@@ -105,8 +105,6 @@ def do_compile(inputfile, grammarfile, visitors=[], include_paths = []):
                             if f in included:
                             if f in included:
                                 subtree = []
                                 subtree = []
                             else:
                             else:
-                                # print find_file(str(j.tail[0])[1:-1], include_paths)
-                                # print do_parse(find_file(str(j.tail[0])[1:-1], include_paths), grammarfile)
                                 name = str(j.tail[0])[1:-1]
                                 name = str(j.tail[0])[1:-1]
                                 subtree = do_parse(find_file(name, include_paths), grammarfile)["tree"].tail
                                 subtree = do_parse(find_file(name, include_paths), grammarfile)["tree"].tail
                                 if subtree is None:
                                 if subtree is None:
@@ -128,6 +126,8 @@ def do_compile(inputfile, grammarfile, visitors=[], include_paths = []):
                 # The outer for finally finished, so there were no includes remaining, thus terminate the infinite while loop
                 # The outer for finally finished, so there were no includes remaining, thus terminate the infinite while loop
                 break
                 break
 
 
+    result["tree"].fix_tracability(inputfile)
+
     for visitor in visitors:
     for visitor in visitors:
         visitor.visit(result["tree"])
         visitor.visit(result["tree"])
 
 

+ 8 - 1
interface/HUTN/hutn_compiler/hutnparser.py

@@ -35,7 +35,7 @@ class Tree(object):
         self.startpos = startpos
         self.startpos = startpos
         self.endpos = endpos
         self.endpos = endpos
         self._tail = None
         self._tail = None
-        self.inputfile = ""
+        self.inputfile = None
         # IMPORTANT: self.replaced: replace_child defines self.replaced
         # IMPORTANT: self.replaced: replace_child defines self.replaced
 
 
     def is_rule(self):
     def is_rule(self):
@@ -113,6 +113,13 @@ class Tree(object):
     def get_reference_line(self):
     def get_reference_line(self):
         return "%s:%s" % (self.inputfile, self.startpos["line"])
         return "%s:%s" % (self.inputfile, self.startpos["line"])
 
 
+    def fix_tracability(self, inputfile):
+        if self.inputfile is None:
+            self.inputfile = inputfile
+        for f in self.tail:
+            if isinstance(f, Tree):
+                f.fix_tracability(self.inputfile)
+
 class Parser(object):
 class Parser(object):
     class Constants(object):
     class Constants(object):
         Token = 'token'
         Token = 'token'

+ 9 - 3
kernel/modelverse_kernel/main.py

@@ -14,7 +14,7 @@ class ModelverseKernel(object):
         self.returnvalue = None
         self.returnvalue = None
         self.success = True
         self.success = True
         self.generators = {}
         self.generators = {}
-        self.debug = "(init):0"
+        self.debug_info = "(no debug information found)"
 
 
     def execute_yields(self, username, operation, params, reply):
     def execute_yields(self, username, operation, params, reply):
         try:
         try:
@@ -33,6 +33,9 @@ class ModelverseKernel(object):
             # Done, so remove the generator
             # Done, so remove the generator
             del self.generators[username][operation]
             del self.generators[username][operation]
             return None
             return None
+        except:
+            print("Unknown error @ %s" % self.debug_info)
+            raise
 
 
     def execute_rule(self, username):
     def execute_rule(self, username):
         user_root =     yield [("RD", [self.root, username])]
         user_root =     yield [("RD", [self.root, username])]
@@ -40,10 +43,13 @@ class ModelverseKernel(object):
         inst, phase =   yield [("RD", [user_frame, "IP"]),
         inst, phase =   yield [("RD", [user_frame, "IP"]),
                                ("RD", [user_frame, "phase"]),
                                ("RD", [user_frame, "phase"]),
                               ]
                               ]
-        self.debug_info=yield [("RD", [inst, "__debug"])]
-        phase_v, inst_v=yield [("RV", [phase]),
+        self.new_debug, phase_v, inst_v = \
+                        yield [("RD", [inst, "__debug"]),
+                               ("RV", [phase]),
                                ("RV", [inst]),
                                ("RV", [inst]),
                               ]
                               ]
+        if self.new_debug is not None:
+            self.debug_info = yield [("RV", [self.new_debug])]
 
 
         if phase_v == "finish":
         if phase_v == "finish":
             gen = self.helper_init(user_root)
             gen = self.helper_init(user_root)