diff --git a/mapytex/calculus/core/random/leaf.py b/mapytex/calculus/core/random/leaf.py index fdf0815..802bd17 100644 --- a/mapytex/calculus/core/random/leaf.py +++ b/mapytex/calculus/core/random/leaf.py @@ -9,6 +9,46 @@ """ """ +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: @@ -25,10 +65,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 7ba8772..672ac10 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"] @@ -476,7 +477,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 @@ -497,7 +498,7 @@ def lookforNumbers(target): else: try: target_.send(typifiy_numbers(current)) - except InvalidOperation: + except (InvalidOperation, TypeError): target_.send(current) target_.send("+") current = tok @@ -511,7 +512,7 @@ def lookforNumbers(target): else: try: target_.send(typifiy_numbers(current)) - except InvalidOperation: + except (InvalidOperation, TypeError): target_.send(current) current = tok else: @@ -530,7 +531,7 @@ def lookforNumbers(target): if current: try: target_.send(typifiy_numbers(current)) - except InvalidOperation: + except (InvalidOperation, TypeError): target_.send(current) yield target_.throw(err) @@ -605,7 +606,7 @@ def list_sink(): 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: @@ -810,6 +811,31 @@ 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)