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)