From 0b6af3923de3036edbb95adacbbfc822647a1a42 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Mon, 16 Aug 2021 21:57:43 +0200
Subject: [PATCH] Add rudimentary parser backtrace widget

---
 gdb-port/gui.py | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/gdb-port/gui.py b/gdb-port/gui.py
index 429621f..0309a99 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")
-- 
GitLab