Source code for pyrser.passes.to_dsl
# This pass is for debug only
from pyrser import meta
from pyrser import parsing
@meta.add_method(parsing.Parser)
def to_dsl(self):
res = ""
for k, v in self.__class__._rules.items():
if isinstance(v, parsing.Functor):
res += "\n\t{} ::= {}\t;".format(k, v.to_dsl(1))
else:
res += "\n\t{} ::= {};".format(k, repr(v))
return res
[docs]def _dumpParam(pt):
res = ""
if len(pt.param) > 0:
lsparam = []
for p in pt.param:
if p[1] is str:
lsparam.append('"' + p[0] + '"')
else:
lsparam.append(p[0])
res = "({})".format(", ".join(lsparam))
return res
@meta.add_method(parsing.Rule)
def to_dsl(self, level=0):
return "{}{}".format('\t' * level, self.name)
@meta.add_method(parsing.Hook)
def to_dsl(self, level=0):
return "{}#{}{}".format('\t' * level, self.name, _dumpParam(self))
@meta.add_method(parsing.Call)
def to_dsl(self, level=0):
#TODO(iopi): think to remap methods to hooks
if self.callObject == parsing.Parser.read_range:
return "{}'{}'..'{}'".format(
'\t' * level, self.params[0], self.params[1])
elif self.callObject == parsing.Parser.read_char:
return "{}'{}'".format('\t' * level, self.params[0])
elif self.callObject == parsing.Parser.read_text:
return "{}\"{}\"".format('\t' * level, self.params[0])
elif self.callObject == parsing.Parser.read_integer:
return "{}#num".format('\t' * level)
elif self.callObject == parsing.Parser.read_identifier:
return "{}#id".format('\t' * level)
else:
res = "{}#call: {} (".format('\t' * level, self.callObject.__name__)
res += ", ".join(["{}".format(repr(param)) for param in self.params])
res += ")"
return res
@meta.add_method(parsing.SkipIgnore)
def to_dsl(self, level=0):
res = "\n{}#skipIgnore".format('\t' * (level + 1))
return res
@meta.add_method(parsing.Text)
def to_dsl(self, level=0):
res = '\n{}"{}"'.format('\t' * (level + 1), self.text)
return res
@meta.add_method(parsing.Scope)
def to_dsl(self, level=0):
res = "\n{}[{}\n".format('\t' * (level + 1), self.begin.to_dsl(0))
res += self.pt.to_dsl(level + 1)
res += "\n{}]{}\n".format('\t' * (level + 1), self.end.to_dsl(0))
return res
@meta.add_method(parsing.Directive)
def to_dsl(self, level=0):
# TODO: process parameter
res = "\n{}@{}{}".format('\t' * (level + 1),
self.directive.ns_name,
_dumpParam(self))
res += self.pt.to_dsl(level + 1)
return res
@meta.add_method(parsing.Capture)
def to_dsl(self, level=0):
res = "\n{}[\n".format('\t' * level)
res += self.pt.to_dsl(level + 1)
res += "\n{}] : {}\n".format('\t' * level, self.tagname)
return res
@meta.add_method(parsing.Seq)
def to_dsl(self, level=0):
return ' '.join([
pt.to_dsl(level + 1) for pt in self.ptlist])
@meta.add_method(parsing.Alt)
def to_dsl(self, level=0):
indent = '\t' * level
res = "\n{} {}".format(indent, self.ptlist[0].to_dsl(0))
if len(self.ptlist) > 1:
res += "\n{}| ".format(indent)
res += "\n{}| ".format('\t' * level).join([
pt.to_dsl(0) for pt in self.ptlist[1:]])
return res
@meta.add_method(parsing.Neg)
def to_dsl(self, level=0):
res = ("\n{}![\n".format('\t' * level))
res += self.pt.to_dsl(level + 1)
res += ("\n{}]\n".format('\t' * level))
return res
@meta.add_method(parsing.Complement)
def to_dsl(self, level=0):
res = ("\n{}~[\n".format('\t' * level))
res += self.pt.to_dsl(level + 1)
res += ("\n{}]\n".format('\t' * level))
return res
@meta.add_method(parsing.Until)
def to_dsl(self, level=0):
res = ("\n{}->[\n".format('\t' * level))
res += self.pt.to_dsl(level + 1)
res += ("\n{}]\n".format('\t' * level))
return res
@meta.add_method(parsing.LookAhead)
def to_dsl(self, level=0):
res = ("\n{}!![\n".format('\t' * level))
res += self.pt.to_dsl(level + 1)
res += ("\n{}]\n".format('\t' * level))
return res
@meta.add_method(parsing.RepOptional)
def to_dsl(self, level=0):
res = ("\n{}[\n".format('\t' * level))
res += self.pt.to_dsl(level + 1)
res += ("\n{}]?\n".format('\t' * level))
return res
@meta.add_method(parsing.Rep0N)
def to_dsl(self, level=0):
res = ("\n{}[\n".format('\t' * level))
res += self.pt.to_dsl(level + 1)
res += ("\n{}]*\n".format('\t' * level))
return res
@meta.add_method(parsing.Rep1N)
[docs]def to_dsl(self, level=0):
res = ("\n{}[\n".format('\t' * level))
res += self.pt.to_dsl(level + 1)
res += ("\n{}]+\n".format('\t' * level))
return res