src.templates.simpleprettyspec.py Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-standalone Show documentation
Show all versions of jython-standalone Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
# copyright 2004-2005 Samuele Pedroni
import sys
import types
import cStringIO
class MiniIndentPrinter:
def __init__(self,output):
self.out = output
self.col = 0
self.indent_step = 4
def writeln(self,text):
self.out.write(' '*self.col)
self.out.write(text)
self.out.write("\n")
def indent(self):
self.col += self.indent_step
def dedent(self):
self.col -= self.indent_step
class PrettySpec:
def __getitem__(self,parms):
if not isinstance(parms,types.TupleType):
parms = (parms,)
return self.evoke(parms)
def evoke(self,parms):
return self.__class__(parms)
def visit_spec_seq(self,printer,seq,in_repeat=0,active=1):
for elem in seq:
if isinstance(elem,types.StringType):
count = len(elem.split())
for i in xrange(count):
if active:
printer.writeln("last = tracker.visit_cur_forward()")
printer.writeln("effect |= last")
else:
printer.writeln("tracker.skip()")
else:
if active:
elem.active(printer,in_repeat)
else:
elem.passive(printer,in_repeat)
def active(self,printer,in_repeat):
pass
def passive(self,printer,in_repeat):
pass
class ExpectSkipPrettySpec(PrettySpec):
def active(self,printer,in_repeat):
printer.writeln("if not tracker.exhausted(): tracker.expect_skip()")
passive = active
p_expect_skip = ExpectSkipPrettySpec()
class SpacerPrettySpec(PrettySpec):
def __init__(self,spacer,effect=0):
self.spacer = spacer
self.effect = effect
def active(self,printer,in_repeat):
printer.writeln("self.%s()" % self.spacer)
if self.effect:
printer.writeln("effect = 1")
p_space = SpacerPrettySpec('space')
p_nl = SpacerPrettySpec('nl',effect=1)
p_indent = SpacerPrettySpec('indent')
p_dedent = SpacerPrettySpec('dedent')
class RepeatPrettySpec(PrettySpec):
def __init__(self,spec_seq=None):
self.spec_seq = spec_seq
def active(self,printer,in_repeat):
if in_repeat:
raise Exception,"cannot nest p_repeat in p_repeat"
printer.writeln("while not tracker.exhausted():")
printer.indent()
self.visit_spec_seq(printer,self.spec_seq,in_repeat=1)
printer.dedent()
def passive(self,printer,in_repeat):
raise Exception,"cannot nest p_repeat inside p_dependent"
p_repeat = RepeatPrettySpec()
class MoreP_PrettySpec(PrettySpec):
def active(self,printer,in_repeat):
if in_repeat:
printer.writeln("if tracker.exhausted(): break")
else:
printer.writeln("if tracker.exhausted(): return effect")
passive = active
p_morep = MoreP_PrettySpec()
class DependentPrettySpec(PrettySpec):
def __init__(self,spec_seq = None):
self.spec_seq = spec_seq
def active(self,printer,in_repeat):
printer.writeln("if last:")
printer.indent()
self.visit_spec_seq(printer,self.spec_seq,in_repeat=in_repeat,active=1)
printer.dedent()
printer.writeln("else:")
printer.indent()
printer.writeln("pass")
self.visit_spec_seq(printer,self.spec_seq,in_repeat=in_repeat,active=0)
printer.dedent()
p_dependent = DependentPrettySpec(PrettySpec)
P_LAST = PrettySpec()
P_EFFECT = PrettySpec()
class MainPrettySpec(PrettySpec):
def evoke(self,spec_seq):
last = 0
if spec_seq[0] is P_LAST:
last = 1
caller_globals = sys._getframe(2).f_globals
#print caller_globals['__name__']
buf = cStringIO.StringIO()
printer = MiniIndentPrinter(buf)
printer.writeln("def visit_Foo(self,node,ctxt):")
printer.indent()
printer.writeln("tracker = NodeVisitTracker(self,node)")
printer.writeln("effect = 0")
printer.writeln("last = 0")
self.visit_spec_seq(printer,spec_seq)
if last:
printer.writeln("return last")
else:
printer.writeln("return effect")
printer.dedent()
defsource = buf.getvalue()
ns = {}
#print defsource
exec defsource in caller_globals,ns
return ns['visit_Foo']
simplepretty = MainPrettySpec()