From 2b3a202a529efbf6023c2d60ce6865d3c114285d Mon Sep 17 00:00:00 2001 From: timotheyca Date: Wed, 8 Sep 2021 12:37:37 +0300 Subject: [PATCH] TransformState + EAttachable --- bu4/evaluation/av/lambdaenv.py | 4 +- bu4/evaluation/av/lambdaev.py | 4 +- bu4/evaluation/constructs/attachable.py | 14 ++++++ bu4/evaluation/constructs/eattachable.py | 22 +++++++++ bu4/evaluation/constructs/edelayed.py | 4 +- bu4/evaluation/constructs/eidelayed.py | 4 +- bu4/evaluation/constructs/eilambda.py | 4 +- bu4/evaluation/constructs/eindexed.py | 19 -------- bu4/evaluation/constructs/elambda.py | 4 +- bu4/evaluation/constructs/elinked.py | 19 -------- bu4/evaluation/targets/avIcall.py | 22 --------- ...vicontainer.py => avanonymouscontainer.py} | 4 +- bu4/evaluation/targets/avcall.py | 17 ++++--- .../{avcontainer.py => avnamedcontainer.py} | 4 +- bu4/indexing/constructs/icall.py | 8 ++-- bu4/indexing/constructs/idelayed.py | 2 +- bu4/indexing/constructs/iexception.py | 2 +- bu4/indexing/constructs/ilambda.py | 2 +- bu4/indexing/constructs/iname.py | 2 +- bu4/indexing/constructs/indexed.py | 5 +- bu4/indexing/constructs/inull.py | 2 +- bu4/indexing/index_finish.py | 32 ------------- bu4/indexing/states/afterindexing.py | 12 ----- bu4/indexing/states/indexingfinished.py | 11 ----- bu4/indexing/states/indexinglinked.py | 12 ----- bu4/indexing/states/indexingstate.py | 7 --- bu4/indexing/targets/aichain.py | 17 ------- bu4/indexing/targets/ailambda.py | 17 ------- bu4/indexing/targets/aitargett.py | 11 ----- bu4/isynced.py | 9 ++-- bu4/linking/constructs/lcall.py | 33 ++++++------- bu4/linking/constructs/lexception.py | 11 +++-- bu4/linking/constructs/linked.py | 11 +++-- bu4/linking/constructs/llambda.py | 31 ++++++------ bu4/linking/constructs/lname.py | 11 +++-- bu4/linking/constructs/lnull.py | 11 +++-- bu4/linking/evaluable_from_parsed.py | 11 ++--- bu4/linking/link_finish.py | 32 ------------- bu4/linking/states/afterlinking.py | 12 ----- bu4/linking/states/linkingfinished.py | 11 ----- bu4/linking/states/linkingparsed.py | 12 ----- bu4/linking/states/linkingstate.py | 7 --- bu4/linking/targets/alchain.py | 17 ------- bu4/linking/targets/allambda.py | 17 ------- bu4/linking/targets/altarget.py | 11 ----- bu4/parsing/abstractparser.py | 10 +++- bu4/parsing/constructs/parsed.py | 7 +-- bu4/parsing/constructs/pcall.py | 31 ++++++------ bu4/parsing/constructs/pexception.py | 13 ++--- bu4/parsing/constructs/plambda.py | 28 +++++------ bu4/parsing/constructs/pname.py | 13 ++--- bu4/parsing/constructs/pnull.py | 15 +++--- bu4/parsing/extensions/abstractextension.py | 16 +++++++ bu4/parsing/extensions/extension.py | 13 +++-- bu4/parsing/extensions/xcall.py | 11 ++--- bu4/parsing/extensions/xmake.py | 23 +++++---- bu4/parsing/extensions/xname.py | 13 +++-- bu4/parsing/extensions/xnull.py | 13 +++-- bu4/parsing/extensions/xqopn.py | 14 +++--- bu4/parsing/extensions/xquot.py | 14 +++--- bu4/parsing/extensions/xskip.py | 11 +++-- bu4/parsing/extensions/xxcpt.py | 13 +++-- bu4/parsing/parser.py | 48 ++++++------------- bu4/parsing/states/afterparsing.py | 12 ----- bu4/parsing/states/parsing_call.py | 25 +++++----- bu4/parsing/states/parsingfinished.py | 11 ----- bu4/parsing/states/parsingread.py | 17 +++++-- bu4/parsing/states/parsingstate.py | 7 --- bu4/parsing/targets/apchain.py | 17 ------- bu4/parsing/targets/apendswith.py | 17 ++++--- bu4/parsing/targets/aplambda.py | 17 ------- bu4/parsing/targets/aptarget.py | 11 ----- bu4/parsing/toolchain/parse.py | 7 +-- bu4/transform/states/aftertransform.py | 35 ++++++++++++++ bu4/transform/states/transformfinished.py | 17 +++++++ bu4/transform/states/transformstart.py | 17 +++++++ bu4/transform/states/transformstate.py | 12 +++++ bu4/transform/targets/atlambda.py | 18 +++++++ bu4/transform/targets/attarget.py | 14 ++++++ bu4/transform/transform.py | 17 +++++++ main.py | 1 + src/sys6.bu4 | 1 + 82 files changed, 469 insertions(+), 644 deletions(-) create mode 100644 bu4/evaluation/constructs/attachable.py create mode 100644 bu4/evaluation/constructs/eattachable.py delete mode 100644 bu4/evaluation/constructs/eindexed.py delete mode 100644 bu4/evaluation/constructs/elinked.py delete mode 100644 bu4/evaluation/targets/avIcall.py rename bu4/evaluation/targets/{avicontainer.py => avanonymouscontainer.py} (87%) rename bu4/evaluation/targets/{avcontainer.py => avnamedcontainer.py} (90%) delete mode 100644 bu4/indexing/index_finish.py delete mode 100644 bu4/indexing/states/afterindexing.py delete mode 100644 bu4/indexing/states/indexingfinished.py delete mode 100644 bu4/indexing/states/indexinglinked.py delete mode 100644 bu4/indexing/states/indexingstate.py delete mode 100644 bu4/indexing/targets/aichain.py delete mode 100644 bu4/indexing/targets/ailambda.py delete mode 100644 bu4/indexing/targets/aitargett.py delete mode 100644 bu4/linking/link_finish.py delete mode 100644 bu4/linking/states/afterlinking.py delete mode 100644 bu4/linking/states/linkingfinished.py delete mode 100644 bu4/linking/states/linkingparsed.py delete mode 100644 bu4/linking/states/linkingstate.py delete mode 100644 bu4/linking/targets/alchain.py delete mode 100644 bu4/linking/targets/allambda.py delete mode 100644 bu4/linking/targets/altarget.py create mode 100644 bu4/parsing/extensions/abstractextension.py delete mode 100644 bu4/parsing/states/afterparsing.py delete mode 100644 bu4/parsing/states/parsingfinished.py delete mode 100644 bu4/parsing/states/parsingstate.py delete mode 100644 bu4/parsing/targets/apchain.py delete mode 100644 bu4/parsing/targets/aplambda.py delete mode 100644 bu4/parsing/targets/aptarget.py create mode 100644 bu4/transform/states/aftertransform.py create mode 100644 bu4/transform/states/transformfinished.py create mode 100644 bu4/transform/states/transformstart.py create mode 100644 bu4/transform/states/transformstate.py create mode 100644 bu4/transform/targets/atlambda.py create mode 100644 bu4/transform/targets/attarget.py create mode 100644 bu4/transform/transform.py diff --git a/bu4/evaluation/av/lambdaenv.py b/bu4/evaluation/av/lambdaenv.py index 3414c58..3a3e09c 100644 --- a/bu4/evaluation/av/lambdaenv.py +++ b/bu4/evaluation/av/lambdaenv.py @@ -4,7 +4,7 @@ from typing import Mapping, Iterator from bu4.evaluation.av.envtype import envtype from bu4.evaluation.constructs.evaluable import Evaluable -from bu4.evaluation.targets.avcontainer import AVContainer +from bu4.evaluation.targets.avnamedcontainer import AVNamedContainer __all__ = ('LambdaEnv',) @@ -26,7 +26,7 @@ class LambdaEnv(Mapping[bytes, Evaluable]): def __init__(self, env: envtype, name: bytes, evaluable: Evaluable, *, memoize): self.env = env 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 def strfy(self): diff --git a/bu4/evaluation/av/lambdaev.py b/bu4/evaluation/av/lambdaev.py index e45472f..ff4c450 100644 --- a/bu4/evaluation/av/lambdaev.py +++ b/bu4/evaluation/av/lambdaev.py @@ -4,7 +4,7 @@ from typing import Sequence from bu4.evaluation.av.evtype import evtype from bu4.evaluation.constructs.evaluable import Evaluable -from bu4.evaluation.targets.avicontainer import AVIContainer +from bu4.evaluation.targets.avanonymouscontainer import AVAnonymousContainer __all__ = ('LambdaEv',) @@ -21,4 +21,4 @@ class LambdaEv(Sequence[Evaluable]): def __init__(self, ev: evtype, evaluable: Evaluable, *, memoize): self.ev = ev - self.container = AVIContainer(evaluable).after_value if memoize else evaluable + self.container = AVAnonymousContainer(evaluable).after_value if memoize else evaluable diff --git a/bu4/evaluation/constructs/attachable.py b/bu4/evaluation/constructs/attachable.py new file mode 100644 index 0000000..7f412d3 --- /dev/null +++ b/bu4/evaluation/constructs/attachable.py @@ -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 diff --git a/bu4/evaluation/constructs/eattachable.py b/bu4/evaluation/constructs/eattachable.py new file mode 100644 index 0000000..55e340a --- /dev/null +++ b/bu4/evaluation/constructs/eattachable.py @@ -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}' diff --git a/bu4/evaluation/constructs/edelayed.py b/bu4/evaluation/constructs/edelayed.py index f2b4178..29f3548 100644 --- a/bu4/evaluation/constructs/edelayed.py +++ b/bu4/evaluation/constructs/edelayed.py @@ -1,7 +1,7 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. 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.evalue import EValue from bu4.linking.constructs.linked import Linked @@ -13,7 +13,7 @@ class EDelayed(EValue): def __init__(self, env: envtype, value: Linked): self.env = env self.value = value - self.evaluable = ELinked( + self.evaluable = EAttachable( self.env, self.value ) diff --git a/bu4/evaluation/constructs/eidelayed.py b/bu4/evaluation/constructs/eidelayed.py index 3bc83a6..e80768e 100644 --- a/bu4/evaluation/constructs/eidelayed.py +++ b/bu4/evaluation/constructs/eidelayed.py @@ -1,7 +1,7 @@ # 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.eattachable import EAttachable from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evalue import EValue from bu4.indexing.constructs.indexed import Indexed @@ -13,7 +13,7 @@ class EIDelayed(EValue): def __init__(self, ev: evtype, value: Indexed): self.ev = ev self.value = value - self.evaluable = EIndexed( + self.evaluable = EAttachable( self.ev, self.value ) diff --git a/bu4/evaluation/constructs/eilambda.py b/bu4/evaluation/constructs/eilambda.py index 091b4ec..83af43d 100644 --- a/bu4/evaluation/constructs/eilambda.py +++ b/bu4/evaluation/constructs/eilambda.py @@ -2,7 +2,7 @@ from bu4.evaluation.av.evtype import evtype 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.evalue import EValue from bu4.indexing.constructs.indexed import Indexed @@ -17,7 +17,7 @@ class EILambda(EValue): self.memoize = memoize def call(self, argument: Evaluable) -> Evaluable: - return EIndexed( + return EAttachable( LambdaEv(self.ev, argument, memoize=self.memoize), self.value ) diff --git a/bu4/evaluation/constructs/eindexed.py b/bu4/evaluation/constructs/eindexed.py deleted file mode 100644 index d0b9fd5..0000000 --- a/bu4/evaluation/constructs/eindexed.py +++ /dev/null @@ -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}' diff --git a/bu4/evaluation/constructs/elambda.py b/bu4/evaluation/constructs/elambda.py index d18e3bd..122bf16 100644 --- a/bu4/evaluation/constructs/elambda.py +++ b/bu4/evaluation/constructs/elambda.py @@ -2,7 +2,7 @@ from bu4.evaluation.av.envtype import envtype 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.evalue import EValue from bu4.linking.constructs.linked import Linked @@ -19,7 +19,7 @@ class ELambda(EValue): self.memoize = name in value.multifuture 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, self.value ) diff --git a/bu4/evaluation/constructs/elinked.py b/bu4/evaluation/constructs/elinked.py deleted file mode 100644 index 077d94e..0000000 --- a/bu4/evaluation/constructs/elinked.py +++ /dev/null @@ -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}' diff --git a/bu4/evaluation/targets/avIcall.py b/bu4/evaluation/targets/avIcall.py deleted file mode 100644 index 235f8e9..0000000 --- a/bu4/evaluation/targets/avIcall.py +++ /dev/null @@ -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})' diff --git a/bu4/evaluation/targets/avicontainer.py b/bu4/evaluation/targets/avanonymouscontainer.py similarity index 87% rename from bu4/evaluation/targets/avicontainer.py rename to bu4/evaluation/targets/avanonymouscontainer.py index baa6964..60996e4 100644 --- a/bu4/evaluation/targets/avicontainer.py +++ b/bu4/evaluation/targets/avanonymouscontainer.py @@ -5,10 +5,10 @@ from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.targets.avtarget import AVTarget -__all__ = ('AVIContainer',) +__all__ = ('AVAnonymousContainer',) -class AVIContainer(AVTarget): +class AVAnonymousContainer(AVTarget): def __init__(self, evaluable: Evaluable): self.after_value = AfterValue(evaluable, self) diff --git a/bu4/evaluation/targets/avcall.py b/bu4/evaluation/targets/avcall.py index a8cf13c..3bfec14 100644 --- a/bu4/evaluation/targets/avcall.py +++ b/bu4/evaluation/targets/avcall.py @@ -1,22 +1,25 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. -from bu4.evaluation.av.envtype import envtype -from bu4.evaluation.constructs.elinked import ELinked +from typing import TypeVar, Generic + +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.evalue import EValue from bu4.evaluation.targets.avtarget import AVTarget -from bu4.linking.constructs.linked import Linked __all__ = ('AVCall',) +T = TypeVar('T') -class AVCall(AVTarget): - def __init__(self, env: envtype, argument: Linked): - self.env = env + +class AVCall(AVTarget, Generic[T]): + def __init__(self, t: T, argument: Attachable[T]): + self.t = t self.argument = argument 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): return f'({self.argument})' diff --git a/bu4/evaluation/targets/avcontainer.py b/bu4/evaluation/targets/avnamedcontainer.py similarity index 90% rename from bu4/evaluation/targets/avcontainer.py rename to bu4/evaluation/targets/avnamedcontainer.py index f51743a..1bdf2fe 100644 --- a/bu4/evaluation/targets/avcontainer.py +++ b/bu4/evaluation/targets/avnamedcontainer.py @@ -5,10 +5,10 @@ from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.targets.avtarget import AVTarget -__all__ = ('AVContainer',) +__all__ = ('AVNamedContainer',) -class AVContainer(AVTarget): +class AVNamedContainer(AVTarget): def __init__(self, evaluable: Evaluable, name: bytes): self.after_value = AfterValue(evaluable, self) self.name = name diff --git a/bu4/indexing/constructs/icall.py b/bu4/indexing/constructs/icall.py index 22e4d9c..909ccda 100644 --- a/bu4/indexing/constructs/icall.py +++ b/bu4/indexing/constructs/icall.py @@ -2,9 +2,9 @@ from bu4.evaluation.av.aftervalue import AfterValue 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.targets.avIcall import AVICall +from bu4.evaluation.targets.avcall import AVCall from bu4.indexing.constructs.indexed import Indexed from bu4.parsing.codes import CODE_CALL @@ -16,8 +16,8 @@ class ICall(Indexed): self.argument = argument self.lambda_ = lambda_ - def evaluable(self, ev: evtype) -> Evaluable: - return AfterValue(EIndexed(ev, self.lambda_), AVICall(ev, self.argument)) + def attach(self, ev: evtype) -> Evaluable: + return AfterValue(EAttachable(ev, self.lambda_), AVCall(ev, self.argument)) def __str__(self): return f'/{self.argument}{self.lambda_}' diff --git a/bu4/indexing/constructs/idelayed.py b/bu4/indexing/constructs/idelayed.py index 66bd3b5..145f4c2 100644 --- a/bu4/indexing/constructs/idelayed.py +++ b/bu4/indexing/constructs/idelayed.py @@ -13,7 +13,7 @@ class IDelayed(Indexed): def __init__(self, value: Indexed): self.value = value - def evaluable(self, ev: evtype) -> Evaluable: + def attach(self, ev: evtype) -> Evaluable: return EIDelayed( ev, self.value diff --git a/bu4/indexing/constructs/iexception.py b/bu4/indexing/constructs/iexception.py index f37a7c6..3d790ac 100644 --- a/bu4/indexing/constructs/iexception.py +++ b/bu4/indexing/constructs/iexception.py @@ -13,7 +13,7 @@ class IException(Indexed): def __init__(self, name: bytes): self.name = name - def evaluable(self, ev: evtype) -> Evaluable: + def attach(self, ev: evtype) -> Evaluable: return EException(self.name) def __str__(self): diff --git a/bu4/indexing/constructs/ilambda.py b/bu4/indexing/constructs/ilambda.py index 570583d..e9a315d 100644 --- a/bu4/indexing/constructs/ilambda.py +++ b/bu4/indexing/constructs/ilambda.py @@ -15,7 +15,7 @@ class ILambda(Indexed): self.table = table self.memoize = memoize - def evaluable(self, ev: evtype) -> Evaluable: + def attach(self, ev: evtype) -> Evaluable: return EILambda( [ev[i] for i in self.table], self.value, diff --git a/bu4/indexing/constructs/iname.py b/bu4/indexing/constructs/iname.py index 90da2bc..ed83d88 100644 --- a/bu4/indexing/constructs/iname.py +++ b/bu4/indexing/constructs/iname.py @@ -12,7 +12,7 @@ class IName(Indexed): def __init__(self, index: int): self.index = index - def evaluable(self, ev: evtype) -> Evaluable: + def attach(self, ev: evtype) -> Evaluable: return ev[self.index] def __str__(self): diff --git a/bu4/indexing/constructs/indexed.py b/bu4/indexing/constructs/indexed.py index 4d68ddc..eb7ed40 100644 --- a/bu4/indexing/constructs/indexed.py +++ b/bu4/indexing/constructs/indexed.py @@ -1,13 +1,14 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.evaluation.av.evtype import evtype +from bu4.evaluation.constructs.attachable import Attachable from bu4.evaluation.constructs.evaluable import Evaluable __all__ = ('Indexed',) -class Indexed: - def evaluable(self, ev: evtype) -> Evaluable: +class Indexed(Attachable[evtype]): + def attach(self, ev: evtype) -> Evaluable: raise NotImplementedError def __bytes__(self): diff --git a/bu4/indexing/constructs/inull.py b/bu4/indexing/constructs/inull.py index 75fb5e7..c981b1d 100644 --- a/bu4/indexing/constructs/inull.py +++ b/bu4/indexing/constructs/inull.py @@ -10,7 +10,7 @@ __all__ = ('INull',) class INull(Indexed): - def evaluable(self, ev: evtype) -> Evaluable: + def attach(self, ev: evtype) -> Evaluable: return ENull() def __str__(self): diff --git a/bu4/indexing/index_finish.py b/bu4/indexing/index_finish.py deleted file mode 100644 index 0253506..0000000 --- a/bu4/indexing/index_finish.py +++ /dev/null @@ -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 diff --git a/bu4/indexing/states/afterindexing.py b/bu4/indexing/states/afterindexing.py deleted file mode 100644 index 3e88e63..0000000 --- a/bu4/indexing/states/afterindexing.py +++ /dev/null @@ -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 diff --git a/bu4/indexing/states/indexingfinished.py b/bu4/indexing/states/indexingfinished.py deleted file mode 100644 index 630b00a..0000000 --- a/bu4/indexing/states/indexingfinished.py +++ /dev/null @@ -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 diff --git a/bu4/indexing/states/indexinglinked.py b/bu4/indexing/states/indexinglinked.py deleted file mode 100644 index bee46a4..0000000 --- a/bu4/indexing/states/indexinglinked.py +++ /dev/null @@ -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 diff --git a/bu4/indexing/states/indexingstate.py b/bu4/indexing/states/indexingstate.py deleted file mode 100644 index 2f5f9ee..0000000 --- a/bu4/indexing/states/indexingstate.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) PARRRATE T&V 2021. All rights reserved. - -__all__ = ('IndexingState',) - - -class IndexingState: - pass diff --git a/bu4/indexing/targets/aichain.py b/bu4/indexing/targets/aichain.py deleted file mode 100644 index d8b4a9f..0000000 --- a/bu4/indexing/targets/aichain.py +++ /dev/null @@ -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) diff --git a/bu4/indexing/targets/ailambda.py b/bu4/indexing/targets/ailambda.py deleted file mode 100644 index 44f111f..0000000 --- a/bu4/indexing/targets/ailambda.py +++ /dev/null @@ -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) diff --git a/bu4/indexing/targets/aitargett.py b/bu4/indexing/targets/aitargett.py deleted file mode 100644 index c8b65d1..0000000 --- a/bu4/indexing/targets/aitargett.py +++ /dev/null @@ -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 diff --git a/bu4/isynced.py b/bu4/isynced.py index 8f18742..39c51cc 100644 --- a/bu4/isynced.py +++ b/bu4/isynced.py @@ -2,11 +2,10 @@ from bu4.evaluation.constructs.evalue import EValue 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.stdext import standard_extension from bu4.parsing.toolchain.transply import transply +from bu4.transform.transform import transform __all__ = ('isynced',) @@ -14,7 +13,7 @@ __all__ = ('isynced',) def isynced(source: str) -> EValue: bsource = transply(source) parsed = parse(bsource, standard_extension) - linked = link_finish(parsed.link(set())) - indexed = index_finish(linked.index([])) - evaluable = indexed.evaluable([]) + linked = transform(parsed.link(set())) + indexed = transform(linked.index([])) + evaluable = indexed.attach([]) return sync(evaluable) diff --git a/bu4/linking/constructs/lcall.py b/bu4/linking/constructs/lcall.py index 0b235df..a321028 100644 --- a/bu4/linking/constructs/lcall.py +++ b/bu4/linking/constructs/lcall.py @@ -2,16 +2,17 @@ from bu4.evaluation.av.aftervalue import AfterValue 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.targets.avcall import AVCall from bu4.indexing.constructs.icall import ICall -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.ailambda import AILambda +from bu4.indexing.constructs.indexed import Indexed 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',) @@ -30,17 +31,17 @@ class LCall(Linked): (self.argument.future & self.lambda_.future) ) - def evaluable(self, env: envtype) -> Evaluable: - return AfterValue(ELinked(env, self.lambda_), AVCall(env, self.argument)) + def attach(self, env: envtype) -> Evaluable: + return AfterValue(EAttachable(env, self.lambda_), AVCall(env, self.argument)) - def index(self, promise: list[bytes]) -> IndexingState: - return AfterIndexing( - IndexingLinked(promise, self.argument), - AILambda( - lambda argument: AfterIndexing( - IndexingLinked(promise, self.lambda_), - AILambda( - lambda lambda_: IndexingFinished(ICall(argument, lambda_)) + def index(self, promise: list[bytes]) -> TransformState[Indexed]: + return AfterTransform( + TransformStart(lambda: self.argument.index(promise)), + ATLambda( + lambda argument: AfterTransform( + TransformStart(lambda: self.lambda_.index(promise)), + ATLambda( + lambda lambda_: TransformFinished(ICall(argument, lambda_)) ) ) ) diff --git a/bu4/linking/constructs/lexception.py b/bu4/linking/constructs/lexception.py index 844c4fb..8dc4c54 100644 --- a/bu4/linking/constructs/lexception.py +++ b/bu4/linking/constructs/lexception.py @@ -4,9 +4,10 @@ from bu4.evaluation.av.envtype import envtype from bu4.evaluation.constructs.eexception import EException from bu4.evaluation.constructs.evaluable import Evaluable from bu4.indexing.constructs.iexception import IException -from bu4.indexing.states.indexingfinished import IndexingFinished -from bu4.indexing.states.indexingstate import IndexingState +from bu4.indexing.constructs.indexed import Indexed from bu4.linking.constructs.linked import Linked +from bu4.transform.states.transformfinished import TransformFinished +from bu4.transform.states.transformstate import TransformState __all__ = ('LException',) @@ -17,11 +18,11 @@ class LException(Linked): self.future = set() self.multifuture = set() - def evaluable(self, env: envtype) -> Evaluable: + def attach(self, env: envtype) -> Evaluable: return EException(self.name) - def index(self, promise: list[bytes]) -> IndexingState: - return IndexingFinished(IException(self.name)) + def index(self, promise: list[bytes]) -> TransformState[Indexed]: + return TransformFinished(IException(self.name)) def __str__(self): return f'«{self.name.decode()}»' diff --git a/bu4/linking/constructs/linked.py b/bu4/linking/constructs/linked.py index 7c5359a..bd7fd38 100644 --- a/bu4/linking/constructs/linked.py +++ b/bu4/linking/constructs/linked.py @@ -1,19 +1,20 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.evaluation.av.envtype import envtype +from bu4.evaluation.constructs.attachable import Attachable from bu4.evaluation.constructs.evaluable import Evaluable +from bu4.indexing.constructs.indexed import Indexed +from bu4.transform.states.transformstate import TransformState __all__ = ('Linked',) -from bu4.indexing.states.indexingstate import IndexingState - -class Linked: +class Linked(Attachable[envtype]): future: set[bytes] multifuture: set[bytes] - def evaluable(self, env: envtype) -> Evaluable: + def attach(self, env: envtype) -> Evaluable: raise NotImplementedError - def index(self, promise: list[bytes]) -> IndexingState: + def index(self, promise: list[bytes]) -> TransformState[Indexed]: raise NotImplementedError diff --git a/bu4/linking/constructs/llambda.py b/bu4/linking/constructs/llambda.py index 53becfc..5d70fb8 100644 --- a/bu4/linking/constructs/llambda.py +++ b/bu4/linking/constructs/llambda.py @@ -6,12 +6,13 @@ from bu4.evaluation.constructs.elambda import ELambda from bu4.evaluation.constructs.evaluable import Evaluable from bu4.indexing.constructs.idelayed import IDelayed from bu4.indexing.constructs.ilambda import ILambda -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.ailambda import AILambda +from bu4.indexing.constructs.indexed import Indexed 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',) @@ -27,7 +28,7 @@ class LLambda(Linked): self.used = name in value.future self.memoize = name in value.multifuture - def evaluable(self, env: envtype) -> Evaluable: + def attach(self, env: envtype) -> Evaluable: return ( ELambda( {name: env[name] for name in self.future} if self.used else env, @@ -40,20 +41,20 @@ class LLambda(Linked): EDelayed(env, self.value) ) - def index(self, promise: list[bytes]) -> IndexingState: + def index(self, promise: list[bytes]) -> TransformState[Indexed]: if not self.used: - return AfterIndexing( - IndexingLinked(promise, self.value), - AILambda( - lambda value: IndexingFinished(IDelayed(value)) + return AfterTransform( + TransformStart(lambda: self.value.index(promise)), + ATLambda( + lambda value: TransformFinished(IDelayed(value)) ) ) else: table = [i for i in range(len(promise)) if promise[i] in self.future] - return AfterIndexing( - IndexingLinked([self.name] + [promise[i] for i in table], self.value), - AILambda( - lambda value: IndexingFinished(ILambda( + return AfterTransform( + TransformStart(lambda: self.value.index([self.name] + [promise[i] for i in table])), + ATLambda( + lambda value: TransformFinished(ILambda( value, table, memoize=self.memoize diff --git a/bu4/linking/constructs/lname.py b/bu4/linking/constructs/lname.py index ef1a229..292891e 100644 --- a/bu4/linking/constructs/lname.py +++ b/bu4/linking/constructs/lname.py @@ -3,9 +3,10 @@ from bu4.evaluation.av.envtype import envtype from bu4.evaluation.constructs.evaluable import Evaluable from bu4.indexing.constructs.iname import IName -from bu4.indexing.states.indexingfinished import IndexingFinished -from bu4.indexing.states.indexingstate import IndexingState +from bu4.indexing.constructs.indexed import Indexed from bu4.linking.constructs.linked import Linked +from bu4.transform.states.transformfinished import TransformFinished +from bu4.transform.states.transformstate import TransformState __all__ = ('LName',) @@ -16,11 +17,11 @@ class LName(Linked): self.future = {name} self.multifuture = set() - def evaluable(self, env: envtype) -> Evaluable: + def attach(self, env: envtype) -> Evaluable: return env[self.name] - def index(self, promise: list[bytes]) -> IndexingState: - return IndexingFinished(IName(promise.index(self.name))) + def index(self, promise: list[bytes]) -> TransformState[Indexed]: + return TransformFinished(IName(promise.index(self.name))) def __str__(self): return f'[{self.name.decode()}]' diff --git a/bu4/linking/constructs/lnull.py b/bu4/linking/constructs/lnull.py index 66b0719..ce17f45 100644 --- a/bu4/linking/constructs/lnull.py +++ b/bu4/linking/constructs/lnull.py @@ -3,10 +3,11 @@ from bu4.evaluation.av.envtype import envtype from bu4.evaluation.constructs.enull import ENull from bu4.evaluation.constructs.evaluable import Evaluable +from bu4.indexing.constructs.indexed import Indexed 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.transform.states.transformfinished import TransformFinished +from bu4.transform.states.transformstate import TransformState __all__ = ('LNull',) @@ -16,11 +17,11 @@ class LNull(Linked): self.future = set() self.multifuture = set() - def evaluable(self, env: envtype) -> Evaluable: + def attach(self, env: envtype) -> Evaluable: return ENull() - def index(self, promise: list[bytes]) -> IndexingState: - return IndexingFinished(INull()) + def index(self, promise: list[bytes]) -> TransformState[Indexed]: + return TransformFinished(INull()) def __str__(self): return '?' diff --git a/bu4/linking/evaluable_from_parsed.py b/bu4/linking/evaluable_from_parsed.py index 47e4a4f..e5cf6ff 100644 --- a/bu4/linking/evaluable_from_parsed.py +++ b/bu4/linking/evaluable_from_parsed.py @@ -1,14 +1,13 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.evaluation.av.envtype import envtype -from bu4.evaluation.constructs.elinked import ELinked -from bu4.linking.link_finish import link_finish +from bu4.evaluation.constructs.eattachable import EAttachable +from bu4.parsing.constructs.parsed import Parsed +from bu4.transform.transform import transform __all__ = ('evaluable_from_parsed',) -from bu4.parsing.constructs.parsed import Parsed - def evaluable_from_parsed(env: envtype, parsed: Parsed): - linked = link_finish(parsed.link(set(env))) - return ELinked(env, linked) + linked = transform(parsed.link(set(env))) + return EAttachable(env, linked) diff --git a/bu4/linking/link_finish.py b/bu4/linking/link_finish.py deleted file mode 100644 index 96421b4..0000000 --- a/bu4/linking/link_finish.py +++ /dev/null @@ -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 diff --git a/bu4/linking/states/afterlinking.py b/bu4/linking/states/afterlinking.py deleted file mode 100644 index 2a737bd..0000000 --- a/bu4/linking/states/afterlinking.py +++ /dev/null @@ -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 diff --git a/bu4/linking/states/linkingfinished.py b/bu4/linking/states/linkingfinished.py deleted file mode 100644 index d7ad2a2..0000000 --- a/bu4/linking/states/linkingfinished.py +++ /dev/null @@ -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 diff --git a/bu4/linking/states/linkingparsed.py b/bu4/linking/states/linkingparsed.py deleted file mode 100644 index 71fa5ab..0000000 --- a/bu4/linking/states/linkingparsed.py +++ /dev/null @@ -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 diff --git a/bu4/linking/states/linkingstate.py b/bu4/linking/states/linkingstate.py deleted file mode 100644 index 41b2228..0000000 --- a/bu4/linking/states/linkingstate.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) PARRRATE T&V 2021. All rights reserved. - -__all__ = ('LinkingState',) - - -class LinkingState: - pass diff --git a/bu4/linking/targets/alchain.py b/bu4/linking/targets/alchain.py deleted file mode 100644 index 425d7f6..0000000 --- a/bu4/linking/targets/alchain.py +++ /dev/null @@ -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) diff --git a/bu4/linking/targets/allambda.py b/bu4/linking/targets/allambda.py deleted file mode 100644 index b944d6a..0000000 --- a/bu4/linking/targets/allambda.py +++ /dev/null @@ -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) diff --git a/bu4/linking/targets/altarget.py b/bu4/linking/targets/altarget.py deleted file mode 100644 index e0adbd9..0000000 --- a/bu4/linking/targets/altarget.py +++ /dev/null @@ -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 diff --git a/bu4/parsing/abstractparser.py b/bu4/parsing/abstractparser.py index 6e0738b..f329804 100644 --- a/bu4/parsing/abstractparser.py +++ b/bu4/parsing/abstractparser.py @@ -1,12 +1,20 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. +from typing import TypeVar, Generic + +from bu4.parsing.extensions.abstractextension import AbstractExtension __all__ = ('AbstractParser',) +T = TypeVar('T') -class AbstractParser: + +class AbstractParser(Generic[T]): def read(self) -> int: raise NotImplementedError def parse_name(self) -> bytes: raise NotImplementedError + + def extension_for(self, code: int) -> AbstractExtension[T]: + raise NotImplementedError diff --git a/bu4/parsing/constructs/parsed.py b/bu4/parsing/constructs/parsed.py index 60ef765..c68c32e 100644 --- a/bu4/parsing/constructs/parsed.py +++ b/bu4/parsing/constructs/parsed.py @@ -1,10 +1,11 @@ # 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',) -from bu4.linking.states.linkingstate import LinkingState - class Parsed: - def link(self, promise: set[bytes]) -> LinkingState: + def link(self, promise: set[bytes]) -> TransformState[Linked]: raise NotImplementedError diff --git a/bu4/parsing/constructs/pcall.py b/bu4/parsing/constructs/pcall.py index a8da689..88efac7 100644 --- a/bu4/parsing/constructs/pcall.py +++ b/bu4/parsing/constructs/pcall.py @@ -1,14 +1,15 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. -__all__ = ('PCall',) - from bu4.linking.constructs.lcall import LCall -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.linking.constructs.linked import Linked 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): @@ -16,14 +17,14 @@ class PCall(Parsed): self.argument = argument self.lambda_ = lambda_ - def link(self, promise: set[bytes]) -> LinkingState: - return AfterLinking( - LinkingParsed(promise, self.argument), - ALLambda( - lambda argument: AfterLinking( - LinkingParsed(promise, self.lambda_), - ALLambda( - lambda lambda_: LinkingFinished(LCall(argument, lambda_)) + def link(self, promise: set[bytes]) -> TransformState[Linked]: + return AfterTransform( + TransformStart(lambda: self.argument.link(promise)), + ATLambda( + lambda argument: AfterTransform( + TransformStart(lambda: self.lambda_.link(promise)), + ATLambda( + lambda lambda_: TransformFinished(LCall(argument, lambda_)) ) ) ) diff --git a/bu4/parsing/constructs/pexception.py b/bu4/parsing/constructs/pexception.py index 80ca923..8a995ea 100644 --- a/bu4/parsing/constructs/pexception.py +++ b/bu4/parsing/constructs/pexception.py @@ -1,16 +1,17 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. -__all__ = ('PException',) - from bu4.linking.constructs.lexception import LException -from bu4.linking.states.linkingfinished import LinkingFinished -from bu4.linking.states.linkingstate import LinkingState +from bu4.linking.constructs.linked import Linked 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): def __init__(self, name: bytes): self.name = name - def link(self, promise: set[bytes]) -> LinkingState: - return LinkingFinished(LException(self.name)) + def link(self, promise: set[bytes]) -> TransformState[Linked]: + return TransformFinished(LException(self.name)) diff --git a/bu4/parsing/constructs/plambda.py b/bu4/parsing/constructs/plambda.py index 818c73b..145f8c8 100644 --- a/bu4/parsing/constructs/plambda.py +++ b/bu4/parsing/constructs/plambda.py @@ -1,14 +1,15 @@ # 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.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.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): @@ -16,15 +17,12 @@ class PLambda(Parsed): self.name = name 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}' - return AfterLinking( - LinkingParsed( - promise | {self.name}, - self.value - ), - ALLambda( - lambda value: LinkingFinished(LLambda( + return AfterTransform( + TransformStart(lambda: self.value.link(promise | {self.name})), + ATLambda( + lambda value: TransformFinished(LLambda( self.name, value )) diff --git a/bu4/parsing/constructs/pname.py b/bu4/parsing/constructs/pname.py index f914dac..33d86ee 100644 --- a/bu4/parsing/constructs/pname.py +++ b/bu4/parsing/constructs/pname.py @@ -1,17 +1,18 @@ # 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.states.linkingfinished import LinkingFinished -from bu4.linking.states.linkingstate import LinkingState 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): def __init__(self, name: bytes): 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}' - return LinkingFinished(LName(self.name)) + return TransformFinished(LName(self.name)) diff --git a/bu4/parsing/constructs/pnull.py b/bu4/parsing/constructs/pnull.py index b044465..6baa257 100644 --- a/bu4/parsing/constructs/pnull.py +++ b/bu4/parsing/constructs/pnull.py @@ -1,13 +1,14 @@ # 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',) -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): - def link(self, promise: set[bytes]) -> LinkingState: - return LinkingFinished(LNull()) + def link(self, promise: set[bytes]) -> TransformState[Linked]: + return TransformFinished(LNull()) diff --git a/bu4/parsing/extensions/abstractextension.py b/bu4/parsing/extensions/abstractextension.py new file mode 100644 index 0000000..d4c5ae1 --- /dev/null +++ b/bu4/parsing/extensions/abstractextension.py @@ -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 diff --git a/bu4/parsing/extensions/extension.py b/bu4/parsing/extensions/extension.py index 5a3eda7..1a34060 100644 --- a/bu4/parsing/extensions/extension.py +++ b/bu4/parsing/extensions/extension.py @@ -1,15 +1,17 @@ # 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.states.parsingstate import ParsingState -from bu4.parsing.states.afterparsing import AfterParsing +from bu4.parsing.extensions.abstractextension import AbstractExtension __all__ = ('Extension',) +T = TypeVar('T') -class Extension: - code: int +class Extension(AbstractExtension[T], ABC): def __init_subclass__(cls, /, code: int = None, **kwargs): super().__init_subclass__(**kwargs) if code is None: @@ -18,6 +20,3 @@ class Extension: def __init__(self, parser: AbstractParser): self.parser = parser - - def apply(self, state: AfterParsing) -> ParsingState: - raise NotImplementedError diff --git a/bu4/parsing/extensions/xcall.py b/bu4/parsing/extensions/xcall.py index 4bd8fd4..9b20323 100644 --- a/bu4/parsing/extensions/xcall.py +++ b/bu4/parsing/extensions/xcall.py @@ -1,15 +1,14 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.parsing.codes import CODE_CALL +from bu4.parsing.constructs.parsed import Parsed 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.transform.states.transformstate import TransformState __all__ = ('XCall',) -class XCall(Extension, code=CODE_CALL): - def apply(self, state: AfterParsing) -> ParsingState: - state.state = parsing_call() - return state +class XCall(Extension[Parsed], code=CODE_CALL): + def apply(self) -> TransformState[Parsed]: + return parsing_call(self.parser) diff --git a/bu4/parsing/extensions/xmake.py b/bu4/parsing/extensions/xmake.py index ae080f3..40f186e 100644 --- a/bu4/parsing/extensions/xmake.py +++ b/bu4/parsing/extensions/xmake.py @@ -1,25 +1,24 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.parsing.codes import CODE_MAKE +from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.plambda import PLambda 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.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',) -from bu4.parsing.targets.aplambda import APLambda - -class XMake(Extension, code=CODE_MAKE): - def apply(self, state: AfterParsing) -> ParsingState: +class XMake(Extension[Parsed], code=CODE_MAKE): + def apply(self) -> TransformState[Parsed]: name = self.parser.parse_name() - state.state = AfterParsing( - ParsingRead(), - APLambda( - lambda value: ParsingFinished(PLambda(name, value)) + return AfterTransform( + ParsingRead(self.parser), + ATLambda( + lambda value: TransformFinished(PLambda(name, value)) ) ) - return state diff --git a/bu4/parsing/extensions/xname.py b/bu4/parsing/extensions/xname.py index dd34500..487cda8 100644 --- a/bu4/parsing/extensions/xname.py +++ b/bu4/parsing/extensions/xname.py @@ -1,16 +1,15 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.parsing.codes import CODE_NAME +from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.pname import PName 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.transform.states.transformfinished import TransformFinished +from bu4.transform.states.transformstate import TransformState __all__ = ('XName',) -class XName(Extension, code=CODE_NAME): - def apply(self, state: AfterParsing) -> ParsingState: - state.state = ParsingFinished(PName(self.parser.parse_name())) - return state +class XName(Extension[Parsed], code=CODE_NAME): + def apply(self) -> TransformState[Parsed]: + return TransformFinished(PName(self.parser.parse_name())) diff --git a/bu4/parsing/extensions/xnull.py b/bu4/parsing/extensions/xnull.py index 3703a68..8927a4a 100644 --- a/bu4/parsing/extensions/xnull.py +++ b/bu4/parsing/extensions/xnull.py @@ -1,16 +1,15 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.parsing.codes import CODE_NULL +from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.pnull import PNull 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.transform.states.transformfinished import TransformFinished +from bu4.transform.states.transformstate import TransformState __all__ = ('XNull',) -class XNull(Extension, code=CODE_NULL): - def apply(self, state: AfterParsing) -> ParsingState: - state.state = ParsingFinished(PNull()) - return state +class XNull(Extension[Parsed], code=CODE_NULL): + def apply(self) -> TransformState[Parsed]: + return TransformFinished(PNull()) diff --git a/bu4/parsing/extensions/xqopn.py b/bu4/parsing/extensions/xqopn.py index 615e6bb..ee79a95 100644 --- a/bu4/parsing/extensions/xqopn.py +++ b/bu4/parsing/extensions/xqopn.py @@ -1,16 +1,16 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. 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.states.parsingstate import ParsingState -from bu4.parsing.states.afterparsing import AfterParsing -from bu4.parsing.targets.apchain import APChain +from bu4.parsing.states.parsingread import ParsingRead from bu4.parsing.targets.apendswith import APEndsWith +from bu4.transform.states.aftertransform import AfterTransform +from bu4.transform.states.transformstate import TransformState __all__ = ('XQopn',) -class XQopn(Extension, code=CODE_QOPN): - def apply(self, state: AfterParsing) -> ParsingState: - state.target = APChain(APEndsWith(self.parser, CODE_QCLS, 'quot expected'), state.target) - return state +class XQopn(Extension[Parsed], code=CODE_QOPN): + def apply(self) -> TransformState[Parsed]: + return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, CODE_QCLS, 'quot expected')) diff --git a/bu4/parsing/extensions/xquot.py b/bu4/parsing/extensions/xquot.py index 119a76e..94ece5d 100644 --- a/bu4/parsing/extensions/xquot.py +++ b/bu4/parsing/extensions/xquot.py @@ -1,16 +1,16 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.parsing.codes import CODE_QUOT +from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.extensions.extension import Extension -from bu4.parsing.states.parsingstate import ParsingState -from bu4.parsing.states.afterparsing import AfterParsing -from bu4.parsing.targets.apchain import APChain +from bu4.parsing.states.parsingread import ParsingRead from bu4.parsing.targets.apendswith import APEndsWith +from bu4.transform.states.aftertransform import AfterTransform +from bu4.transform.states.transformstate import TransformState __all__ = ('XQuot',) -class XQuot(Extension, code=CODE_QUOT): - def apply(self, state: AfterParsing) -> ParsingState: - state.target = APChain(APEndsWith(self.parser, CODE_QUOT, 'quot expected'), state.target) - return state +class XQuot(Extension[Parsed], code=CODE_QUOT): + def apply(self) -> TransformState[Parsed]: + return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, CODE_QUOT, 'quot expected')) diff --git a/bu4/parsing/extensions/xskip.py b/bu4/parsing/extensions/xskip.py index fe5eb5d..4170938 100644 --- a/bu4/parsing/extensions/xskip.py +++ b/bu4/parsing/extensions/xskip.py @@ -1,13 +1,14 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.parsing.codes import CODE_SKIP +from bu4.parsing.constructs.parsed import Parsed 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.parsingread import ParsingRead +from bu4.transform.states.transformstate import TransformState __all__ = ('XSkip',) -class XSkip(Extension, code=CODE_SKIP): - def apply(self, state: AfterParsing) -> ParsingState: - return state +class XSkip(Extension[Parsed], code=CODE_SKIP): + def apply(self) -> TransformState[Parsed]: + return ParsingRead(self.parser) diff --git a/bu4/parsing/extensions/xxcpt.py b/bu4/parsing/extensions/xxcpt.py index a141c5c..51af6c0 100644 --- a/bu4/parsing/extensions/xxcpt.py +++ b/bu4/parsing/extensions/xxcpt.py @@ -1,16 +1,15 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.parsing.codes import CODE_XCPT +from bu4.parsing.constructs.parsed import Parsed from bu4.parsing.constructs.pexception import PException 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.transform.states.transformfinished import TransformFinished +from bu4.transform.states.transformstate import TransformState __all__ = ('XXcpt',) -class XXcpt(Extension, code=CODE_XCPT): - def apply(self, state: AfterParsing) -> ParsingState: - state.state = ParsingFinished(PException(self.parser.parse_name())) - return state +class XXcpt(Extension[Parsed], code=CODE_XCPT): + def apply(self) -> TransformState[Parsed]: + return TransformFinished(PException(self.parser.parse_name())) diff --git a/bu4/parsing/parser.py b/bu4/parsing/parser.py index 53e980a..2fb24f6 100644 --- a/bu4/parsing/parser.py +++ b/bu4/parsing/parser.py @@ -1,25 +1,23 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. from io import BytesIO -from typing import Iterable, Type +from typing import Iterable, Type, TypeVar 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.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.targets.apchain import APChain -from bu4.parsing.targets.aplambda import APLambda +from bu4.transform.states.transformfinished import TransformFinished __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.__extensions: dict[int, Extension] = {} + self.__extensions: dict[int, Extension[T]] = {} for extension in extensions: if extension.code in self.__extensions: raise ValueError('code overload') @@ -37,31 +35,15 @@ class Parser(AbstractParser): return s.getvalue() s.write(bytes([c])) - def _state_read(self, state: AfterParsing) -> ParsingState: - code = self.read() + def extension_for(self, code: int) -> AbstractExtension[T]: extension = self.__extensions.get(code) if extension is None: raise ValueError(f'unknown control: {hex(code)}') - state = extension.apply(state) - return state + return extension - def _state_next(self, state: AfterParsing) -> ParsingState: - if isinstance(state.state, AfterParsing): - 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))) + def parse(self) -> T: + state = ParsingRead(self) while True: - if isinstance(state, ParsingFinished): - return state.parsed - elif isinstance(state, AfterParsing): - state = self._state_next(state) - else: - raise TypeError + if isinstance(state, TransformFinished): + return state.transformed + state = state.next() diff --git a/bu4/parsing/states/afterparsing.py b/bu4/parsing/states/afterparsing.py deleted file mode 100644 index 843c9d1..0000000 --- a/bu4/parsing/states/afterparsing.py +++ /dev/null @@ -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 diff --git a/bu4/parsing/states/parsing_call.py b/bu4/parsing/states/parsing_call.py index b1b859e..0cf3e3a 100644 --- a/bu4/parsing/states/parsing_call.py +++ b/bu4/parsing/states/parsing_call.py @@ -1,22 +1,25 @@ # 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.states.afterparsing import AfterParsing -from bu4.parsing.states.parsingfinished import ParsingFinished 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',) -def parsing_call(): - return AfterParsing( - ParsingRead(), - APLambda( - lambda argument: AfterParsing( - ParsingRead(), - APLambda( - lambda lambda_: ParsingFinished( +def parsing_call(parser: AbstractParser[Parsed]) -> TransformState[Parsed]: + return AfterTransform( + ParsingRead(parser), + ATLambda( + lambda argument: AfterTransform( + ParsingRead(parser), + ATLambda( + lambda lambda_: TransformFinished( PCall( argument, lambda_ diff --git a/bu4/parsing/states/parsingfinished.py b/bu4/parsing/states/parsingfinished.py deleted file mode 100644 index 07308c7..0000000 --- a/bu4/parsing/states/parsingfinished.py +++ /dev/null @@ -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 diff --git a/bu4/parsing/states/parsingread.py b/bu4/parsing/states/parsingread.py index 88d5b4d..9bffccb 100644 --- a/bu4/parsing/states/parsingread.py +++ b/bu4/parsing/states/parsingread.py @@ -1,9 +1,20 @@ # 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',) +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() diff --git a/bu4/parsing/states/parsingstate.py b/bu4/parsing/states/parsingstate.py deleted file mode 100644 index 6aa6455..0000000 --- a/bu4/parsing/states/parsingstate.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) PARRRATE T&V 2021. All rights reserved. - -__all__ = ('ParsingState',) - - -class ParsingState: - pass diff --git a/bu4/parsing/targets/apchain.py b/bu4/parsing/targets/apchain.py deleted file mode 100644 index 8d695ff..0000000 --- a/bu4/parsing/targets/apchain.py +++ /dev/null @@ -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) diff --git a/bu4/parsing/targets/apendswith.py b/bu4/parsing/targets/apendswith.py index 140b46b..51e68f9 100644 --- a/bu4/parsing/targets/apendswith.py +++ b/bu4/parsing/targets/apendswith.py @@ -1,20 +1,23 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. +from typing import TypeVar + from bu4.parsing.abstractparser import AbstractParser -from bu4.parsing.constructs.parsed import Parsed -from bu4.parsing.states.parsingstate import ParsingState -from bu4.parsing.states.parsingfinished import ParsingFinished -from bu4.parsing.targets.aptarget import APTarget +from bu4.transform.states.transformfinished import TransformFinished +from bu4.transform.states.transformstate import TransformState +from bu4.transform.targets.attarget import ATTarget __all__ = ('APEndsWith',) +T = TypeVar('T') -class APEndsWith(APTarget): + +class APEndsWith(ATTarget[T]): def __init__(self, parser: AbstractParser, expected: int, message: str): self.parser = parser self.expected = expected self.message = message - def given(self, parsed: Parsed) -> ParsingState: + def given(self, parsed: T) -> TransformState[T]: assert self.parser.read() == self.expected, self.message - return ParsingFinished(parsed) + return TransformFinished(parsed) diff --git a/bu4/parsing/targets/aplambda.py b/bu4/parsing/targets/aplambda.py deleted file mode 100644 index f464fcd..0000000 --- a/bu4/parsing/targets/aplambda.py +++ /dev/null @@ -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) diff --git a/bu4/parsing/targets/aptarget.py b/bu4/parsing/targets/aptarget.py deleted file mode 100644 index 65820d7..0000000 --- a/bu4/parsing/targets/aptarget.py +++ /dev/null @@ -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 diff --git a/bu4/parsing/toolchain/parse.py b/bu4/parsing/toolchain/parse.py index 0f60b3e..a921e41 100644 --- a/bu4/parsing/toolchain/parse.py +++ b/bu4/parsing/toolchain/parse.py @@ -9,8 +9,9 @@ from bu4.parsing.parser import Parser __all__ = ('parse',) -def parse(source: bytes, extensions: Iterable[Type[Extension]]) -> Parsed: - return Parser( +def parse(source: bytes, extensions: Iterable[Type[Extension[Parsed]]]) -> Parsed: + parser = Parser( source, extensions - ).parse() + ) + return parser.parse() diff --git a/bu4/transform/states/aftertransform.py b/bu4/transform/states/aftertransform.py new file mode 100644 index 0000000..0558d40 --- /dev/null +++ b/bu4/transform/states/aftertransform.py @@ -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) diff --git a/bu4/transform/states/transformfinished.py b/bu4/transform/states/transformfinished.py new file mode 100644 index 0000000..99c1b5f --- /dev/null +++ b/bu4/transform/states/transformfinished.py @@ -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 diff --git a/bu4/transform/states/transformstart.py b/bu4/transform/states/transformstart.py new file mode 100644 index 0000000..c35b15e --- /dev/null +++ b/bu4/transform/states/transformstart.py @@ -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() diff --git a/bu4/transform/states/transformstate.py b/bu4/transform/states/transformstate.py new file mode 100644 index 0000000..b7251cd --- /dev/null +++ b/bu4/transform/states/transformstate.py @@ -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 diff --git a/bu4/transform/targets/atlambda.py b/bu4/transform/targets/atlambda.py new file mode 100644 index 0000000..cb8615e --- /dev/null +++ b/bu4/transform/targets/atlambda.py @@ -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) diff --git a/bu4/transform/targets/attarget.py b/bu4/transform/targets/attarget.py new file mode 100644 index 0000000..8edcabc --- /dev/null +++ b/bu4/transform/targets/attarget.py @@ -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 diff --git a/bu4/transform/transform.py b/bu4/transform/transform.py new file mode 100644 index 0000000..1b28369 --- /dev/null +++ b/bu4/transform/transform.py @@ -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() diff --git a/main.py b/main.py index c2c7c0d..1141d6a 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,5 @@ # Copyright (c) PARRRATE T&V 2021. All rights reserved. + import random from collections import deque diff --git a/src/sys6.bu4 b/src/sys6.bu4 index fac364d..1f33a7e 100644 --- a/src/sys6.bu4 +++ b/src/sys6.bu4 @@ -1,5 +1,6 @@ @@ """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +### /(g) (x) /