From 5a33f310412d57c975ff26ddc5653c6cca05a433 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Thu, 4 Jun 2015 18:14:25 +1200 Subject: Clarify nomenclature, complete nested frame language spec. --- libpathod/language/base.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'libpathod/language/base.py') diff --git a/libpathod/language/base.py b/libpathod/language/base.py index 4475d15b..ee5d05b5 100644 --- a/libpathod/language/base.py +++ b/libpathod/language/base.py @@ -519,3 +519,42 @@ class IntField(_Component): def spec(self): return "%s%s" % (self.preamble, self.origvalue) + + +class NestedMessage(Token): + """ + A nested message, as an escaped string with a preamble. + """ + preamble = "" + nest_type = None + + def __init__(self, value): + Token.__init__(self) + self.value = value + try: + self.parsed = self.nest_type( + self.nest_type.expr().parseString( + value.val, + parseAll=True + ) + ) + except pp.ParseException as v: + raise exceptions.ParseException(v.msg, v.line, v.col) + + @classmethod + def expr(klass): + e = pp.Literal(klass.preamble).suppress() + e = e + TokValueLiteral.expr() + return e.setParseAction(lambda x: klass(*x)) + + def values(self, settings): + return [ + self.value.get_generator(settings), + ] + + def spec(self): + return "%s%s" % (self.preamble, self.value.spec()) + + def freeze(self, settings): + f = self.parsed.freeze(settings).spec() + return self.__class__(TokValueLiteral(f.encode("string_escape"))) -- cgit v1.2.3