Source code for ctree.codegen
"""
base class for generating code appropriate to the selected backend
"""
from ctree.visitors import NodeVisitor
from ctree.util import flatten
[docs]class CodeGenVisitor(NodeVisitor):
"""
Return a string containing the program text.
"""
def __init__(self, indent=0):
self._indent = indent
# -------------------------------------------------------------------------
# common support methods
def _tab(self):
"""return correct spaces if tab found"""
return " " * self._indent
def _genblock(self, forest, insert_curly_brackets=True,
increase_indent=True):
"""generate block of code adding semi colons as necessary"""
if increase_indent:
self._indent += 1
body = ""
for tree in flatten(forest):
semicolon_opt = ";" if tree._requires_semicolon() else ""
block = tree.codegen(self._indent)
if block is not "":
body += self._tab() + block + semicolon_opt + "\n"
if increase_indent:
self._indent -= 1
if insert_curly_brackets:
return "{\n%s%s}" % (body, self._tab())
else:
return "\n%s" % body
def _parenthesize(self, parent, child):
"""A format string that includes parentheses if needed."""
if self._requires_parentheses(parent, child) or \
child._force_parentheses is True:
return "(%s)" % child
else:
return "%s" % child
def _requires_parentheses(self, parent, child):
"""True by default."""
return True