Feat(random): random str parsing is done
This commit is contained in:
		| @@ -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 | ||||
|     [<RdLeaf a>, '+', <RdLeaf a*b>, '-', '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}>" | ||||
|   | ||||
| @@ -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") | ||||
|     [<RdLeaf a>, '+', <RdLeaf a*b>, '+', <MOnumber - 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) | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user