From ca7cd001d8514494b7b9fbb8a57229f5e097879d Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 13 May 2019 19:37:34 +0200 Subject: [PATCH] Feat(random): random str parsing is done --- mapytex/calculus/core/random/leaf.py | 45 ++++++++++++++++++++++++++-- mapytex/calculus/core/str2.py | 31 +++++++++++++++---- 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/mapytex/calculus/core/random/leaf.py b/mapytex/calculus/core/random/leaf.py index 481cfc8..fd74e60 100644 --- a/mapytex/calculus/core/random/leaf.py +++ b/mapytex/calculus/core/random/leaf.py @@ -9,6 +9,45 @@ """ """ +from ..coroutine import * + +@coroutine +def look_for_rdleaf(target): + """ Coroutine which look to "{...}" which are RdLeaf + + :example: + >>> from ..str2 import list_sink + >>> str2list = look_for_rdleaf(list_sink) + >>> for i in "{a}+{a*b}-2": + ... str2list.send(i) + >>> a = str2list.throw(STOOOP) + >>> a + [, '+', , '-', '2'] + + """ + try: + target_ = target() + except TypeError: + target_ = target + + try: + while True: + tok = yield + if tok == "{": + stack = "" + stacking = True + elif tok == "}": + target_.send(RdLeaf(stack)) + stack = "" + stacking = False + else: + if stacking: + stack += tok + else: + target_.send(tok) + + except STOOOP as err: + yield target_.throw(err) class RdLeaf(): """ Random leaf @@ -23,10 +62,10 @@ class RdLeaf(): return self._name def replace(self, computed): - return computed[self.name] + return computed[self._name] def __str__(self): - return "{" + self.name + "}" + return "{" + self._name + "}" def __repr__(self): - return f"<{self.__class__.__name__} {self.__str__}>" + return f"<{self.__class__.__name__} {self._name}>" diff --git a/mapytex/calculus/core/str2.py b/mapytex/calculus/core/str2.py index 0630db0..0e9f89c 100644 --- a/mapytex/calculus/core/str2.py +++ b/mapytex/calculus/core/str2.py @@ -15,6 +15,7 @@ from decimal import Decimal, InvalidOperation from .coroutine import * from .operator import is_operator from .MO import moify +from .random.leaf import look_for_rdleaf __all__ = ["str2", ] @@ -466,7 +467,7 @@ def lookforNumbers(target): if tok is not None: try: int(tok) - except ValueError: + except (ValueError, TypeError): if tok == '.': if current.replace("-", "", 1).isdigit(): current += tok @@ -487,7 +488,7 @@ def lookforNumbers(target): else: try: target_.send(typifiy_numbers(current)) - except InvalidOperation: + except (InvalidOperation, TypeError): target_.send(current) target_.send('+') current = tok @@ -499,7 +500,7 @@ def lookforNumbers(target): else: try: target_.send(typifiy_numbers(current)) - except InvalidOperation: + except (InvalidOperation, TypeError): target_.send(current) current = tok else: @@ -518,7 +519,7 @@ def lookforNumbers(target): if current: try: target_.send(typifiy_numbers(current)) - except InvalidOperation: + except (InvalidOperation, TypeError): target_.send(current) yield target_.throw(err) @@ -589,7 +590,7 @@ def list_sink(): yield ans def str2(sink, convert_to_mo=True): - """ Return a pipeline which parse an expression with the sink as an endpont + """ Return a pipeline which parse an expression with the sink as an endpoint :example: @@ -790,6 +791,26 @@ def str2(sink, convert_to_mo=True): return pipeline +def rdstr2(sink): + """ Return a pipeline which parse random expression and with sink as endpoint + + :example: + >>> rdstr2list = rdstr2(list_sink) + >>> rdstr2list("{a}+{a*b}-2") + [, '+', , '+', ] + """ + lfop = lookfor(is_operator) + operator_corout = partial(concurent_broadcast, lookfors=[lfop]) + def pipeline(expression): + str2_corout = look_for_rdleaf(lookforNumbers(operator_corout(missing_times(moify(pparser(sink)))))) + + for i in expression.replace(" ",""): + str2_corout.send(i) + a = str2_corout.throw(STOOOP) + + return a + + return pipeline str2nestedlist = str2(list_sink)