File: trace_visualiser.py

package info (click to toggle)
python-parsley 1.3-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 948 kB
  • sloc: python: 9,897; makefile: 127
file content (70 lines) | stat: -rw-r--r-- 2,033 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from tkinter.scrolledtext import ScrolledText
import tkinter as tk

from trace_json import traceparse
from parsley_json import jsonGrammar

jsonData = open('337141-steamcube.json').read()


class Tracer(object):

    def __init__(self, grammarWin, inputWin, logWin, trace):
        self.grammarWin = grammarWin
        self.inputWin = inputWin
        self.logWin = logWin
        self.trace = trace
        self.position = 0

    def advance(self):
        if self.position < len(self.trace):
            self.position += 1
            self.display()

    def rewind(self):
        if self.position > 0:
            self.position -= 1
            self.display()

    def display(self):
        def updateHighlight(w, start, end=None):
            w.tag_remove("highlight", "1.0", tk.END)
            start = "1.0+%sc" % (start,)
            if end is not None:
                end = "1.0+%sc" % (end,)
            w.tag_add("highlight", start, end)
            w.tag_configure("highlight", background="yellow")

        _, (grammarStart, grammarEnd), inputPos = self.trace[self.position]
        updateHighlight(self.grammarWin, grammarStart, grammarEnd)
        updateHighlight(self.inputWin, inputPos)


def display(grammar, src, trace):
    r = tk.Tk()
    f = tk.Frame(master=r)
    lt = ScrolledText(master=f)
    rt = ScrolledText(master=f)
    lt.pack(side="left", expand=True, fill="both")
    rt.pack(side="right", expand=True, fill="both")

    bot = ScrolledText(master=r, height=5)
    tracer = Tracer(lt, rt, bot, trace)
    toolbar = tk.Frame(master=r)
    tk.Button(toolbar, text="Next", width=5, command=tracer.advance).pack(
        side="left")
    tk.Button(toolbar, text="Prev", width=5, command=tracer.rewind).pack(
        side="left")
    f.pack(expand=1, fill="both")
    toolbar.pack(fill=tk.X)
    bot.pack(fill=tk.X)

    lt.insert(tk.END, grammar)
    rt.insert(tk.END, src)
    tracer.display()
    return r

_, trace = traceparse(jsonData)
root = display(jsonGrammar, jsonData, trace)

root.mainloop()