parse_indexed

This commit is contained in:
AF 2021-09-08 13:49:09 +03:00
parent 2b3a202a52
commit d51d6a38e5
38 changed files with 342 additions and 109 deletions

View File

@ -26,4 +26,4 @@ class ILambda(Indexed):
return f'(){self.value}'
def __bytes__(self):
return bytes([CODE_MAKE, len(self.table), *self.table, *bytes(self.value)])
return bytes([CODE_MAKE, self.memoize, len(self.table), *self.table, *bytes(self.value)])

View File

@ -0,0 +1,33 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.icall import ICall
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_CALL
from bu4.parsing.extensions.extension import Extension
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__ = ('XICall',)
class XICall(Extension[Indexed], code=CODE_CALL):
def apply(self) -> TransformState[Indexed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda argument: AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda lambda_: TransformFinished(
ICall(
argument,
lambda_
)
)
)
)
)
)

View File

@ -0,0 +1,23 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.idelayed import IDelayed
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_DLYD
from bu4.parsing.extensions.extension import Extension
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__ = ('XIDlyd',)
class XIDlyd(Extension[Indexed], code=CODE_DLYD):
def apply(self) -> TransformState[Indexed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda value: TransformFinished(IDelayed(value))
)
)

View File

@ -0,0 +1,25 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.ilambda import ILambda
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_MAKE
from bu4.parsing.extensions.extension import Extension
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__ = ('XIMake',)
class XIMake(Extension[Indexed], code=CODE_MAKE):
def apply(self) -> TransformState[Indexed]:
memoize = bool(self.parser.read())
table = [self.parser.read() for _ in range(self.parser.read())]
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda value: TransformFinished(ILambda(value, table, memoize=memoize))
)
)

View File

@ -0,0 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.iname import IName
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_NAME
from bu4.parsing.extensions.extension import Extension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XIName',)
class XIName(Extension[Indexed], code=CODE_NAME):
def apply(self) -> TransformState[Indexed]:
return TransformFinished(IName(self.parser.read()))

View File

@ -0,0 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.constructs.inull import INull
from bu4.parsing.codes import CODE_NULL
from bu4.parsing.extensions.extension import Extension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XINull',)
class XINull(Extension[Indexed], code=CODE_NULL):
def apply(self) -> TransformState[Indexed]:
return TransformFinished(INull())

View File

@ -0,0 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.iexception import IException
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_XCPT
from bu4.parsing.extensions.extension import Extension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XIXcpt',)
class XIXcpt(Extension[Indexed], code=CODE_XCPT):
def apply(self) -> TransformState[Indexed]:
return TransformFinished(IException(self.parser.parse_name()))

View File

@ -0,0 +1,28 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.extensions.xicall import XICall
from bu4.indexing.extensions.xidlyd import XIDlyd
from bu4.indexing.extensions.ximake import XIMake
from bu4.indexing.extensions.xiname import XIName
from bu4.indexing.extensions.xinull import XINull
from bu4.indexing.extensions.xixcpt import XIXcpt
from bu4.parsing.parser import Parser
from bu4.transform.transform import transform
__all__ = ('parse_indexed',)
def parse_indexed(source: bytes) -> Indexed:
parser = Parser(
source,
[
XINull,
XICall,
XIMake,
XIName,
XIXcpt,
XIDlyd,
]
)
return transform(parser.parse())

View File

@ -2,9 +2,9 @@
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.sync import sync
from bu4.parsing.toolchain.parse import parse
from bu4.parsing.toolchain.stdext import standard_extension
from bu4.parsing.toolchain.transply import transply
from bu4.linkable.toolchain.parse import parse
from bu4.linkable.toolchain.stdext import standard_extension
from bu4.linkable.toolchain.transply import transply
from bu4.transform.transform import transform
__all__ = ('isynced',)

View File

@ -2,7 +2,7 @@
from bu4.linking.constructs.lcall import LCall
from bu4.linking.constructs.linked import Linked
from bu4.parsing.constructs.parsed import Parsed
from bu4.linkable.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

View File

@ -0,0 +1,27 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.constructs.ldelayed import LDelayed
from bu4.linking.constructs.linked import Linked
from bu4.linkable.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__ = ('PDelayed',)
class PDelayed(Parsed):
def __init__(self, value: Parsed):
self.value = value
def link(self, promise: set[bytes]) -> TransformState[Linked]:
return AfterTransform(
TransformStart(lambda: self.value.link(promise)),
ATLambda(
lambda value: TransformFinished(LDelayed(
value
))
)
)

View File

@ -2,7 +2,7 @@
from bu4.linking.constructs.lexception import LException
from bu4.linking.constructs.linked import Linked
from bu4.parsing.constructs.parsed import Parsed
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -2,7 +2,7 @@
from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.llambda import LLambda
from bu4.parsing.constructs.parsed import Parsed
from bu4.linkable.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

View File

@ -2,7 +2,7 @@
from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.lname import LName
from bu4.parsing.constructs.parsed import Parsed
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -2,7 +2,7 @@
from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.lnull import LNull
from bu4.parsing.constructs.parsed import Parsed
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -0,0 +1,33 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pcall import PCall
from bu4.parsing.codes import CODE_CALL
from bu4.parsing.extensions.extension import Extension
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__ = ('XCall',)
class XCall(Extension[Parsed], code=CODE_CALL):
def apply(self) -> TransformState[Parsed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda argument: AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda lambda_: TransformFinished(
PCall(
argument,
lambda_
)
)
)
)
)
)

View File

@ -0,0 +1,23 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pdelayed import PDelayed
from bu4.parsing.codes import CODE_DLYD
from bu4.parsing.extensions.extension import Extension
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__ = ('XDlyd',)
class XDlyd(Extension[Parsed], code=CODE_DLYD):
def apply(self) -> TransformState[Parsed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda value: TransformFinished(PDelayed(value))
)
)

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.plambda import PLambda
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.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform

View File

@ -1,8 +1,8 @@
# 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.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pname import PName
from bu4.parsing.extensions.extension import Extension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pnull import PNull
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.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -1,7 +1,7 @@
# 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.linkable.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.targets.apendswith import APEndsWith

View File

@ -1,7 +1,7 @@
# 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.linkable.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.targets.apendswith import APEndsWith

View File

@ -1,7 +1,7 @@
# 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.linkable.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.transformstate import TransformState

View File

@ -1,8 +1,8 @@
# 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.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pexception import PException
from bu4.parsing.extensions.extension import Extension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -2,9 +2,10 @@
from typing import Iterable, Type
from bu4.parsing.constructs.parsed import Parsed
from bu4.linkable.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.parser import Parser
from bu4.transform.transform import transform
__all__ = ('parse',)
@ -14,4 +15,4 @@ def parse(source: bytes, extensions: Iterable[Type[Extension[Parsed]]]) -> Parse
source,
extensions
)
return parser.parse()
return transform(parser.parse())

View File

@ -0,0 +1,25 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.extensions.xcall import XCall
from bu4.linkable.extensions.xdlyd import XDlyd
from bu4.linkable.extensions.xmake import XMake
from bu4.linkable.extensions.xname import XName
from bu4.linkable.extensions.xnull import XNull
from bu4.linkable.extensions.xqopn import XQopn
from bu4.linkable.extensions.xquot import XQuot
from bu4.linkable.extensions.xskip import XSkip
from bu4.linkable.extensions.xxcpt import XXcpt
__all__ = ('standard_extension',)
standard_extension = (
XNull,
XCall,
XMake,
XName,
XSkip,
XQuot,
XQopn,
XXcpt,
XDlyd,
)

View File

@ -38,6 +38,8 @@ def transply(source: str) -> bytes:
transplied.write(bytes([CODE_QCLS]))
elif c in '«':
transplied.write(bytes([CODE_QOPN, CODE_XCPT]))
elif c in '&':
transplied.write(bytes([CODE_DLYD]))
else:
transplied.write(c.encode())
return transplied.getvalue()

View File

@ -0,0 +1,38 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.edelayed import EDelayed
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.idelayed import IDelayed
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__ = ('LDelayed',)
class LDelayed(Linked):
value: Linked
def __init__(self, value: Linked):
self.value = value
self.future = self.value.future
self.multifuture = self.future
def attach(self, env: envtype) -> Evaluable:
return EDelayed(env, self.value)
def index(self, promise: list[bytes]) -> TransformState[Indexed]:
return AfterTransform(
TransformStart(lambda: self.value.index(promise)),
ATLambda(
lambda value: TransformFinished(IDelayed(value))
)
)
def __str__(self):
return f'(){self.value}'

View File

@ -2,7 +2,7 @@
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.parsing.constructs.parsed import Parsed
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.transform import transform
__all__ = ('evaluable_from_parsed',)

View File

@ -1,14 +0,0 @@
# 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.parsing_call import parsing_call
from bu4.transform.states.transformstate import TransformState
__all__ = ('XCall',)
class XCall(Extension[Parsed], code=CODE_CALL):
def apply(self) -> TransformState[Parsed]:
return parsing_call(self.parser)

View File

@ -7,10 +7,13 @@ from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.extensions.abstractextension import AbstractExtension
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.transformfinished import TransformFinished
__all__ = ('Parser',)
from bu4.transform.states.transformstate import TransformState
from bu4.transform.transform import transform
T = TypeVar('T')
@ -41,9 +44,5 @@ class Parser(AbstractParser[T]):
raise ValueError(f'unknown control: {hex(code)}')
return extension
def parse(self) -> T:
state = ParsingRead(self)
while True:
if isinstance(state, TransformFinished):
return state.transformed
state = state.next()
def parse(self) -> TransformState[T]:
return ParsingRead(self)

View File

@ -1,31 +0,0 @@
# 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.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__ = ('parsing_call',)
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_
)
)
)
)
)
)

View File

@ -1,23 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.extensions.xcall import XCall
from bu4.parsing.extensions.xmake import XMake
from bu4.parsing.extensions.xname import XName
from bu4.parsing.extensions.xnull import XNull
from bu4.parsing.extensions.xqopn import XQopn
from bu4.parsing.extensions.xquot import XQuot
from bu4.parsing.extensions.xskip import XSkip
from bu4.parsing.extensions.xxcpt import XXcpt
__all__ = ('standard_extension',)
standard_extension = (
XNull,
XCall,
XMake,
XName,
XSkip,
XQuot,
XQopn,
XXcpt,
)

View File

@ -3,9 +3,9 @@
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.sync import sync
from bu4.linking.evaluable_from_parsed import evaluable_from_parsed
from bu4.parsing.toolchain.parse import parse
from bu4.parsing.toolchain.stdext import standard_extension
from bu4.parsing.toolchain.transply import transply
from bu4.linkable.toolchain.parse import parse
from bu4.linkable.toolchain.stdext import standard_extension
from bu4.linkable.toolchain.transply import transply
__all__ = ('synced',)

View File

@ -7,7 +7,7 @@ from bu4.common_interface import with_common_interface
from bu4.evaluation.constructs.proxy import antiproxy, eproxy
from bu4.evaluation.sync import sync
from bu4.isynced import isynced as synced
from bu4.parsing.toolchain.readfile import readfile
from bu4.linkable.toolchain.readfile import readfile
from bu4.tracing.probe import Probe
from bu4.tracing.trace import trace
from timesample import TimeSample
@ -86,7 +86,6 @@ with TimeSample('all'):
TimeSample.print(*prefix, '...')
with TimeSample('sys6'):
sys6 = synced(readfile('src/sys6')).call(synced('?'))
for _ in range(100):
sys6 = sys6.next()
print(sys6)

View File

@ -1,6 +1,11 @@
@@
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
&
/
[ID]
[YC]
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
###
/(g)
(x)
/
@ -8,11 +13,6 @@
[g]
[YC]
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
(_)
/
[ID]
[YC]
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
(_)
/ < (x) /[x][SC] > [SC]
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""