Feat(random): random str parsing is done

This commit is contained in:
Bertrand Benjamin 2019-05-13 19:37:34 +02:00
parent 040dfff0ec
commit 037fd9f68a
2 changed files with 74 additions and 8 deletions

View File

@ -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: class RdLeaf:
@ -25,10 +65,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}>"

View File

@ -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"]
@ -476,7 +477,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
@ -497,7 +498,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
@ -511,7 +512,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:
@ -530,7 +531,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)
@ -605,7 +606,7 @@ def list_sink():
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:
@ -810,6 +811,31 @@ 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)