diff --git a/gdb-port/gui.py b/gdb-port/gui.py index 429621f1ff7c247d361dbc8d0467287cfab5ff1b..0309a99d0ed8102a267bab366b41e670e4f9b24c 100644 --- a/gdb-port/gui.py +++ b/gdb-port/gui.py @@ -15,6 +15,8 @@ class PresentationLayer(): self.parser_env = None + self.backtrace = None + def set_top_parser(self,parser): self.top_parser = parser self.top_parser_name.set(self.top_parser.name) @@ -26,6 +28,18 @@ class PresentationLayer(): def set_parser_env(self, parser_env): self.parser_env.set(parser_env) + def set_backtrace(self, backtrace): + self.backtrace.set(backtrace) + + # TODO: this is a bad reimplementation of hammer-parser-backtrace + def parser_stack_to_backtrace_string(self, parser_stack): + string_stack = [str(p) for p in parser_stack.p_stack[-1:-10:-1]] + + if len(parser_stack.p_stack) > 10: + string_stack.append("...") + string_stack.append(str(parser_stack.p_stack[0])) + return "\n".join(string_stack) + # let's avoid polluting the global namespace def init_gui(self): self.root = Tk() @@ -48,6 +62,9 @@ class PresentationLayer(): self.parser_env = StringVar() self.parser_env.set(top_level_parse.get_parser_env()) + self.backtrace = StringVar() + self.backtrace.set(self.parser_stack_to_backtrace_string(top_level_parse.peek_parserstack())) + #"Current parser" widgets ttk.Label(self.frame, text="Current parser").grid(column=1, row=1) ttk.Label(self.frame, textvariable=self.top_parser_name).grid(column=1, row=2) @@ -63,6 +80,10 @@ class PresentationLayer(): ttk.Label(self.frame, textvariable=self.parser_env).grid(column=2, row=4) #ttk.Label(self.frame, text="[Placeholder, Placeholder, Placeholder]").grid(column=2, row=4) + ttk.Label(self.frame, text="Parser backtrace").grid(column=2, row=5) + ttk.Label(self.frame, textvariable=self.backtrace).grid(column=2, row=6) + #ttk.Label(self.frame, text="[Placeholder, Placeholder, Placeholder]").grid(column=2, row=6) + ttk.Button(self.frame, text="Step", command=step).grid(column=1, row=4) def mainloop(self): @@ -73,6 +94,7 @@ def step(*args): presentation_layer.set_top_parser(top_level_parse.peek_parser()) presentation_layer.set_input_chunk(top_level_parse.get_input_chunk()) presentation_layer.set_parser_env(top_level_parse.get_parser_env()) + presentation_layer.set_backtrace(presentation_layer.parser_stack_to_backtrace_string(top_level_parse.peek_parserstack())) if top_level_parse is None: print("Please import parser name script")