TransformState + EAttachable

This commit is contained in:
AF 2021-09-08 12:37:37 +03:00
parent a868e9687e
commit 2b3a202a52
82 changed files with 469 additions and 644 deletions

View File

@ -4,7 +4,7 @@ from typing import Mapping, Iterator
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.targets.avcontainer import AVContainer from bu4.evaluation.targets.avnamedcontainer import AVNamedContainer
__all__ = ('LambdaEnv',) __all__ = ('LambdaEnv',)
@ -26,7 +26,7 @@ class LambdaEnv(Mapping[bytes, Evaluable]):
def __init__(self, env: envtype, name: bytes, evaluable: Evaluable, *, memoize): def __init__(self, env: envtype, name: bytes, evaluable: Evaluable, *, memoize):
self.env = env self.env = env
self.name = name self.name = name
self.container = AVContainer(evaluable, name).after_value if memoize else evaluable self.container = AVNamedContainer(evaluable, name).after_value if memoize else evaluable
@staticmethod @staticmethod
def strfy(self): def strfy(self):

View File

@ -4,7 +4,7 @@ from typing import Sequence
from bu4.evaluation.av.evtype import evtype from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.targets.avicontainer import AVIContainer from bu4.evaluation.targets.avanonymouscontainer import AVAnonymousContainer
__all__ = ('LambdaEv',) __all__ = ('LambdaEv',)
@ -21,4 +21,4 @@ class LambdaEv(Sequence[Evaluable]):
def __init__(self, ev: evtype, evaluable: Evaluable, *, memoize): def __init__(self, ev: evtype, evaluable: Evaluable, *, memoize):
self.ev = ev self.ev = ev
self.container = AVIContainer(evaluable).after_value if memoize else evaluable self.container = AVAnonymousContainer(evaluable).after_value if memoize else evaluable

View File

@ -0,0 +1,14 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import Generic, TypeVar
__all__ = ('Attachable',)
from bu4.evaluation.constructs.evaluable import Evaluable
T = TypeVar('T')
class Attachable(Generic[T]):
def attach(self, t: T) -> Evaluable:
raise NotImplementedError

View File

@ -0,0 +1,22 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar, Generic
from bu4.evaluation.constructs.attachable import Attachable
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('EAttachable',)
T = TypeVar('T')
class EAttachable(Evaluable, Generic[T]):
def __init__(self, t: T, attachable: Attachable[T]):
self.t = t
self.attachable = attachable
def next(self) -> Evaluable:
return self.attachable.attach(self.t)
def __str__(self):
return f'{self.attachable}'

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elinked import ELinked from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.linking.constructs.linked import Linked from bu4.linking.constructs.linked import Linked
@ -13,7 +13,7 @@ class EDelayed(EValue):
def __init__(self, env: envtype, value: Linked): def __init__(self, env: envtype, value: Linked):
self.env = env self.env = env
self.value = value self.value = value
self.evaluable = ELinked( self.evaluable = EAttachable(
self.env, self.env,
self.value self.value
) )

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.evtype import evtype from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.eindexed import EIndexed from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.indexing.constructs.indexed import Indexed from bu4.indexing.constructs.indexed import Indexed
@ -13,7 +13,7 @@ class EIDelayed(EValue):
def __init__(self, ev: evtype, value: Indexed): def __init__(self, ev: evtype, value: Indexed):
self.ev = ev self.ev = ev
self.value = value self.value = value
self.evaluable = EIndexed( self.evaluable = EAttachable(
self.ev, self.ev,
self.value self.value
) )

View File

@ -2,7 +2,7 @@
from bu4.evaluation.av.evtype import evtype from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.av.lambdaev import LambdaEv from bu4.evaluation.av.lambdaev import LambdaEv
from bu4.evaluation.constructs.eindexed import EIndexed from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.indexing.constructs.indexed import Indexed from bu4.indexing.constructs.indexed import Indexed
@ -17,7 +17,7 @@ class EILambda(EValue):
self.memoize = memoize self.memoize = memoize
def call(self, argument: Evaluable) -> Evaluable: def call(self, argument: Evaluable) -> Evaluable:
return EIndexed( return EAttachable(
LambdaEv(self.ev, argument, memoize=self.memoize), LambdaEv(self.ev, argument, memoize=self.memoize),
self.value self.value
) )

View File

@ -1,19 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.indexed import Indexed
__all__ = ('EIndexed',)
class EIndexed(Evaluable):
def __init__(self, ev: evtype, indexed: Indexed):
self.ev = ev
self.indexed = indexed
def next(self) -> Evaluable:
return self.indexed.evaluable(self.ev)
def __str__(self):
return f'{self.indexed}'

View File

@ -2,7 +2,7 @@
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.av.lambdaenv import LambdaEnv from bu4.evaluation.av.lambdaenv import LambdaEnv
from bu4.evaluation.constructs.elinked import ELinked from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.linking.constructs.linked import Linked from bu4.linking.constructs.linked import Linked
@ -19,7 +19,7 @@ class ELambda(EValue):
self.memoize = name in value.multifuture self.memoize = name in value.multifuture
def call(self, argument: Evaluable) -> Evaluable: def call(self, argument: Evaluable) -> Evaluable:
return ELinked( return EAttachable(
LambdaEnv(self.env, self.name, argument, memoize=self.memoize) if self.used else self.env, LambdaEnv(self.env, self.name, argument, memoize=self.memoize) if self.used else self.env,
self.value self.value
) )

View File

@ -1,19 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.linking.constructs.linked import Linked
__all__ = ('ELinked',)
class ELinked(Evaluable):
def __init__(self, env: envtype, linked: Linked):
self.env = env
self.linked = linked
def next(self) -> Evaluable:
return self.linked.evaluable(self.env)
def __str__(self):
return f'{self.linked}'

View File

@ -1,22 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.eindexed import EIndexed
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.targets.avtarget import AVTarget
from bu4.indexing.constructs.indexed import Indexed
__all__ = ('AVICall',)
class AVICall(AVTarget):
def __init__(self, ev: evtype, argument: Indexed):
self.ev = ev
self.argument = argument
def given(self, value: EValue) -> Evaluable:
return value.call(EIndexed(self.ev, self.argument))
def __str__(self):
return f'({self.argument})'

View File

@ -5,10 +5,10 @@ from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.targets.avtarget import AVTarget from bu4.evaluation.targets.avtarget import AVTarget
__all__ = ('AVIContainer',) __all__ = ('AVAnonymousContainer',)
class AVIContainer(AVTarget): class AVAnonymousContainer(AVTarget):
def __init__(self, evaluable: Evaluable): def __init__(self, evaluable: Evaluable):
self.after_value = AfterValue(evaluable, self) self.after_value = AfterValue(evaluable, self)

View File

@ -1,22 +1,25 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype from typing import TypeVar, Generic
from bu4.evaluation.constructs.elinked import ELinked
from bu4.evaluation.constructs.attachable import Attachable
from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.targets.avtarget import AVTarget from bu4.evaluation.targets.avtarget import AVTarget
from bu4.linking.constructs.linked import Linked
__all__ = ('AVCall',) __all__ = ('AVCall',)
T = TypeVar('T')
class AVCall(AVTarget):
def __init__(self, env: envtype, argument: Linked): class AVCall(AVTarget, Generic[T]):
self.env = env def __init__(self, t: T, argument: Attachable[T]):
self.t = t
self.argument = argument self.argument = argument
def given(self, value: EValue) -> Evaluable: def given(self, value: EValue) -> Evaluable:
return value.call(ELinked(self.env, self.argument)) return value.call(EAttachable(self.t, self.argument))
def __str__(self): def __str__(self):
return f'({self.argument})' return f'({self.argument})'

View File

@ -5,10 +5,10 @@ from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.targets.avtarget import AVTarget from bu4.evaluation.targets.avtarget import AVTarget
__all__ = ('AVContainer',) __all__ = ('AVNamedContainer',)
class AVContainer(AVTarget): class AVNamedContainer(AVTarget):
def __init__(self, evaluable: Evaluable, name: bytes): def __init__(self, evaluable: Evaluable, name: bytes):
self.after_value = AfterValue(evaluable, self) self.after_value = AfterValue(evaluable, self)
self.name = name self.name = name

View File

@ -2,9 +2,9 @@
from bu4.evaluation.av.aftervalue import AfterValue from bu4.evaluation.av.aftervalue import AfterValue
from bu4.evaluation.av.evtype import evtype from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.eindexed import EIndexed from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.targets.avIcall import AVICall from bu4.evaluation.targets.avcall import AVCall
from bu4.indexing.constructs.indexed import Indexed from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_CALL from bu4.parsing.codes import CODE_CALL
@ -16,8 +16,8 @@ class ICall(Indexed):
self.argument = argument self.argument = argument
self.lambda_ = lambda_ self.lambda_ = lambda_
def evaluable(self, ev: evtype) -> Evaluable: def attach(self, ev: evtype) -> Evaluable:
return AfterValue(EIndexed(ev, self.lambda_), AVICall(ev, self.argument)) return AfterValue(EAttachable(ev, self.lambda_), AVCall(ev, self.argument))
def __str__(self): def __str__(self):
return f'/{self.argument}{self.lambda_}' return f'/{self.argument}{self.lambda_}'

View File

@ -13,7 +13,7 @@ class IDelayed(Indexed):
def __init__(self, value: Indexed): def __init__(self, value: Indexed):
self.value = value self.value = value
def evaluable(self, ev: evtype) -> Evaluable: def attach(self, ev: evtype) -> Evaluable:
return EIDelayed( return EIDelayed(
ev, ev,
self.value self.value

View File

@ -13,7 +13,7 @@ class IException(Indexed):
def __init__(self, name: bytes): def __init__(self, name: bytes):
self.name = name self.name = name
def evaluable(self, ev: evtype) -> Evaluable: def attach(self, ev: evtype) -> Evaluable:
return EException(self.name) return EException(self.name)
def __str__(self): def __str__(self):

View File

@ -15,7 +15,7 @@ class ILambda(Indexed):
self.table = table self.table = table
self.memoize = memoize self.memoize = memoize
def evaluable(self, ev: evtype) -> Evaluable: def attach(self, ev: evtype) -> Evaluable:
return EILambda( return EILambda(
[ev[i] for i in self.table], [ev[i] for i in self.table],
self.value, self.value,

View File

@ -12,7 +12,7 @@ class IName(Indexed):
def __init__(self, index: int): def __init__(self, index: int):
self.index = index self.index = index
def evaluable(self, ev: evtype) -> Evaluable: def attach(self, ev: evtype) -> Evaluable:
return ev[self.index] return ev[self.index]
def __str__(self): def __str__(self):

View File

@ -1,13 +1,14 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.evtype import evtype from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.attachable import Attachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('Indexed',) __all__ = ('Indexed',)
class Indexed: class Indexed(Attachable[evtype]):
def evaluable(self, ev: evtype) -> Evaluable: def attach(self, ev: evtype) -> Evaluable:
raise NotImplementedError raise NotImplementedError
def __bytes__(self): def __bytes__(self):

View File

@ -10,7 +10,7 @@ __all__ = ('INull',)
class INull(Indexed): class INull(Indexed):
def evaluable(self, ev: evtype) -> Evaluable: def attach(self, ev: evtype) -> Evaluable:
return ENull() return ENull()
def __str__(self): def __str__(self):

View File

@ -1,32 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.afterindexing import AfterIndexing
from bu4.indexing.states.indexingfinished import IndexingFinished
from bu4.indexing.states.indexinglinked import IndexingLinked
from bu4.indexing.states.indexingstate import IndexingState
from bu4.indexing.targets.aichain import AIChain
__all__ = ('index_finish',)
def _afterindexing_iteration(state: AfterIndexing) -> IndexingState:
if isinstance(state.state, IndexingFinished):
state = state.target.given(state.state.indexed)
elif isinstance(state.state, AfterIndexing):
state.state, state.target = state.state.state, AIChain(state.state.target, state.target)
elif isinstance(state.state, IndexingLinked):
state.state = state.state.linked.index(state.state.promise)
else:
raise TypeError
return state
def index_finish(state: IndexingState) -> Indexed:
while True:
if isinstance(state, IndexingFinished):
return state.indexed
elif isinstance(state, AfterIndexing):
state = _afterindexing_iteration(state)
else:
raise TypeError

View File

@ -1,12 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.states.indexingstate import IndexingState
from bu4.indexing.targets.aitargett import AITarget
__all__ = ('AfterIndexing',)
class AfterIndexing(IndexingState):
def __init__(self, state: IndexingState, target: AITarget):
self.state = state
self.target = target

View File

@ -1,11 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.indexingstate import IndexingState
__all__ = ('IndexingFinished',)
class IndexingFinished(IndexingState):
def __init__(self, indexed: Indexed):
self.indexed = indexed

View File

@ -1,12 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.states.indexingstate import IndexingState
from bu4.linking.constructs.linked import Linked
__all__ = ('IndexingLinked',)
class IndexingLinked(IndexingState):
def __init__(self, promise: list[bytes], linked: Linked):
self.promise = promise
self.linked = linked

View File

@ -1,7 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('IndexingState',)
class IndexingState:
pass

View File

@ -1,17 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.afterindexing import AfterIndexing
from bu4.indexing.states.indexingstate import IndexingState
from bu4.indexing.targets.aitargett import AITarget
__all__ = ('AIChain',)
class AIChain(AITarget):
def __init__(self, target: AITarget, aftertarget: AITarget):
self.target = target
self.aftertarget = aftertarget
def given(self, indexed: Indexed) -> IndexingState:
return AfterIndexing(self.target.given(indexed), self.aftertarget)

View File

@ -1,17 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import Callable
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.indexingstate import IndexingState
from bu4.indexing.targets.aitargett import AITarget
__all__ = ('AILambda',)
class AILambda(AITarget):
def __init__(self, lambda_: Callable[[Indexed], IndexingState]):
self.lambda_ = lambda_
def given(self, indexed: Indexed) -> IndexingState:
return self.lambda_(indexed)

View File

@ -1,11 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.indexingstate import IndexingState
__all__ = ('AITarget',)
class AITarget:
def given(self, indexed: Indexed) -> IndexingState:
raise NotImplementedError

View File

@ -2,11 +2,10 @@
from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.sync import sync from bu4.evaluation.sync import sync
from bu4.indexing.index_finish import index_finish
from bu4.linking.link_finish import link_finish
from bu4.parsing.toolchain.parse import parse from bu4.parsing.toolchain.parse import parse
from bu4.parsing.toolchain.stdext import standard_extension from bu4.parsing.toolchain.stdext import standard_extension
from bu4.parsing.toolchain.transply import transply from bu4.parsing.toolchain.transply import transply
from bu4.transform.transform import transform
__all__ = ('isynced',) __all__ = ('isynced',)
@ -14,7 +13,7 @@ __all__ = ('isynced',)
def isynced(source: str) -> EValue: def isynced(source: str) -> EValue:
bsource = transply(source) bsource = transply(source)
parsed = parse(bsource, standard_extension) parsed = parse(bsource, standard_extension)
linked = link_finish(parsed.link(set())) linked = transform(parsed.link(set()))
indexed = index_finish(linked.index([])) indexed = transform(linked.index([]))
evaluable = indexed.evaluable([]) evaluable = indexed.attach([])
return sync(evaluable) return sync(evaluable)

View File

@ -2,16 +2,17 @@
from bu4.evaluation.av.aftervalue import AfterValue from bu4.evaluation.av.aftervalue import AfterValue
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elinked import ELinked from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.targets.avcall import AVCall from bu4.evaluation.targets.avcall import AVCall
from bu4.indexing.constructs.icall import ICall from bu4.indexing.constructs.icall import ICall
from bu4.indexing.states.afterindexing import AfterIndexing from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.indexingfinished import IndexingFinished
from bu4.indexing.states.indexinglinked import IndexingLinked
from bu4.indexing.states.indexingstate import IndexingState
from bu4.indexing.targets.ailambda import AILambda
from bu4.linking.constructs.linked import Linked from bu4.linking.constructs.linked import Linked
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('LCall',) __all__ = ('LCall',)
@ -30,17 +31,17 @@ class LCall(Linked):
(self.argument.future & self.lambda_.future) (self.argument.future & self.lambda_.future)
) )
def evaluable(self, env: envtype) -> Evaluable: def attach(self, env: envtype) -> Evaluable:
return AfterValue(ELinked(env, self.lambda_), AVCall(env, self.argument)) return AfterValue(EAttachable(env, self.lambda_), AVCall(env, self.argument))
def index(self, promise: list[bytes]) -> IndexingState: def index(self, promise: list[bytes]) -> TransformState[Indexed]:
return AfterIndexing( return AfterTransform(
IndexingLinked(promise, self.argument), TransformStart(lambda: self.argument.index(promise)),
AILambda( ATLambda(
lambda argument: AfterIndexing( lambda argument: AfterTransform(
IndexingLinked(promise, self.lambda_), TransformStart(lambda: self.lambda_.index(promise)),
AILambda( ATLambda(
lambda lambda_: IndexingFinished(ICall(argument, lambda_)) lambda lambda_: TransformFinished(ICall(argument, lambda_))
) )
) )
) )

View File

@ -4,9 +4,10 @@ from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.eexception import EException from bu4.evaluation.constructs.eexception import EException
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.iexception import IException from bu4.indexing.constructs.iexception import IException
from bu4.indexing.states.indexingfinished import IndexingFinished from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.indexingstate import IndexingState
from bu4.linking.constructs.linked import Linked from bu4.linking.constructs.linked import Linked
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('LException',) __all__ = ('LException',)
@ -17,11 +18,11 @@ class LException(Linked):
self.future = set() self.future = set()
self.multifuture = set() self.multifuture = set()
def evaluable(self, env: envtype) -> Evaluable: def attach(self, env: envtype) -> Evaluable:
return EException(self.name) return EException(self.name)
def index(self, promise: list[bytes]) -> IndexingState: def index(self, promise: list[bytes]) -> TransformState[Indexed]:
return IndexingFinished(IException(self.name)) return TransformFinished(IException(self.name))
def __str__(self): def __str__(self):
return f'«{self.name.decode()}»' return f'«{self.name.decode()}»'

View File

@ -1,19 +1,20 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.attachable import Attachable
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.indexed import Indexed
from bu4.transform.states.transformstate import TransformState
__all__ = ('Linked',) __all__ = ('Linked',)
from bu4.indexing.states.indexingstate import IndexingState
class Linked(Attachable[envtype]):
class Linked:
future: set[bytes] future: set[bytes]
multifuture: set[bytes] multifuture: set[bytes]
def evaluable(self, env: envtype) -> Evaluable: def attach(self, env: envtype) -> Evaluable:
raise NotImplementedError raise NotImplementedError
def index(self, promise: list[bytes]) -> IndexingState: def index(self, promise: list[bytes]) -> TransformState[Indexed]:
raise NotImplementedError raise NotImplementedError

View File

@ -6,12 +6,13 @@ from bu4.evaluation.constructs.elambda import ELambda
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.idelayed import IDelayed from bu4.indexing.constructs.idelayed import IDelayed
from bu4.indexing.constructs.ilambda import ILambda from bu4.indexing.constructs.ilambda import ILambda
from bu4.indexing.states.afterindexing import AfterIndexing from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.indexingfinished import IndexingFinished
from bu4.indexing.states.indexinglinked import IndexingLinked
from bu4.indexing.states.indexingstate import IndexingState
from bu4.indexing.targets.ailambda import AILambda
from bu4.linking.constructs.linked import Linked from bu4.linking.constructs.linked import Linked
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('LLambda',) __all__ = ('LLambda',)
@ -27,7 +28,7 @@ class LLambda(Linked):
self.used = name in value.future self.used = name in value.future
self.memoize = name in value.multifuture self.memoize = name in value.multifuture
def evaluable(self, env: envtype) -> Evaluable: def attach(self, env: envtype) -> Evaluable:
return ( return (
ELambda( ELambda(
{name: env[name] for name in self.future} if self.used else env, {name: env[name] for name in self.future} if self.used else env,
@ -40,20 +41,20 @@ class LLambda(Linked):
EDelayed(env, self.value) EDelayed(env, self.value)
) )
def index(self, promise: list[bytes]) -> IndexingState: def index(self, promise: list[bytes]) -> TransformState[Indexed]:
if not self.used: if not self.used:
return AfterIndexing( return AfterTransform(
IndexingLinked(promise, self.value), TransformStart(lambda: self.value.index(promise)),
AILambda( ATLambda(
lambda value: IndexingFinished(IDelayed(value)) lambda value: TransformFinished(IDelayed(value))
) )
) )
else: else:
table = [i for i in range(len(promise)) if promise[i] in self.future] table = [i for i in range(len(promise)) if promise[i] in self.future]
return AfterIndexing( return AfterTransform(
IndexingLinked([self.name] + [promise[i] for i in table], self.value), TransformStart(lambda: self.value.index([self.name] + [promise[i] for i in table])),
AILambda( ATLambda(
lambda value: IndexingFinished(ILambda( lambda value: TransformFinished(ILambda(
value, value,
table, table,
memoize=self.memoize memoize=self.memoize

View File

@ -3,9 +3,10 @@
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.iname import IName from bu4.indexing.constructs.iname import IName
from bu4.indexing.states.indexingfinished import IndexingFinished from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.states.indexingstate import IndexingState
from bu4.linking.constructs.linked import Linked from bu4.linking.constructs.linked import Linked
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('LName',) __all__ = ('LName',)
@ -16,11 +17,11 @@ class LName(Linked):
self.future = {name} self.future = {name}
self.multifuture = set() self.multifuture = set()
def evaluable(self, env: envtype) -> Evaluable: def attach(self, env: envtype) -> Evaluable:
return env[self.name] return env[self.name]
def index(self, promise: list[bytes]) -> IndexingState: def index(self, promise: list[bytes]) -> TransformState[Indexed]:
return IndexingFinished(IName(promise.index(self.name))) return TransformFinished(IName(promise.index(self.name)))
def __str__(self): def __str__(self):
return f'[{self.name.decode()}]' return f'[{self.name.decode()}]'

View File

@ -3,10 +3,11 @@
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.enull import ENull from bu4.evaluation.constructs.enull import ENull
from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.constructs.inull import INull from bu4.indexing.constructs.inull import INull
from bu4.indexing.states.indexingfinished import IndexingFinished
from bu4.indexing.states.indexingstate import IndexingState
from bu4.linking.constructs.linked import Linked from bu4.linking.constructs.linked import Linked
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('LNull',) __all__ = ('LNull',)
@ -16,11 +17,11 @@ class LNull(Linked):
self.future = set() self.future = set()
self.multifuture = set() self.multifuture = set()
def evaluable(self, env: envtype) -> Evaluable: def attach(self, env: envtype) -> Evaluable:
return ENull() return ENull()
def index(self, promise: list[bytes]) -> IndexingState: def index(self, promise: list[bytes]) -> TransformState[Indexed]:
return IndexingFinished(INull()) return TransformFinished(INull())
def __str__(self): def __str__(self):
return '?' return '?'

View File

@ -1,14 +1,13 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elinked import ELinked from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.linking.link_finish import link_finish from bu4.parsing.constructs.parsed import Parsed
from bu4.transform.transform import transform
__all__ = ('evaluable_from_parsed',) __all__ = ('evaluable_from_parsed',)
from bu4.parsing.constructs.parsed import Parsed
def evaluable_from_parsed(env: envtype, parsed: Parsed): def evaluable_from_parsed(env: envtype, parsed: Parsed):
linked = link_finish(parsed.link(set(env))) linked = transform(parsed.link(set(env)))
return ELinked(env, linked) return EAttachable(env, linked)

View File

@ -1,32 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.alchain import ALChain
from bu4.linking.constructs.linked import Linked
__all__ = ('link_finish',)
def _afterlinking_iteration(state: AfterLinking) -> LinkingState:
if isinstance(state.state, LinkingFinished):
state = state.target.given(state.state.linked)
elif isinstance(state.state, AfterLinking):
state.state, state.target = state.state.state, ALChain(state.state.target, state.target)
elif isinstance(state.state, LinkingParsed):
state.state = state.state.parsed.link(state.state.promise)
else:
raise TypeError
return state
def link_finish(state: LinkingState) -> Linked:
while True:
if isinstance(state, LinkingFinished):
return state.linked
elif isinstance(state, AfterLinking):
state = _afterlinking_iteration(state)
else:
raise TypeError

View File

@ -1,12 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.altarget import ALTarget
__all__ = ('AfterLinking',)
class AfterLinking(LinkingState):
def __init__(self, state: LinkingState, target: ALTarget):
self.state = state
self.target = target

View File

@ -1,11 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.constructs.linked import Linked
__all__ = ('LinkingFinished',)
class LinkingFinished(LinkingState):
def __init__(self, linked: Linked):
self.linked = linked

View File

@ -1,12 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.parsed import Parsed
__all__ = ('LinkingParsed',)
class LinkingParsed(LinkingState):
def __init__(self, promise: set[bytes], parsed: Parsed):
self.promise = promise
self.parsed = parsed

View File

@ -1,7 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('LinkingState',)
class LinkingState:
pass

View File

@ -1,17 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.altarget import ALTarget
from bu4.linking.constructs.linked import Linked
__all__ = ('ALChain',)
class ALChain(ALTarget):
def __init__(self, target: ALTarget, aftertarget: ALTarget):
self.target = target
self.aftertarget = aftertarget
def given(self, linked: Linked) -> LinkingState:
return AfterLinking(self.target.given(linked), self.aftertarget)

View File

@ -1,17 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import Callable
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.altarget import ALTarget
from bu4.linking.constructs.linked import Linked
__all__ = ('ALLambda',)
class ALLambda(ALTarget):
def __init__(self, lambda_: Callable[[Linked], LinkingState]):
self.lambda_ = lambda_
def given(self, linked: Linked) -> LinkingState:
return self.lambda_(linked)

View File

@ -1,11 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.constructs.linked import Linked
__all__ = ('ALTarget',)
class ALTarget:
def given(self, linked: Linked) -> LinkingState:
raise NotImplementedError

View File

@ -1,12 +1,20 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar, Generic
from bu4.parsing.extensions.abstractextension import AbstractExtension
__all__ = ('AbstractParser',) __all__ = ('AbstractParser',)
T = TypeVar('T')
class AbstractParser:
class AbstractParser(Generic[T]):
def read(self) -> int: def read(self) -> int:
raise NotImplementedError raise NotImplementedError
def parse_name(self) -> bytes: def parse_name(self) -> bytes:
raise NotImplementedError raise NotImplementedError
def extension_for(self, code: int) -> AbstractExtension[T]:
raise NotImplementedError

View File

@ -1,10 +1,11 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.constructs.linked import Linked
from bu4.transform.states.transformstate import TransformState
__all__ = ('Parsed',) __all__ = ('Parsed',)
from bu4.linking.states.linkingstate import LinkingState
class Parsed: class Parsed:
def link(self, promise: set[bytes]) -> LinkingState: def link(self, promise: set[bytes]) -> TransformState[Linked]:
raise NotImplementedError raise NotImplementedError

View File

@ -1,14 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PCall',)
from bu4.linking.constructs.lcall import LCall from bu4.linking.constructs.lcall import LCall
from bu4.linking.states.afterlinking import AfterLinking from bu4.linking.constructs.linked import Linked
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.allambda import ALLambda
from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.parsed import Parsed
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('PCall',)
class PCall(Parsed): class PCall(Parsed):
@ -16,14 +17,14 @@ class PCall(Parsed):
self.argument = argument self.argument = argument
self.lambda_ = lambda_ self.lambda_ = lambda_
def link(self, promise: set[bytes]) -> LinkingState: def link(self, promise: set[bytes]) -> TransformState[Linked]:
return AfterLinking( return AfterTransform(
LinkingParsed(promise, self.argument), TransformStart(lambda: self.argument.link(promise)),
ALLambda( ATLambda(
lambda argument: AfterLinking( lambda argument: AfterTransform(
LinkingParsed(promise, self.lambda_), TransformStart(lambda: self.lambda_.link(promise)),
ALLambda( ATLambda(
lambda lambda_: LinkingFinished(LCall(argument, lambda_)) lambda lambda_: TransformFinished(LCall(argument, lambda_))
) )
) )
) )

View File

@ -1,16 +1,17 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PException',)
from bu4.linking.constructs.lexception import LException from bu4.linking.constructs.lexception import LException
from bu4.linking.states.linkingfinished import LinkingFinished from bu4.linking.constructs.linked import Linked
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('PException',)
class PException(Parsed): class PException(Parsed):
def __init__(self, name: bytes): def __init__(self, name: bytes):
self.name = name self.name = name
def link(self, promise: set[bytes]) -> LinkingState: def link(self, promise: set[bytes]) -> TransformState[Linked]:
return LinkingFinished(LException(self.name)) return TransformFinished(LException(self.name))

View File

@ -1,14 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PLambda',) from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.llambda import LLambda from bu4.linking.constructs.llambda import LLambda
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.allambda import ALLambda
from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.parsed import Parsed
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('PLambda',)
class PLambda(Parsed): class PLambda(Parsed):
@ -16,15 +17,12 @@ class PLambda(Parsed):
self.name = name self.name = name
self.value = value self.value = value
def link(self, promise: set[bytes]) -> LinkingState: def link(self, promise: set[bytes]) -> TransformState[Linked]:
assert self.name not in promise, f'overloaded: {self.name}' assert self.name not in promise, f'overloaded: {self.name}'
return AfterLinking( return AfterTransform(
LinkingParsed( TransformStart(lambda: self.value.link(promise | {self.name})),
promise | {self.name}, ATLambda(
self.value lambda value: TransformFinished(LLambda(
),
ALLambda(
lambda value: LinkingFinished(LLambda(
self.name, self.name,
value value
)) ))

View File

@ -1,17 +1,18 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PName',) from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.lname import LName from bu4.linking.constructs.lname import LName
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('PName',)
class PName(Parsed): class PName(Parsed):
def __init__(self, name: bytes): def __init__(self, name: bytes):
self.name = name self.name = name
def link(self, promise: set[bytes]) -> LinkingState: def link(self, promise: set[bytes]) -> TransformState[Linked]:
assert self.name in promise, f'undefined: {self.name}' assert self.name in promise, f'undefined: {self.name}'
return LinkingFinished(LName(self.name)) return TransformFinished(LName(self.name))

View File

@ -1,13 +1,14 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.lnull import LNull
from bu4.parsing.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('PNull',) __all__ = ('PNull',)
from bu4.linking.constructs.lnull import LNull
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.parsed import Parsed
class PNull(Parsed): class PNull(Parsed):
def link(self, promise: set[bytes]) -> LinkingState: def link(self, promise: set[bytes]) -> TransformState[Linked]:
return LinkingFinished(LNull()) return TransformFinished(LNull())

View File

@ -0,0 +1,16 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar, Generic
from bu4.transform.states.transformstate import TransformState
__all__ = ('AbstractExtension',)
T = TypeVar('T')
class AbstractExtension(Generic[T]):
code: int
def apply(self) -> TransformState[T]:
raise NotImplementedError

View File

@ -1,15 +1,17 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from abc import ABC
from typing import TypeVar
from bu4.parsing.abstractparser import AbstractParser from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.states.parsingstate import ParsingState from bu4.parsing.extensions.abstractextension import AbstractExtension
from bu4.parsing.states.afterparsing import AfterParsing
__all__ = ('Extension',) __all__ = ('Extension',)
T = TypeVar('T')
class Extension:
code: int
class Extension(AbstractExtension[T], ABC):
def __init_subclass__(cls, /, code: int = None, **kwargs): def __init_subclass__(cls, /, code: int = None, **kwargs):
super().__init_subclass__(**kwargs) super().__init_subclass__(**kwargs)
if code is None: if code is None:
@ -18,6 +20,3 @@ class Extension:
def __init__(self, parser: AbstractParser): def __init__(self, parser: AbstractParser):
self.parser = parser self.parser = parser
def apply(self, state: AfterParsing) -> ParsingState:
raise NotImplementedError

View File

@ -1,15 +1,14 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_CALL from bu4.parsing.codes import CODE_CALL
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState
from bu4.parsing.states.afterparsing import AfterParsing
from bu4.parsing.states.parsing_call import parsing_call from bu4.parsing.states.parsing_call import parsing_call
from bu4.transform.states.transformstate import TransformState
__all__ = ('XCall',) __all__ = ('XCall',)
class XCall(Extension, code=CODE_CALL): class XCall(Extension[Parsed], code=CODE_CALL):
def apply(self, state: AfterParsing) -> ParsingState: def apply(self) -> TransformState[Parsed]:
state.state = parsing_call() return parsing_call(self.parser)
return state

View File

@ -1,25 +1,24 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_MAKE from bu4.parsing.codes import CODE_MAKE
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.constructs.plambda import PLambda from bu4.parsing.constructs.plambda import PLambda
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState
from bu4.parsing.states.afterparsing import AfterParsing
from bu4.parsing.states.parsingfinished import ParsingFinished
from bu4.parsing.states.parsingread import ParsingRead from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('XMake',) __all__ = ('XMake',)
from bu4.parsing.targets.aplambda import APLambda
class XMake(Extension[Parsed], code=CODE_MAKE):
class XMake(Extension, code=CODE_MAKE): def apply(self) -> TransformState[Parsed]:
def apply(self, state: AfterParsing) -> ParsingState:
name = self.parser.parse_name() name = self.parser.parse_name()
state.state = AfterParsing( return AfterTransform(
ParsingRead(), ParsingRead(self.parser),
APLambda( ATLambda(
lambda value: ParsingFinished(PLambda(name, value)) lambda value: TransformFinished(PLambda(name, value))
) )
) )
return state

View File

@ -1,16 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_NAME from bu4.parsing.codes import CODE_NAME
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.constructs.pname import PName from bu4.parsing.constructs.pname import PName
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.states.afterparsing import AfterParsing from bu4.transform.states.transformstate import TransformState
from bu4.parsing.states.parsingfinished import ParsingFinished
__all__ = ('XName',) __all__ = ('XName',)
class XName(Extension, code=CODE_NAME): class XName(Extension[Parsed], code=CODE_NAME):
def apply(self, state: AfterParsing) -> ParsingState: def apply(self) -> TransformState[Parsed]:
state.state = ParsingFinished(PName(self.parser.parse_name())) return TransformFinished(PName(self.parser.parse_name()))
return state

View File

@ -1,16 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_NULL from bu4.parsing.codes import CODE_NULL
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.constructs.pnull import PNull from bu4.parsing.constructs.pnull import PNull
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.states.afterparsing import AfterParsing from bu4.transform.states.transformstate import TransformState
from bu4.parsing.states.parsingfinished import ParsingFinished
__all__ = ('XNull',) __all__ = ('XNull',)
class XNull(Extension, code=CODE_NULL): class XNull(Extension[Parsed], code=CODE_NULL):
def apply(self, state: AfterParsing) -> ParsingState: def apply(self) -> TransformState[Parsed]:
state.state = ParsingFinished(PNull()) return TransformFinished(PNull())
return state

View File

@ -1,16 +1,16 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_QOPN, CODE_QCLS from bu4.parsing.codes import CODE_QOPN, CODE_QCLS
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.states.afterparsing import AfterParsing
from bu4.parsing.targets.apchain import APChain
from bu4.parsing.targets.apendswith import APEndsWith from bu4.parsing.targets.apendswith import APEndsWith
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformstate import TransformState
__all__ = ('XQopn',) __all__ = ('XQopn',)
class XQopn(Extension, code=CODE_QOPN): class XQopn(Extension[Parsed], code=CODE_QOPN):
def apply(self, state: AfterParsing) -> ParsingState: def apply(self) -> TransformState[Parsed]:
state.target = APChain(APEndsWith(self.parser, CODE_QCLS, 'quot expected'), state.target) return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, CODE_QCLS, 'quot expected'))
return state

View File

@ -1,16 +1,16 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_QUOT from bu4.parsing.codes import CODE_QUOT
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.states.afterparsing import AfterParsing
from bu4.parsing.targets.apchain import APChain
from bu4.parsing.targets.apendswith import APEndsWith from bu4.parsing.targets.apendswith import APEndsWith
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformstate import TransformState
__all__ = ('XQuot',) __all__ = ('XQuot',)
class XQuot(Extension, code=CODE_QUOT): class XQuot(Extension[Parsed], code=CODE_QUOT):
def apply(self, state: AfterParsing) -> ParsingState: def apply(self) -> TransformState[Parsed]:
state.target = APChain(APEndsWith(self.parser, CODE_QUOT, 'quot expected'), state.target) return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, CODE_QUOT, 'quot expected'))
return state

View File

@ -1,13 +1,14 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_SKIP from bu4.parsing.codes import CODE_SKIP
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.states.afterparsing import AfterParsing from bu4.transform.states.transformstate import TransformState
__all__ = ('XSkip',) __all__ = ('XSkip',)
class XSkip(Extension, code=CODE_SKIP): class XSkip(Extension[Parsed], code=CODE_SKIP):
def apply(self, state: AfterParsing) -> ParsingState: def apply(self) -> TransformState[Parsed]:
return state return ParsingRead(self.parser)

View File

@ -1,16 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_XCPT from bu4.parsing.codes import CODE_XCPT
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.constructs.pexception import PException from bu4.parsing.constructs.pexception import PException
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.states.afterparsing import AfterParsing from bu4.transform.states.transformstate import TransformState
from bu4.parsing.states.parsingfinished import ParsingFinished
__all__ = ('XXcpt',) __all__ = ('XXcpt',)
class XXcpt(Extension, code=CODE_XCPT): class XXcpt(Extension[Parsed], code=CODE_XCPT):
def apply(self, state: AfterParsing) -> ParsingState: def apply(self) -> TransformState[Parsed]:
state.state = ParsingFinished(PException(self.parser.parse_name())) return TransformFinished(PException(self.parser.parse_name()))
return state

View File

@ -1,25 +1,23 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from io import BytesIO from io import BytesIO
from typing import Iterable, Type from typing import Iterable, Type, TypeVar
from bu4.parsing.abstractparser import AbstractParser from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.extensions.abstractextension import AbstractExtension
from bu4.parsing.extensions.extension import Extension from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingstate import ParsingState
from bu4.parsing.states.afterparsing import AfterParsing
from bu4.parsing.states.parsingfinished import ParsingFinished
from bu4.parsing.states.parsingread import ParsingRead from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.targets.apchain import APChain from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.targets.aplambda import APLambda
__all__ = ('Parser',) __all__ = ('Parser',)
T = TypeVar('T')
class Parser(AbstractParser):
def __init__(self, source: bytes, extensions: Iterable[Type[Extension]]): class Parser(AbstractParser[T]):
def __init__(self, source: bytes, extensions: Iterable[Type[Extension[T]]]):
self.__source = BytesIO(source) self.__source = BytesIO(source)
self.__extensions: dict[int, Extension] = {} self.__extensions: dict[int, Extension[T]] = {}
for extension in extensions: for extension in extensions:
if extension.code in self.__extensions: if extension.code in self.__extensions:
raise ValueError('code overload') raise ValueError('code overload')
@ -37,31 +35,15 @@ class Parser(AbstractParser):
return s.getvalue() return s.getvalue()
s.write(bytes([c])) s.write(bytes([c]))
def _state_read(self, state: AfterParsing) -> ParsingState: def extension_for(self, code: int) -> AbstractExtension[T]:
code = self.read()
extension = self.__extensions.get(code) extension = self.__extensions.get(code)
if extension is None: if extension is None:
raise ValueError(f'unknown control: {hex(code)}') raise ValueError(f'unknown control: {hex(code)}')
state = extension.apply(state) return extension
return state
def _state_next(self, state: AfterParsing) -> ParsingState: def parse(self) -> T:
if isinstance(state.state, AfterParsing): state = ParsingRead(self)
state.state, state.target = state.state.state, APChain(state.state.target, state.target)
elif isinstance(state.state, ParsingFinished):
state = state.target.given(state.state.parsed)
elif isinstance(state.state, ParsingRead):
state = self._state_read(state)
else:
raise TypeError
return state
def parse(self) -> Parsed:
state = AfterParsing(ParsingRead(), APLambda(lambda parsed: ParsingFinished(parsed)))
while True: while True:
if isinstance(state, ParsingFinished): if isinstance(state, TransformFinished):
return state.parsed return state.transformed
elif isinstance(state, AfterParsing): state = state.next()
state = self._state_next(state)
else:
raise TypeError

View File

@ -1,12 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.states.parsingstate import ParsingState
from bu4.parsing.targets.aptarget import APTarget
__all__ = ('AfterParsing',)
class AfterParsing(ParsingState):
def __init__(self, state: ParsingState, target: APTarget):
self.state = state
self.target = target

View File

@ -1,22 +1,25 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.constructs.pcall import PCall from bu4.parsing.constructs.pcall import PCall
from bu4.parsing.states.afterparsing import AfterParsing
from bu4.parsing.states.parsingfinished import ParsingFinished
from bu4.parsing.states.parsingread import ParsingRead from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.targets.aplambda import APLambda from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('parsing_call',) __all__ = ('parsing_call',)
def parsing_call(): def parsing_call(parser: AbstractParser[Parsed]) -> TransformState[Parsed]:
return AfterParsing( return AfterTransform(
ParsingRead(), ParsingRead(parser),
APLambda( ATLambda(
lambda argument: AfterParsing( lambda argument: AfterTransform(
ParsingRead(), ParsingRead(parser),
APLambda( ATLambda(
lambda lambda_: ParsingFinished( lambda lambda_: TransformFinished(
PCall( PCall(
argument, argument,
lambda_ lambda_

View File

@ -1,11 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsingstate import ParsingState
__all__ = ('ParsingFinished',)
class ParsingFinished(ParsingState):
def __init__(self, parsed: Parsed):
self.parsed = parsed

View File

@ -1,9 +1,20 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.states.parsingstate import ParsingState from typing import TypeVar
from bu4.parsing.abstractparser import AbstractParser
from bu4.transform.states.transformstate import TransformState
__all__ = ('ParsingRead',) __all__ = ('ParsingRead',)
T = TypeVar('T')
class ParsingRead(ParsingState):
pass class ParsingRead(TransformState[T]):
def __init__(self, parser: AbstractParser[T]):
self.parser = parser
def next(self) -> TransformState[T]:
code = self.parser.read()
extension = self.parser.extension_for(code)
return extension.apply()

View File

@ -1,7 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('ParsingState',)
class ParsingState:
pass

View File

@ -1,17 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsingstate import ParsingState
from bu4.parsing.states.afterparsing import AfterParsing
from bu4.parsing.targets.aptarget import APTarget
__all__ = ('APChain',)
class APChain(APTarget):
def __init__(self, target: APTarget, aftertarget: APTarget):
self.target = target
self.aftertarget = aftertarget
def given(self, parsed: Parsed) -> ParsingState:
return AfterParsing(self.target.given(parsed), self.aftertarget)

View File

@ -1,20 +1,23 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar
from bu4.parsing.abstractparser import AbstractParser from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.constructs.parsed import Parsed from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.states.parsingstate import ParsingState from bu4.transform.states.transformstate import TransformState
from bu4.parsing.states.parsingfinished import ParsingFinished from bu4.transform.targets.attarget import ATTarget
from bu4.parsing.targets.aptarget import APTarget
__all__ = ('APEndsWith',) __all__ = ('APEndsWith',)
T = TypeVar('T')
class APEndsWith(APTarget):
class APEndsWith(ATTarget[T]):
def __init__(self, parser: AbstractParser, expected: int, message: str): def __init__(self, parser: AbstractParser, expected: int, message: str):
self.parser = parser self.parser = parser
self.expected = expected self.expected = expected
self.message = message self.message = message
def given(self, parsed: Parsed) -> ParsingState: def given(self, parsed: T) -> TransformState[T]:
assert self.parser.read() == self.expected, self.message assert self.parser.read() == self.expected, self.message
return ParsingFinished(parsed) return TransformFinished(parsed)

View File

@ -1,17 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import Callable
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsingstate import ParsingState
from bu4.parsing.targets.aptarget import APTarget
__all__ = ('APLambda',)
class APLambda(APTarget):
def __init__(self, lambda_: Callable[[Parsed], ParsingState]):
self.lambda_ = lambda_
def given(self, parsed: Parsed) -> ParsingState:
return self.lambda_(parsed)

View File

@ -1,11 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsingstate import ParsingState
__all__ = ('APTarget',)
class APTarget:
def given(self, parsed: Parsed) -> ParsingState:
raise NotImplementedError

View File

@ -9,8 +9,9 @@ from bu4.parsing.parser import Parser
__all__ = ('parse',) __all__ = ('parse',)
def parse(source: bytes, extensions: Iterable[Type[Extension]]) -> Parsed: def parse(source: bytes, extensions: Iterable[Type[Extension[Parsed]]]) -> Parsed:
return Parser( parser = Parser(
source, source,
extensions extensions
).parse() )
return parser.parse()

View File

@ -0,0 +1,35 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.attarget import ATTarget
__all__ = ('AfterTransform',)
T = TypeVar('T')
class AfterTransform(TransformState[T]):
def __init__(self, state: TransformState[T], target: ATTarget[T]):
self.state = state
self.target = target
def next(self) -> TransformState[T]:
if isinstance(self.state, TransformFinished):
return self.target.given(self.state.transformed)
elif isinstance(self.state, AfterTransform):
self.state, self.target = self.state.state, ATChain(self.state.target, self.target)
else:
self.state = self.state.next()
return self
class ATChain(ATTarget[T]):
def __init__(self, target: ATTarget[T], aftertarget: ATTarget[T]):
self.target = target
self.aftertarget = aftertarget
def given(self, transformed: T) -> TransformState[T]:
return AfterTransform(self.target.given(transformed), self.aftertarget)

View File

@ -0,0 +1,17 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar
from bu4.transform.states.transformstate import TransformState
__all__ = ('TransformFinished',)
T = TypeVar('T')
class TransformFinished(TransformState[T]):
def __init__(self, transformed: T):
self.transformed = transformed
def next(self) -> TransformState[T]:
return self

View File

@ -0,0 +1,17 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar, Callable
from bu4.transform.states.transformstate import TransformState
__all__ = ('TransformStart',)
T = TypeVar('T')
class TransformStart(TransformState[T]):
def __init__(self, start: Callable[[], TransformState[T]]):
self.start = start
def next(self) -> TransformState[T]:
return self.start()

View File

@ -0,0 +1,12 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar, Generic
__all__ = ('TransformState',)
T = TypeVar('T')
class TransformState(Generic[T]):
def next(self) -> 'TransformState[T]':
raise NotImplementedError

View File

@ -0,0 +1,18 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import Callable, TypeVar
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.attarget import ATTarget
__all__ = ('ATLambda',)
T = TypeVar('T')
class ATLambda(ATTarget[T]):
def __init__(self, lambda_: Callable[[T], TransformState[T]]):
self.lambda_ = lambda_
def given(self, transformed: T) -> TransformState[T]:
return self.lambda_(transformed)

View File

@ -0,0 +1,14 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar, Generic
from bu4.transform.states.transformstate import TransformState
__all__ = ('ATTarget',)
T = TypeVar('T')
class ATTarget(Generic[T]):
def given(self, transformed: T) -> TransformState[T]:
raise NotImplementedError

View File

@ -0,0 +1,17 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from typing import TypeVar
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('transform',)
T = TypeVar('T')
def transform(state: TransformState[T]) -> T:
while True:
if isinstance(state, TransformFinished):
return state.transformed
state = state.next()

View File

@ -1,4 +1,5 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved. # Copyright (c) PARRRATE T&V 2021. All rights reserved.
import random import random
from collections import deque from collections import deque

View File

@ -1,5 +1,6 @@
@@ @@
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
###
/(g) /(g)
(x) (x)
/ /