Feat(random): random str parsing is done
This commit is contained in:
		| @@ -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 | ||||||
|  |     [<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(): | class RdLeaf(): | ||||||
|     """ Random leaf |     """ Random leaf | ||||||
| @@ -23,10 +62,10 @@ class RdLeaf(): | |||||||
|         return self._name |         return self._name | ||||||
|  |  | ||||||
|     def replace(self, computed): |     def replace(self, computed): | ||||||
|         return computed[self.name] |         return computed[self._name] | ||||||
|  |  | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         return "{" + self.name + "}" |         return "{" + self._name + "}" | ||||||
|  |  | ||||||
|     def __repr__(self): |     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 .coroutine import * | ||||||
| from .operator import is_operator | from .operator import is_operator | ||||||
| from .MO import moify | from .MO import moify | ||||||
|  | from .random.leaf import look_for_rdleaf | ||||||
|  |  | ||||||
| __all__ = ["str2", ] | __all__ = ["str2", ] | ||||||
|  |  | ||||||
| @@ -466,7 +467,7 @@ def lookforNumbers(target): | |||||||
|             if tok is not None: |             if tok is not None: | ||||||
|                 try: |                 try: | ||||||
|                     int(tok) |                     int(tok) | ||||||
|                 except ValueError: |                 except (ValueError, TypeError): | ||||||
|                     if tok == '.': |                     if tok == '.': | ||||||
|                         if current.replace("-", "", 1).isdigit(): |                         if current.replace("-", "", 1).isdigit(): | ||||||
|                             current += tok |                             current += tok | ||||||
| @@ -487,7 +488,7 @@ def lookforNumbers(target): | |||||||
|                         else: |                         else: | ||||||
|                             try: |                             try: | ||||||
|                                 target_.send(typifiy_numbers(current)) |                                 target_.send(typifiy_numbers(current)) | ||||||
|                             except InvalidOperation: |                             except (InvalidOperation, TypeError): | ||||||
|                                 target_.send(current) |                                 target_.send(current) | ||||||
|                             target_.send('+') |                             target_.send('+') | ||||||
|                             current = tok |                             current = tok | ||||||
| @@ -499,7 +500,7 @@ def lookforNumbers(target): | |||||||
|                         else: |                         else: | ||||||
|                             try: |                             try: | ||||||
|                                 target_.send(typifiy_numbers(current)) |                                 target_.send(typifiy_numbers(current)) | ||||||
|                             except InvalidOperation: |                             except (InvalidOperation, TypeError): | ||||||
|                                 target_.send(current) |                                 target_.send(current) | ||||||
|                             current = tok |                             current = tok | ||||||
|                 else: |                 else: | ||||||
| @@ -518,7 +519,7 @@ def lookforNumbers(target): | |||||||
|         if current: |         if current: | ||||||
|             try: |             try: | ||||||
|                 target_.send(typifiy_numbers(current)) |                 target_.send(typifiy_numbers(current)) | ||||||
|             except InvalidOperation: |             except (InvalidOperation, TypeError): | ||||||
|                 target_.send(current) |                 target_.send(current) | ||||||
|         yield target_.throw(err) |         yield target_.throw(err) | ||||||
|  |  | ||||||
| @@ -589,7 +590,7 @@ def list_sink(): | |||||||
|         yield ans |         yield ans | ||||||
|  |  | ||||||
| def str2(sink, convert_to_mo=True): | 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: |     :example: | ||||||
|  |  | ||||||
| @@ -790,6 +791,26 @@ def str2(sink, convert_to_mo=True): | |||||||
|  |  | ||||||
|     return pipeline |     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) | str2nestedlist = str2(list_sink) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user