Source code for pyensae.languages.tree_string_listener
"""
Helpers around language grammar.
This module requires `antlr4 <https://pypi.python.org/pypi/antlr4-python3-runtime/>`_.
:githublink:`%|py|6`
"""
from antlr4 import ParseTreeListener
[docs]class TreeStringListener(ParseTreeListener):
"""
This class is an attempt to run through the tree and convert it into
a string.
:githublink:`%|py|14`
"""
[docs] def __init__(self, parser):
"""
constructor
:param parser: parser used to parse the code
:githublink:`%|py|21`
"""
ParseTreeListener.__init__(self)
self.buffer = []
self.level = 0
self.parser = parser
[docs] def visitTerminal(self, node):
"""
event
:githublink:`%|py|30`
"""
text = (" " * self.level) + "v " + str(node.symbol)
self.buffer.append(text)
[docs] def visitErrorNode(self, node):
"""
event
:githublink:`%|py|37`
"""
text = (" " * self.level) + "error: " + str(node)
self.buffer.append(text)
[docs] def enterEveryRule(self, ctx):
"""
event
:githublink:`%|py|44`
"""
if "ruleIndex" in ctx.__dict__:
text = (" " * self.level) + "+ " + \
self.parser.ruleNames[
ctx.ruleIndex] + ", LT(1)=" + self.parser._input.LT(1).text
else:
text = (" " * self.level) + "+ " + \
", LT(1)=" + self.parser._input.LT(1).text
self.buffer.append(text)
self.level += 1
[docs] def exitEveryRule(self, ctx):
"""
event
:githublink:`%|py|58`
"""
self.level -= 1
if "ruleIndex" in ctx.__dict__:
text = (" " * self.level) + "- " + \
self.parser.ruleNames[ctx.ruleIndex] + \
", LT(1)=" + self.parser._input.LT(1).text
else:
text = (" " * self.level) + "- " + \
", LT(1)=" + self.parser._input.LT(1).text
self.buffer.append(text)
[docs] def __str__(self):
"""
usual
:githublink:`%|py|72`
"""
return "\n".join(self.buffer)