Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""
2@file
3@brief Helpers around language grammar.
4This module requires `antlr4 <https://pypi.python.org/pypi/antlr4-python3-runtime/>`_.
5"""
6from antlr4 import ParseTreeListener
9class TreeStringListener(ParseTreeListener):
11 """
12 This class is an attempt to run through the tree and convert it into
13 a string.
14 """
16 def __init__(self, parser):
17 """
18 constructor
20 @param parser parser used to parse the code
21 """
22 ParseTreeListener.__init__(self)
23 self.buffer = []
24 self.level = 0
25 self.parser = parser
27 def visitTerminal(self, node):
28 """
29 event
30 """
31 text = (" " * self.level) + "v " + str(node.symbol)
32 self.buffer.append(text)
34 def visitErrorNode(self, node):
35 """
36 event
37 """
38 text = (" " * self.level) + "error: " + str(node)
39 self.buffer.append(text)
41 def enterEveryRule(self, ctx):
42 """
43 event
44 """
45 if "ruleIndex" in ctx.__dict__:
46 text = (" " * self.level) + "+ " + \
47 self.parser.ruleNames[
48 ctx.ruleIndex] + ", LT(1)=" + self.parser._input.LT(1).text
49 else:
50 text = (" " * self.level) + "+ " + \
51 ", LT(1)=" + self.parser._input.LT(1).text
52 self.buffer.append(text)
53 self.level += 1
55 def exitEveryRule(self, ctx):
56 """
57 event
58 """
59 self.level -= 1
60 if "ruleIndex" in ctx.__dict__:
61 text = (" " * self.level) + "- " + \
62 self.parser.ruleNames[ctx.ruleIndex] + \
63 ", LT(1)=" + self.parser._input.LT(1).text
64 else:
65 text = (" " * self.level) + "- " + \
66 ", LT(1)=" + self.parser._input.LT(1).text
67 self.buffer.append(text)
69 def __str__(self):
70 """
71 usual
72 """
73 return "\n".join(self.buffer)