omlish 0.0.0.dev423__py3-none-any.whl → 0.0.0.dev484__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of omlish might be problematic. Click here for more details.
- omlish/{.manifests.json → .omlish-manifests.json} +12 -0
- omlish/__about__.py +21 -18
- omlish/argparse/all.py +17 -9
- omlish/argparse/cli.py +16 -3
- omlish/argparse/utils.py +21 -0
- omlish/asyncs/all.py +0 -13
- omlish/asyncs/asyncio/rlock.py +110 -0
- omlish/asyncs/asyncio/subprocesses.py +2 -2
- omlish/asyncs/asyncio/sync.py +43 -0
- omlish/asyncs/asyncio/utils.py +2 -0
- omlish/asyncs/ioproxy/proxy.py +1 -1
- omlish/asyncs/sync.py +25 -0
- omlish/bootstrap/_marshal.py +1 -1
- omlish/bootstrap/diag.py +12 -21
- omlish/bootstrap/main.py +2 -5
- omlish/bootstrap/sys.py +27 -28
- omlish/c3.py +4 -1
- omlish/cexts/include/omlish/omlish.hh +1 -0
- omlish/collections/__init__.py +13 -1
- omlish/collections/attrregistry.py +210 -0
- omlish/collections/cache/impl.py +3 -2
- omlish/collections/identity.py +1 -0
- omlish/collections/mappings.py +28 -0
- omlish/collections/trie.py +5 -1
- omlish/collections/utils.py +77 -0
- omlish/concurrent/__init__.py +0 -11
- omlish/concurrent/all.py +18 -0
- omlish/concurrent/futures.py +25 -0
- omlish/concurrent/threadlets.py +1 -1
- omlish/configs/processing/flattening.py +1 -1
- omlish/configs/processing/merging.py +8 -6
- omlish/configs/types.py +1 -1
- omlish/daemons/__init__.py +70 -0
- omlish/daemons/daemon.py +2 -2
- omlish/daemons/launching.py +2 -2
- omlish/daemons/reparent.py +2 -3
- omlish/daemons/spawning.py +2 -3
- omlish/dataclasses/__init__.py +5 -5
- omlish/dataclasses/errors.py +1 -1
- omlish/dataclasses/impl/api/classes/decorator.py +3 -0
- omlish/dataclasses/impl/api/classes/make.py +4 -1
- omlish/dataclasses/impl/concerns/doc.py +1 -1
- omlish/dataclasses/impl/concerns/repr.py +15 -2
- omlish/dataclasses/impl/configs.py +97 -36
- omlish/dataclasses/impl/generation/compilation.py +21 -19
- omlish/dataclasses/impl/generation/globals.py +1 -0
- omlish/dataclasses/impl/generation/ops.py +1 -0
- omlish/dataclasses/impl/generation/processor.py +105 -24
- omlish/dataclasses/impl/processing/base.py +8 -0
- omlish/dataclasses/impl/processing/driving.py +8 -8
- omlish/dataclasses/specs.py +34 -2
- omlish/dataclasses/tools/as_.py +0 -12
- omlish/dataclasses/tools/modifiers.py +5 -0
- omlish/dataclasses/tools/static.py +1 -1
- omlish/diag/_pycharm/runhack.py +1 -1
- omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
- omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
- omlish/diag/{ps.py → cmds/ps.py} +6 -6
- omlish/diag/procfs.py +4 -4
- omlish/diag/pycharm.py +16 -2
- omlish/diag/pydevd.py +58 -40
- omlish/diag/replserver/console.py +3 -3
- omlish/diag/replserver/server.py +2 -2
- omlish/dispatch/__init__.py +18 -12
- omlish/dispatch/methods.py +50 -140
- omlish/dom/rendering.py +1 -1
- omlish/formats/dotenv.py +8 -8
- omlish/formats/json/stream/__init__.py +18 -3
- omlish/formats/json/stream/building.py +2 -2
- omlish/formats/json/stream/lexing.py +401 -67
- omlish/formats/json/stream/parsing.py +32 -10
- omlish/formats/json/stream/rendering.py +6 -6
- omlish/formats/json/stream/utils.py +132 -30
- omlish/formats/json5/literals.py +7 -4
- omlish/formats/json5/parsing.py +33 -79
- omlish/formats/json5/stream.py +77 -0
- omlish/formats/logfmt.py +8 -2
- omlish/funcs/genmachine.py +2 -2
- omlish/funcs/guard.py +225 -0
- omlish/graphs/dot/rendering.py +1 -1
- omlish/http/all.py +122 -53
- omlish/http/asgi.py +2 -2
- omlish/http/clients/__init__.py +0 -34
- omlish/http/clients/asyncs.py +153 -0
- omlish/http/clients/base.py +63 -122
- omlish/http/clients/coro/sync.py +171 -0
- omlish/http/clients/default.py +209 -30
- omlish/http/clients/executor.py +56 -0
- omlish/http/clients/httpx.py +78 -13
- omlish/http/clients/middleware.py +181 -0
- omlish/http/clients/sync.py +151 -0
- omlish/http/clients/syncasync.py +49 -0
- omlish/http/clients/urllib.py +8 -5
- omlish/http/coro/client/{client.py → connection.py} +43 -37
- omlish/http/coro/client/headers.py +5 -5
- omlish/http/coro/client/response.py +37 -38
- omlish/http/coro/client/status.py +4 -4
- omlish/http/coro/{client/io.py → io.py} +19 -2
- omlish/http/coro/server/fdio.py +10 -9
- omlish/http/coro/server/server.py +14 -41
- omlish/http/coro/server/sockets.py +7 -6
- omlish/http/flasky/__init__.py +40 -0
- omlish/http/flasky/_compat.py +2 -0
- omlish/http/flasky/api.py +82 -0
- omlish/http/flasky/app.py +203 -0
- omlish/http/flasky/cvs.py +59 -0
- omlish/http/flasky/requests.py +20 -0
- omlish/http/flasky/responses.py +23 -0
- omlish/http/flasky/routes.py +23 -0
- omlish/http/flasky/types.py +15 -0
- omlish/http/handlers.py +3 -2
- omlish/http/headers.py +69 -35
- omlish/http/sse.py +1 -1
- omlish/http/urls.py +67 -0
- omlish/inject/__init__.py +173 -126
- omlish/inject/_dataclasses.py +4986 -0
- omlish/inject/binder.py +10 -49
- omlish/inject/elements.py +27 -0
- omlish/inject/{utils.py → helpers/constfn.py} +3 -3
- omlish/inject/{tags.py → helpers/id.py} +2 -2
- omlish/inject/helpers/multis.py +143 -0
- omlish/inject/helpers/wrappers.py +54 -0
- omlish/inject/impl/elements.py +52 -22
- omlish/inject/impl/injector.py +76 -49
- omlish/inject/impl/inspect.py +11 -1
- omlish/inject/impl/maysync.py +43 -0
- omlish/inject/impl/multis.py +10 -7
- omlish/inject/impl/privates.py +8 -8
- omlish/inject/impl/providers.py +23 -34
- omlish/inject/impl/providersmap.py +43 -0
- omlish/inject/impl/proxy.py +0 -2
- omlish/inject/impl/scopes.py +19 -23
- omlish/inject/impl/sync.py +41 -0
- omlish/inject/injector.py +37 -8
- omlish/inject/inspect.py +35 -0
- omlish/inject/listeners.py +4 -4
- omlish/inject/managed.py +54 -18
- omlish/inject/maysync.py +27 -0
- omlish/inject/multis.py +8 -0
- omlish/inject/overrides.py +3 -3
- omlish/inject/privates.py +6 -0
- omlish/inject/providers.py +8 -1
- omlish/inject/scopes.py +40 -12
- omlish/inject/sync.py +49 -0
- omlish/io/buffers.py +119 -1
- omlish/io/readers.py +29 -0
- omlish/iterators/__init__.py +28 -20
- omlish/iterators/transforms.py +204 -0
- omlish/lang/__init__.py +240 -129
- omlish/lang/_asyncs.cc +186 -0
- omlish/lang/asyncs.py +67 -43
- omlish/lang/{attrs.py → attrstorage.py} +15 -15
- omlish/lang/cached/property.py +2 -2
- omlish/lang/casing.py +11 -0
- omlish/lang/classes/bindable.py +2 -3
- omlish/lang/classes/restrict.py +8 -0
- omlish/lang/classes/simple.py +26 -4
- omlish/lang/collections.py +1 -1
- omlish/lang/contextmanagers.py +59 -9
- omlish/lang/functions.py +31 -33
- omlish/lang/imports/_capture.cc +103 -0
- omlish/lang/imports/capture.py +902 -0
- omlish/lang/imports/lazy.py +0 -25
- omlish/lang/imports/proxy.py +559 -0
- omlish/lang/iterables.py +2 -2
- omlish/lang/lazyglobals.py +49 -14
- omlish/lang/maybes.py +2 -1
- omlish/lang/maysync.py +2 -2
- omlish/lang/params.py +17 -0
- omlish/lang/recursion.py +0 -1
- omlish/lang/resources.py +1 -1
- omlish/lang/sequences.py +124 -0
- omlish/lifecycles/contextmanagers.py +1 -2
- omlish/lifecycles/controller.py +1 -2
- omlish/lite/abstract.py +54 -24
- omlish/lite/asyncs.py +146 -0
- omlish/lite/attrops.py +415 -0
- omlish/lite/cached.py +57 -1
- omlish/lite/contextmanagers.py +4 -4
- omlish/lite/dataclasses.py +55 -0
- omlish/lite/inject.py +5 -4
- omlish/lite/marshal.py +1 -0
- omlish/lite/maybes.py +10 -2
- omlish/lite/maysync.py +22 -5
- omlish/lite/pycharm.py +1 -1
- omlish/lite/strings.py +0 -7
- omlish/lite/timing.py +6 -3
- omlish/lite/typing.py +6 -0
- omlish/logs/_amalg.py +8 -0
- omlish/logs/all.py +59 -31
- omlish/logs/base.py +204 -0
- omlish/logs/contexts.py +171 -0
- omlish/logs/formatters.py +13 -0
- omlish/logs/infos.py +377 -0
- omlish/logs/levels.py +97 -0
- omlish/logs/modules.py +13 -0
- omlish/logs/protocols.py +32 -0
- omlish/logs/standard.py +20 -15
- omlish/logs/std/configs.py +29 -0
- omlish/logs/{filters.py → std/filters.py} +1 -1
- omlish/logs/std/formatters.py +25 -0
- omlish/logs/std/handlers.py +19 -0
- omlish/logs/{json.py → std/json.py} +2 -2
- omlish/logs/std/loggers.py +48 -0
- omlish/logs/{proxy.py → std/proxy.py} +3 -3
- omlish/logs/std/records.py +671 -0
- omlish/logs/typed/bindings.py +108 -37
- omlish/logs/typed/types.py +17 -1
- omlish/logs/typed/values.py +2 -2
- omlish/logs/utils.py +60 -4
- omlish/logs/warnings.py +8 -0
- omlish/manifests/loading.py +8 -1
- omlish/marshal/__init__.py +54 -22
- omlish/marshal/_dataclasses.py +2774 -0
- omlish/marshal/base/configs.py +12 -0
- omlish/marshal/base/contexts.py +36 -21
- omlish/marshal/base/funcs.py +8 -11
- omlish/marshal/base/options.py +8 -0
- omlish/marshal/base/registries.py +146 -44
- omlish/marshal/base/types.py +40 -16
- omlish/marshal/composite/iterables.py +33 -20
- omlish/marshal/composite/literals.py +20 -18
- omlish/marshal/composite/mappings.py +36 -23
- omlish/marshal/composite/maybes.py +29 -19
- omlish/marshal/composite/newtypes.py +16 -16
- omlish/marshal/composite/optionals.py +14 -14
- omlish/marshal/composite/special.py +15 -15
- omlish/marshal/composite/unions/literals.py +93 -0
- omlish/marshal/composite/unions/primitives.py +103 -0
- omlish/marshal/factories/invalidate.py +18 -68
- omlish/marshal/factories/method.py +26 -0
- omlish/marshal/factories/moduleimport/factories.py +22 -65
- omlish/marshal/factories/multi.py +13 -25
- omlish/marshal/factories/recursive.py +42 -56
- omlish/marshal/factories/typecache.py +29 -74
- omlish/marshal/factories/typemap.py +42 -43
- omlish/marshal/objects/dataclasses.py +129 -106
- omlish/marshal/objects/marshal.py +18 -14
- omlish/marshal/objects/namedtuples.py +48 -42
- omlish/marshal/objects/unmarshal.py +19 -15
- omlish/marshal/polymorphism/marshal.py +9 -11
- omlish/marshal/polymorphism/metadata.py +16 -5
- omlish/marshal/polymorphism/standard.py +13 -1
- omlish/marshal/polymorphism/unions.py +15 -105
- omlish/marshal/polymorphism/unmarshal.py +9 -10
- omlish/marshal/singular/enums.py +14 -18
- omlish/marshal/standard.py +10 -6
- omlish/marshal/trivial/any.py +1 -1
- omlish/marshal/trivial/forbidden.py +21 -26
- omlish/math/fixed.py +2 -2
- omlish/metadata.py +23 -1
- omlish/os/atomics.py +2 -2
- omlish/os/forkhooks.py +4 -0
- omlish/os/journald.py +3 -3
- omlish/os/pidfiles/pinning.py +2 -2
- omlish/reflect/ops.py +9 -0
- omlish/reflect/types.py +44 -8
- omlish/secrets/marshal.py +1 -1
- omlish/secrets/secrets.py +6 -3
- omlish/sockets/addresses.py +1 -1
- omlish/sockets/server/handlers.py +2 -2
- omlish/sockets/server/server.py +4 -3
- omlish/sockets/server/ssl.py +2 -2
- omlish/specs/jmespath/__init__.py +12 -3
- omlish/specs/jmespath/_dataclasses.py +2893 -0
- omlish/specs/jmespath/ast.py +1 -1
- omlish/specs/jsonrpc/__init__.py +13 -0
- omlish/specs/jsonrpc/_marshal.py +32 -23
- omlish/specs/jsonrpc/conns.py +10 -7
- omlish/specs/jsonschema/_marshal.py +1 -1
- omlish/specs/jsonschema/keywords/__init__.py +7 -0
- omlish/specs/jsonschema/keywords/_dataclasses.py +1644 -0
- omlish/specs/openapi/_marshal.py +31 -22
- omlish/sql/__init__.py +15 -20
- omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
- omlish/sql/queries/_marshal.py +3 -3
- omlish/sql/queries/params.py +1 -1
- omlish/sql/queries/rendering.py +1 -1
- omlish/sql/tabledefs/_marshal.py +1 -1
- omlish/subprocesses/all.py +135 -0
- omlish/subprocesses/base.py +8 -3
- omlish/subprocesses/editor.py +1 -1
- omlish/sync.py +181 -20
- omlish/term/alt.py +60 -0
- omlish/term/confirm.py +8 -8
- omlish/term/pager.py +235 -0
- omlish/term/terminfo.py +935 -0
- omlish/term/termstate.py +67 -0
- omlish/term/vt100/terminal.py +0 -3
- omlish/testing/pytest/plugins/asyncs/fixtures.py +4 -1
- omlish/testing/pytest/plugins/skips.py +2 -5
- omlish/testing/unittest/main.py +3 -3
- omlish/text/docwrap/__init__.py +3 -0
- omlish/text/docwrap/__main__.py +11 -0
- omlish/text/docwrap/api.py +83 -0
- omlish/text/docwrap/cli.py +86 -0
- omlish/text/docwrap/groups.py +84 -0
- omlish/text/docwrap/lists.py +167 -0
- omlish/text/docwrap/parts.py +146 -0
- omlish/text/docwrap/reflowing.py +106 -0
- omlish/text/docwrap/rendering.py +151 -0
- omlish/text/docwrap/utils.py +11 -0
- omlish/text/docwrap/wrapping.py +59 -0
- omlish/text/filecache.py +2 -2
- omlish/text/lorem.py +6 -0
- omlish/text/parts.py +2 -2
- omlish/text/textwrap.py +51 -0
- omlish/typedvalues/__init__.py +1 -1
- omlish/typedvalues/marshal.py +85 -59
- omlish/typedvalues/values.py +2 -1
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/METADATA +36 -38
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/RECORD +323 -385
- omlish/asyncs/bluelet/LICENSE +0 -6
- omlish/asyncs/bluelet/all.py +0 -67
- omlish/asyncs/bluelet/api.py +0 -23
- omlish/asyncs/bluelet/core.py +0 -178
- omlish/asyncs/bluelet/events.py +0 -79
- omlish/asyncs/bluelet/files.py +0 -80
- omlish/asyncs/bluelet/runner.py +0 -417
- omlish/asyncs/bluelet/sockets.py +0 -216
- omlish/asyncs/bridge.py +0 -359
- omlish/asyncs/utils.py +0 -18
- omlish/dataclasses/impl/generation/mangling.py +0 -18
- omlish/defs.py +0 -216
- omlish/dispatch/_dispatch2.py +0 -69
- omlish/dispatch/_dispatch3.py +0 -108
- omlish/dynamic.py +0 -219
- omlish/formats/json/Json.g4 +0 -77
- omlish/formats/json/_antlr/JsonLexer.py +0 -109
- omlish/formats/json/_antlr/JsonListener.py +0 -61
- omlish/formats/json/_antlr/JsonParser.py +0 -457
- omlish/formats/json/_antlr/JsonVisitor.py +0 -42
- omlish/formats/json5/Json5.g4 +0 -168
- omlish/formats/json5/_antlr/Json5Lexer.py +0 -354
- omlish/formats/json5/_antlr/Json5Listener.py +0 -79
- omlish/formats/json5/_antlr/Json5Parser.py +0 -617
- omlish/formats/json5/_antlr/Json5Visitor.py +0 -52
- omlish/funcs/match.py +0 -227
- omlish/io/trampoline.py +0 -289
- omlish/lang/imports/proxyinit.py +0 -665
- omlish/lite/logs.py +0 -4
- omlish/lite/reprs.py +0 -85
- omlish/logs/abc.py +0 -319
- omlish/logs/callers.py +0 -67
- omlish/logs/color.py +0 -27
- omlish/logs/configs.py +0 -29
- omlish/logs/handlers.py +0 -17
- omlish/logs/protocol.py +0 -218
- omlish/logs/timing.py +0 -58
- omlish/marshal/factories/match.py +0 -34
- omlish/marshal/factories/simple.py +0 -28
- omlish/specs/irc/messages/base.py +0 -49
- omlish/specs/irc/messages/formats.py +0 -92
- omlish/specs/irc/messages/messages.py +0 -774
- omlish/specs/irc/messages/parsing.py +0 -98
- omlish/specs/irc/numerics/formats.py +0 -97
- omlish/specs/irc/numerics/numerics.py +0 -865
- omlish/specs/irc/numerics/types.py +0 -59
- omlish/specs/irc/protocol/LICENSE +0 -11
- omlish/specs/irc/protocol/__init__.py +0 -61
- omlish/specs/irc/protocol/consts.py +0 -6
- omlish/specs/irc/protocol/errors.py +0 -30
- omlish/specs/irc/protocol/message.py +0 -21
- omlish/specs/irc/protocol/nuh.py +0 -55
- omlish/specs/irc/protocol/parsing.py +0 -158
- omlish/specs/irc/protocol/rendering.py +0 -153
- omlish/specs/irc/protocol/tags.py +0 -102
- omlish/specs/irc/protocol/utils.py +0 -30
- omlish/specs/proto/Protobuf3.g4 +0 -396
- omlish/specs/proto/__init__.py +0 -0
- omlish/specs/proto/_antlr/Protobuf3Lexer.py +0 -340
- omlish/specs/proto/_antlr/Protobuf3Listener.py +0 -448
- omlish/specs/proto/_antlr/Protobuf3Parser.py +0 -3909
- omlish/specs/proto/_antlr/Protobuf3Visitor.py +0 -257
- omlish/specs/proto/_antlr/__init__.py +0 -0
- omlish/specs/proto/nodes.py +0 -54
- omlish/specs/proto/parsing.py +0 -97
- omlish/sql/parsing/Minisql.g4 +0 -292
- omlish/sql/parsing/__init__.py +0 -0
- omlish/sql/parsing/_antlr/MinisqlLexer.py +0 -322
- omlish/sql/parsing/_antlr/MinisqlListener.py +0 -511
- omlish/sql/parsing/_antlr/MinisqlParser.py +0 -3763
- omlish/sql/parsing/_antlr/MinisqlVisitor.py +0 -292
- omlish/sql/parsing/_antlr/__init__.py +0 -0
- omlish/sql/parsing/parsing.py +0 -119
- omlish/text/antlr/__init__.py +0 -3
- omlish/text/antlr/_runtime/BufferedTokenStream.py +0 -305
- omlish/text/antlr/_runtime/CommonTokenFactory.py +0 -64
- omlish/text/antlr/_runtime/CommonTokenStream.py +0 -90
- omlish/text/antlr/_runtime/FileStream.py +0 -30
- omlish/text/antlr/_runtime/InputStream.py +0 -90
- omlish/text/antlr/_runtime/IntervalSet.py +0 -183
- omlish/text/antlr/_runtime/LICENSE.txt +0 -28
- omlish/text/antlr/_runtime/LL1Analyzer.py +0 -176
- omlish/text/antlr/_runtime/Lexer.py +0 -332
- omlish/text/antlr/_runtime/ListTokenSource.py +0 -147
- omlish/text/antlr/_runtime/Parser.py +0 -583
- omlish/text/antlr/_runtime/ParserInterpreter.py +0 -173
- omlish/text/antlr/_runtime/ParserRuleContext.py +0 -189
- omlish/text/antlr/_runtime/PredictionContext.py +0 -632
- omlish/text/antlr/_runtime/Recognizer.py +0 -150
- omlish/text/antlr/_runtime/RuleContext.py +0 -230
- omlish/text/antlr/_runtime/StdinStream.py +0 -14
- omlish/text/antlr/_runtime/Token.py +0 -158
- omlish/text/antlr/_runtime/TokenStreamRewriter.py +0 -258
- omlish/text/antlr/_runtime/Utils.py +0 -36
- omlish/text/antlr/_runtime/__init__.py +0 -2
- omlish/text/antlr/_runtime/_all.py +0 -24
- omlish/text/antlr/_runtime/_pygrun.py +0 -174
- omlish/text/antlr/_runtime/atn/ATN.py +0 -135
- omlish/text/antlr/_runtime/atn/ATNConfig.py +0 -162
- omlish/text/antlr/_runtime/atn/ATNConfigSet.py +0 -215
- omlish/text/antlr/_runtime/atn/ATNDeserializationOptions.py +0 -27
- omlish/text/antlr/_runtime/atn/ATNDeserializer.py +0 -449
- omlish/text/antlr/_runtime/atn/ATNSimulator.py +0 -50
- omlish/text/antlr/_runtime/atn/ATNState.py +0 -267
- omlish/text/antlr/_runtime/atn/ATNType.py +0 -20
- omlish/text/antlr/_runtime/atn/LexerATNSimulator.py +0 -573
- omlish/text/antlr/_runtime/atn/LexerAction.py +0 -301
- omlish/text/antlr/_runtime/atn/LexerActionExecutor.py +0 -146
- omlish/text/antlr/_runtime/atn/ParserATNSimulator.py +0 -1664
- omlish/text/antlr/_runtime/atn/PredictionMode.py +0 -502
- omlish/text/antlr/_runtime/atn/SemanticContext.py +0 -333
- omlish/text/antlr/_runtime/atn/Transition.py +0 -271
- omlish/text/antlr/_runtime/atn/__init__.py +0 -4
- omlish/text/antlr/_runtime/dfa/DFA.py +0 -136
- omlish/text/antlr/_runtime/dfa/DFASerializer.py +0 -76
- omlish/text/antlr/_runtime/dfa/DFAState.py +0 -129
- omlish/text/antlr/_runtime/dfa/__init__.py +0 -4
- omlish/text/antlr/_runtime/error/DiagnosticErrorListener.py +0 -111
- omlish/text/antlr/_runtime/error/ErrorListener.py +0 -75
- omlish/text/antlr/_runtime/error/ErrorStrategy.py +0 -712
- omlish/text/antlr/_runtime/error/Errors.py +0 -176
- omlish/text/antlr/_runtime/error/__init__.py +0 -4
- omlish/text/antlr/_runtime/tree/Chunk.py +0 -33
- omlish/text/antlr/_runtime/tree/ParseTreeMatch.py +0 -121
- omlish/text/antlr/_runtime/tree/ParseTreePattern.py +0 -75
- omlish/text/antlr/_runtime/tree/ParseTreePatternMatcher.py +0 -377
- omlish/text/antlr/_runtime/tree/RuleTagToken.py +0 -53
- omlish/text/antlr/_runtime/tree/TokenTagToken.py +0 -50
- omlish/text/antlr/_runtime/tree/Tree.py +0 -194
- omlish/text/antlr/_runtime/tree/Trees.py +0 -114
- omlish/text/antlr/_runtime/tree/__init__.py +0 -2
- omlish/text/antlr/_runtime/xpath/XPath.py +0 -278
- omlish/text/antlr/_runtime/xpath/XPathLexer.py +0 -98
- omlish/text/antlr/_runtime/xpath/__init__.py +0 -4
- omlish/text/antlr/delimit.py +0 -109
- omlish/text/antlr/dot.py +0 -41
- omlish/text/antlr/errors.py +0 -14
- omlish/text/antlr/input.py +0 -96
- omlish/text/antlr/parsing.py +0 -54
- omlish/text/antlr/runtime.py +0 -102
- omlish/text/antlr/utils.py +0 -38
- /omlish/{asyncs/bluelet → cexts}/__init__.py +0 -0
- /omlish/{formats/json/_antlr → diag/cmds}/__init__.py +0 -0
- /omlish/{formats/json5/_antlr → http/clients/coro}/__init__.py +0 -0
- /omlish/{specs/irc → inject/helpers}/__init__.py +0 -0
- /omlish/{specs/irc/messages → logs/std}/__init__.py +0 -0
- /omlish/logs/{noisy.py → std/noisy.py} +0 -0
- /omlish/{specs/irc/numerics → marshal/composite/unions}/__init__.py +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/top_level.txt +0 -0
|
@@ -3,8 +3,6 @@ TODO:
|
|
|
3
3
|
- max buf size
|
|
4
4
|
- max recursion depth
|
|
5
5
|
- mark start pos of tokens, currently returning end
|
|
6
|
-
- _do_string inner loop optimization somehow
|
|
7
|
-
- json5 mode
|
|
8
6
|
"""
|
|
9
7
|
import dataclasses as dc
|
|
10
8
|
import io
|
|
@@ -13,20 +11,25 @@ import re
|
|
|
13
11
|
import typing as ta
|
|
14
12
|
|
|
15
13
|
from .... import check
|
|
14
|
+
from .... import lang
|
|
16
15
|
from ....funcs.genmachine import GenMachine
|
|
17
16
|
from .errors import JsonStreamError
|
|
18
17
|
|
|
19
18
|
|
|
19
|
+
if ta.TYPE_CHECKING:
|
|
20
|
+
import unicodedata
|
|
21
|
+
else:
|
|
22
|
+
unicodedata = lang.proxy_import('unicodedata')
|
|
23
|
+
|
|
24
|
+
|
|
20
25
|
##
|
|
21
26
|
|
|
22
27
|
|
|
28
|
+
IdentTokenKind: ta.TypeAlias = ta.Literal['IDENT']
|
|
29
|
+
|
|
23
30
|
ValueTokenKind: ta.TypeAlias = ta.Literal[
|
|
24
31
|
'STRING',
|
|
25
32
|
'NUMBER',
|
|
26
|
-
|
|
27
|
-
'SPECIAL_NUMBER',
|
|
28
|
-
'BOOLEAN',
|
|
29
|
-
'NULL',
|
|
30
33
|
]
|
|
31
34
|
|
|
32
35
|
VALUE_TOKEN_KINDS = frozenset(check.isinstance(a, str) for a in ta.get_args(ValueTokenKind))
|
|
@@ -42,10 +45,14 @@ ControlTokenKind: ta.TypeAlias = ta.Literal[
|
|
|
42
45
|
|
|
43
46
|
SpaceTokenKind: ta.TypeAlias = ta.Literal['SPACE']
|
|
44
47
|
|
|
48
|
+
CommentTokenKind: ta.TypeAlias = ta.Literal['COMMENT']
|
|
49
|
+
|
|
45
50
|
TokenKind: ta.TypeAlias = ta.Union[ # noqa
|
|
51
|
+
IdentTokenKind,
|
|
46
52
|
ValueTokenKind,
|
|
47
53
|
ControlTokenKind,
|
|
48
54
|
SpaceTokenKind,
|
|
55
|
+
CommentTokenKind,
|
|
49
56
|
]
|
|
50
57
|
|
|
51
58
|
|
|
@@ -90,16 +97,51 @@ CONTROL_TOKENS: ta.Mapping[str, TokenKind] = {
|
|
|
90
97
|
':': 'COLON',
|
|
91
98
|
}
|
|
92
99
|
|
|
93
|
-
|
|
94
|
-
'NaN':
|
|
95
|
-
'
|
|
96
|
-
'
|
|
100
|
+
CONST_IDENT_VALUES: ta.Mapping[str, str | float | None] = {
|
|
101
|
+
'NaN': float('nan'),
|
|
102
|
+
'-NaN': float('-nan'), # distinguished in parsing even if indistinguishable in value
|
|
103
|
+
'Infinity': float('inf'),
|
|
104
|
+
'-Infinity': float('-inf'),
|
|
97
105
|
|
|
98
|
-
'true':
|
|
99
|
-
'false':
|
|
100
|
-
'null':
|
|
106
|
+
'true': True,
|
|
107
|
+
'false': False,
|
|
108
|
+
'null': None,
|
|
101
109
|
}
|
|
102
110
|
|
|
111
|
+
MAX_CONST_IDENT_LEN = max(map(len, CONST_IDENT_VALUES))
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
##
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
EXPANDED_SPACE_CHARS = (
|
|
118
|
+
'\u0009'
|
|
119
|
+
'\u000A'
|
|
120
|
+
'\u000B'
|
|
121
|
+
'\u000C'
|
|
122
|
+
'\u000D'
|
|
123
|
+
'\u0020'
|
|
124
|
+
'\u00A0'
|
|
125
|
+
'\u2028'
|
|
126
|
+
'\u2029'
|
|
127
|
+
'\uFEFF'
|
|
128
|
+
'\u1680'
|
|
129
|
+
'\u2000'
|
|
130
|
+
'\u2001'
|
|
131
|
+
'\u2002'
|
|
132
|
+
'\u2003'
|
|
133
|
+
'\u2004'
|
|
134
|
+
'\u2005'
|
|
135
|
+
'\u2006'
|
|
136
|
+
'\u2007'
|
|
137
|
+
'\u2008'
|
|
138
|
+
'\u2009'
|
|
139
|
+
'\u200A'
|
|
140
|
+
'\u202F'
|
|
141
|
+
'\u205F'
|
|
142
|
+
'\u3000'
|
|
143
|
+
)
|
|
144
|
+
|
|
103
145
|
|
|
104
146
|
##
|
|
105
147
|
|
|
@@ -116,11 +158,43 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
116
158
|
self,
|
|
117
159
|
*,
|
|
118
160
|
include_raw: bool = False,
|
|
161
|
+
|
|
162
|
+
allow_extended_space: bool = False,
|
|
119
163
|
include_space: bool = False,
|
|
164
|
+
|
|
165
|
+
allow_comments: bool = False,
|
|
166
|
+
include_comments: bool = False,
|
|
167
|
+
|
|
168
|
+
allow_single_quotes: bool = False,
|
|
169
|
+
string_literal_parser: ta.Callable[[str], str] | None = None,
|
|
170
|
+
|
|
171
|
+
allow_extended_number_literals: bool = False,
|
|
172
|
+
number_literal_parser: ta.Callable[[str], ta.Any] | None = None,
|
|
173
|
+
|
|
174
|
+
allow_extended_idents: bool = False,
|
|
120
175
|
) -> None:
|
|
121
176
|
self._include_raw = include_raw
|
|
177
|
+
|
|
178
|
+
self._allow_extended_space = allow_extended_space
|
|
122
179
|
self._include_space = include_space
|
|
123
180
|
|
|
181
|
+
self._allow_comments = allow_comments
|
|
182
|
+
self._include_comments = include_comments
|
|
183
|
+
|
|
184
|
+
self._allow_single_quotes = allow_single_quotes
|
|
185
|
+
if string_literal_parser is None:
|
|
186
|
+
string_literal_parser = json.loads # noqa
|
|
187
|
+
self._string_literal_parser = string_literal_parser
|
|
188
|
+
|
|
189
|
+
self._allow_extended_number_literals = allow_extended_number_literals
|
|
190
|
+
self._number_literal_parser = number_literal_parser
|
|
191
|
+
|
|
192
|
+
self._allow_extended_idents = allow_extended_idents
|
|
193
|
+
|
|
194
|
+
self._char_in_str: str | None = None
|
|
195
|
+
self._char_in_str_len: int = 0
|
|
196
|
+
self._char_in_str_pos: int = 0
|
|
197
|
+
|
|
124
198
|
self._ofs = 0
|
|
125
199
|
self._line = 1
|
|
126
200
|
self._col = 0
|
|
@@ -137,9 +211,9 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
137
211
|
self._col,
|
|
138
212
|
)
|
|
139
213
|
|
|
140
|
-
def
|
|
214
|
+
def _advance_pos(self, c: str) -> str:
|
|
141
215
|
if c and len(c) != 1:
|
|
142
|
-
raise
|
|
216
|
+
raise JsonStreamError(c)
|
|
143
217
|
|
|
144
218
|
self._ofs += 1
|
|
145
219
|
|
|
@@ -151,11 +225,37 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
151
225
|
|
|
152
226
|
return c
|
|
153
227
|
|
|
228
|
+
def _yield_char_in(self, c: str) -> str:
|
|
229
|
+
if self._char_in_str is not None:
|
|
230
|
+
raise JsonStreamError
|
|
231
|
+
|
|
232
|
+
if (cl := len(c)) > 1:
|
|
233
|
+
self._char_in_str = c
|
|
234
|
+
self._char_in_str_len = cl
|
|
235
|
+
self._char_in_str_pos = 1
|
|
236
|
+
c = c[0]
|
|
237
|
+
|
|
238
|
+
self._advance_pos(c)
|
|
239
|
+
|
|
240
|
+
return c
|
|
241
|
+
|
|
242
|
+
def _str_char_in(self) -> str | None:
|
|
243
|
+
if (s := self._char_in_str) is None:
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
if (p := self._char_in_str_pos) >= self._char_in_str_len:
|
|
247
|
+
self._char_in_str = None
|
|
248
|
+
return None
|
|
249
|
+
|
|
250
|
+
c = s[p]
|
|
251
|
+
self._char_in_str_pos += 1
|
|
252
|
+
return self._advance_pos(c)
|
|
253
|
+
|
|
154
254
|
def _make_tok(
|
|
155
255
|
self,
|
|
156
256
|
kind: TokenKind,
|
|
157
257
|
value: ScalarValue,
|
|
158
|
-
raw: str,
|
|
258
|
+
raw: str | None,
|
|
159
259
|
pos: Position,
|
|
160
260
|
) -> ta.Sequence[Token]:
|
|
161
261
|
tok = Token(
|
|
@@ -175,14 +275,19 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
175
275
|
def _raise(self, msg: str, src: Exception | None = None) -> ta.NoReturn:
|
|
176
276
|
raise JsonStreamLexError(msg, self.pos) from src
|
|
177
277
|
|
|
178
|
-
def _do_main(self):
|
|
278
|
+
def _do_main(self, peek: str | None = None):
|
|
179
279
|
while True:
|
|
180
|
-
|
|
280
|
+
if peek is not None:
|
|
281
|
+
c = peek
|
|
282
|
+
peek = None
|
|
283
|
+
else:
|
|
284
|
+
if (c := self._str_char_in()) is None: # type: ignore[assignment]
|
|
285
|
+
c = self._yield_char_in((yield None)) # noqa
|
|
181
286
|
|
|
182
287
|
if not c:
|
|
183
288
|
return None
|
|
184
289
|
|
|
185
|
-
if c.isspace():
|
|
290
|
+
if c.isspace() or (self._allow_extended_space and c in EXPANDED_SPACE_CHARS):
|
|
186
291
|
if self._include_space:
|
|
187
292
|
yield self._make_tok('SPACE', c, c, self.pos)
|
|
188
293
|
continue
|
|
@@ -191,41 +296,127 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
191
296
|
yield self._make_tok(CONTROL_TOKENS[c], c, c, self.pos)
|
|
192
297
|
continue
|
|
193
298
|
|
|
194
|
-
if c == '"':
|
|
195
|
-
return self._do_string()
|
|
299
|
+
if c == '"' or (self._allow_single_quotes and c == "'"):
|
|
300
|
+
return self._do_string(c)
|
|
196
301
|
|
|
197
|
-
if c.isdigit() or c == '-':
|
|
302
|
+
if c.isdigit() or c == '-' or (self._allow_extended_number_literals and c in '.+'):
|
|
198
303
|
return self._do_number(c)
|
|
199
304
|
|
|
305
|
+
if self._allow_comments and c == '/':
|
|
306
|
+
return self._do_comment()
|
|
307
|
+
|
|
308
|
+
if self._allow_extended_idents:
|
|
309
|
+
return self._do_extended_ident(c)
|
|
310
|
+
|
|
200
311
|
if c in 'tfnIN':
|
|
201
312
|
return self._do_const(c)
|
|
202
313
|
|
|
203
314
|
self._raise(f'Unexpected character: {c}')
|
|
204
315
|
|
|
205
|
-
def _do_string(self):
|
|
316
|
+
def _do_string(self, q: str):
|
|
206
317
|
check.state(self._buf.tell() == 0)
|
|
207
|
-
self._buf.write(
|
|
318
|
+
self._buf.write(q)
|
|
208
319
|
|
|
209
320
|
pos = self.pos
|
|
210
321
|
|
|
322
|
+
#
|
|
323
|
+
|
|
324
|
+
buf = self._buf
|
|
325
|
+
|
|
326
|
+
char_in_str = self._char_in_str
|
|
327
|
+
char_in_str_len = self._char_in_str_len
|
|
328
|
+
char_in_str_pos = self._char_in_str_pos
|
|
329
|
+
ofs = self._ofs
|
|
330
|
+
line = self._line
|
|
331
|
+
col = self._col
|
|
332
|
+
|
|
333
|
+
def restore_state():
|
|
334
|
+
self._char_in_str = char_in_str
|
|
335
|
+
self._char_in_str_len = char_in_str_len
|
|
336
|
+
self._char_in_str_pos = char_in_str_pos
|
|
337
|
+
self._ofs = ofs
|
|
338
|
+
self._line = line
|
|
339
|
+
self._col = col
|
|
340
|
+
|
|
211
341
|
last = None
|
|
212
342
|
while True:
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
343
|
+
c: str | None = None
|
|
344
|
+
|
|
345
|
+
while True:
|
|
346
|
+
if char_in_str is not None:
|
|
347
|
+
if char_in_str_pos >= char_in_str_len:
|
|
348
|
+
char_in_str = None
|
|
349
|
+
continue
|
|
350
|
+
|
|
351
|
+
skip_to = char_in_str_len
|
|
352
|
+
if (qp := char_in_str.find(q, char_in_str_pos)) >= 0 and qp < skip_to:
|
|
353
|
+
skip_to = qp
|
|
354
|
+
if (sp := char_in_str.find('\\', char_in_str_pos)) >= 0 and sp < skip_to:
|
|
355
|
+
skip_to = sp
|
|
356
|
+
|
|
357
|
+
if skip_to != char_in_str_pos:
|
|
358
|
+
ofs += skip_to - char_in_str_pos
|
|
359
|
+
if (np := char_in_str.rfind('\n', char_in_str_pos, skip_to)) >= 0:
|
|
360
|
+
line += char_in_str.count('\n', char_in_str_pos, skip_to)
|
|
361
|
+
col = np - char_in_str_pos
|
|
362
|
+
else:
|
|
363
|
+
col += skip_to - char_in_str_pos
|
|
364
|
+
buf.write(char_in_str[char_in_str_pos:skip_to])
|
|
365
|
+
|
|
366
|
+
if skip_to >= char_in_str_len:
|
|
367
|
+
char_in_str = None
|
|
368
|
+
continue
|
|
369
|
+
char_in_str_pos = skip_to
|
|
370
|
+
|
|
371
|
+
c = char_in_str[char_in_str_pos]
|
|
372
|
+
char_in_str_pos += 1
|
|
373
|
+
|
|
374
|
+
if c is None:
|
|
375
|
+
try:
|
|
376
|
+
c = (yield None)
|
|
377
|
+
except GeneratorExit:
|
|
378
|
+
restore_state()
|
|
379
|
+
self._raise('Unexpected end of input')
|
|
380
|
+
|
|
381
|
+
if len(c) > 1:
|
|
382
|
+
char_in_str = c
|
|
383
|
+
char_in_str_len = len(char_in_str)
|
|
384
|
+
char_in_str_pos = 0
|
|
385
|
+
c = None
|
|
386
|
+
continue
|
|
387
|
+
|
|
388
|
+
if c is None:
|
|
389
|
+
raise JsonStreamError
|
|
390
|
+
|
|
391
|
+
if c and len(c) != 1:
|
|
392
|
+
raise JsonStreamError(c)
|
|
393
|
+
|
|
394
|
+
break
|
|
395
|
+
|
|
396
|
+
ofs += 1
|
|
397
|
+
|
|
398
|
+
if c == '\n':
|
|
399
|
+
line += 1
|
|
400
|
+
col = 0
|
|
401
|
+
else:
|
|
402
|
+
col += 1
|
|
217
403
|
|
|
218
404
|
if not c:
|
|
219
|
-
|
|
405
|
+
restore_state()
|
|
406
|
+
self._raise(f'Unterminated string literal: {buf.getvalue()}')
|
|
220
407
|
|
|
221
|
-
|
|
222
|
-
if c ==
|
|
408
|
+
buf.write(c)
|
|
409
|
+
if c == q and last != '\\':
|
|
223
410
|
break
|
|
224
411
|
last = c
|
|
225
412
|
|
|
413
|
+
restore_state()
|
|
414
|
+
|
|
415
|
+
#
|
|
416
|
+
|
|
226
417
|
raw = self._flip_buf()
|
|
227
418
|
try:
|
|
228
|
-
sv =
|
|
419
|
+
sv = self._string_literal_parser(raw)
|
|
229
420
|
except json.JSONDecodeError as e:
|
|
230
421
|
self._raise(f'Invalid string literal: {raw!r}', e)
|
|
231
422
|
|
|
@@ -241,14 +432,15 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
241
432
|
|
|
242
433
|
while True:
|
|
243
434
|
try:
|
|
244
|
-
c
|
|
435
|
+
if (c := self._str_char_in()) is None: # type: ignore[assignment]
|
|
436
|
+
c = self._yield_char_in((yield None)) # noqa
|
|
245
437
|
except GeneratorExit:
|
|
246
438
|
self._raise('Unexpected end of input')
|
|
247
439
|
|
|
248
440
|
if not c:
|
|
249
441
|
break
|
|
250
442
|
|
|
251
|
-
if not (c.isdigit() or c in '.eE+-'):
|
|
443
|
+
if not (c.isdigit() or c in '.eE+-' or (self._allow_extended_number_literals and c in 'xXabcdefABCDEF')):
|
|
252
444
|
break
|
|
253
445
|
self._buf.write(c)
|
|
254
446
|
|
|
@@ -256,33 +448,59 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
256
448
|
|
|
257
449
|
#
|
|
258
450
|
|
|
259
|
-
if
|
|
260
|
-
|
|
451
|
+
if self._allow_extended_number_literals:
|
|
452
|
+
p = 1 if raw[0] in '+-' else 0
|
|
453
|
+
if (len(raw) - p) > 1 and raw[p] == '0' and raw[p + 1].isdigit():
|
|
454
|
+
self._raise('Invalid number literal')
|
|
261
455
|
|
|
262
|
-
|
|
263
|
-
|
|
456
|
+
if raw == '-' or (self._allow_extended_number_literals and raw == '+'):
|
|
457
|
+
for svs in [
|
|
458
|
+
'Infinity',
|
|
459
|
+
*(['NaN'] if self._allow_extended_number_literals else []),
|
|
460
|
+
]:
|
|
461
|
+
if c != svs[0]:
|
|
462
|
+
continue
|
|
264
463
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
for _ in range(7):
|
|
268
|
-
raw += self._char_in((yield None)) # noqa
|
|
269
|
-
except GeneratorExit:
|
|
270
|
-
self._raise('Unexpected end of input')
|
|
464
|
+
if not c:
|
|
465
|
+
self._raise('Unexpected end of input')
|
|
271
466
|
|
|
272
|
-
|
|
273
|
-
|
|
467
|
+
raw += c
|
|
468
|
+
try:
|
|
469
|
+
for _ in range(len(svs) - 1):
|
|
470
|
+
if (c := self._str_char_in()) is None: # type: ignore[assignment]
|
|
471
|
+
c = self._yield_char_in((yield None)) # noqa
|
|
472
|
+
if not c:
|
|
473
|
+
break
|
|
474
|
+
raw += c
|
|
475
|
+
except GeneratorExit:
|
|
476
|
+
self._raise('Unexpected end of input')
|
|
477
|
+
|
|
478
|
+
if raw[1:] != svs:
|
|
479
|
+
self._raise(f'Invalid number format: {raw}')
|
|
274
480
|
|
|
275
|
-
|
|
276
|
-
|
|
481
|
+
if raw[0] == '+':
|
|
482
|
+
raw = raw[1:]
|
|
277
483
|
|
|
278
|
-
|
|
484
|
+
yield self._make_tok('IDENT', raw, raw, pos)
|
|
485
|
+
|
|
486
|
+
return self._do_main()
|
|
279
487
|
|
|
280
488
|
#
|
|
281
489
|
|
|
282
|
-
|
|
283
|
-
|
|
490
|
+
nv: ta.Any
|
|
491
|
+
|
|
492
|
+
if (np := self._number_literal_parser) is not None:
|
|
493
|
+
nv = np(raw)
|
|
494
|
+
|
|
284
495
|
else:
|
|
285
|
-
|
|
496
|
+
if not NUMBER_PAT.fullmatch(raw):
|
|
497
|
+
self._raise(f'Invalid number format: {raw}')
|
|
498
|
+
|
|
499
|
+
if '.' in raw or 'e' in raw or 'E' in raw:
|
|
500
|
+
nv = float(raw)
|
|
501
|
+
else:
|
|
502
|
+
nv = int(raw)
|
|
503
|
+
|
|
286
504
|
yield self._make_tok('NUMBER', nv, raw, pos)
|
|
287
505
|
|
|
288
506
|
#
|
|
@@ -290,34 +508,150 @@ class JsonStreamLexer(GenMachine[str, Token]):
|
|
|
290
508
|
if not c:
|
|
291
509
|
return None
|
|
292
510
|
|
|
293
|
-
|
|
294
|
-
yield self._make_tok(CONTROL_TOKENS[c], c, c, pos)
|
|
511
|
+
return self._do_main(c)
|
|
295
512
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
513
|
+
def _do_const(self, c: str):
|
|
514
|
+
pos = self.pos
|
|
515
|
+
raw = c
|
|
516
|
+
while True:
|
|
517
|
+
try:
|
|
518
|
+
if (c := self._str_char_in()) is None: # type: ignore[assignment]
|
|
519
|
+
c = self._yield_char_in((yield None)) # noqa
|
|
520
|
+
except GeneratorExit:
|
|
521
|
+
self._raise('Unexpected end of input')
|
|
299
522
|
|
|
300
|
-
|
|
301
|
-
|
|
523
|
+
raw += c
|
|
524
|
+
|
|
525
|
+
if raw in CONST_IDENT_VALUES:
|
|
526
|
+
break
|
|
527
|
+
|
|
528
|
+
if len(raw) > MAX_CONST_IDENT_LEN:
|
|
529
|
+
self._raise(f'Invalid literal: {raw}')
|
|
530
|
+
|
|
531
|
+
yield self._make_tok('IDENT', raw, raw, pos)
|
|
302
532
|
|
|
303
533
|
return self._do_main()
|
|
304
534
|
|
|
305
|
-
def
|
|
535
|
+
def _do_unicode_escape(self):
|
|
536
|
+
try:
|
|
537
|
+
if (c := self._str_char_in()) is None:
|
|
538
|
+
c = self._yield_char_in((yield None)) # noqa
|
|
539
|
+
except GeneratorExit:
|
|
540
|
+
self._raise('Unexpected end of input')
|
|
541
|
+
|
|
542
|
+
if c != 'u':
|
|
543
|
+
self._raise('Illegal identifier escape')
|
|
544
|
+
|
|
545
|
+
ux = []
|
|
546
|
+
for _ in range(4):
|
|
547
|
+
try:
|
|
548
|
+
if (c := self._str_char_in()) is None:
|
|
549
|
+
c = self._yield_char_in((yield None)) # noqa
|
|
550
|
+
except GeneratorExit:
|
|
551
|
+
self._raise('Unexpected end of input')
|
|
552
|
+
|
|
553
|
+
if c not in '0123456789abcdefABCDEF':
|
|
554
|
+
self._raise('Illegal identifier escape')
|
|
555
|
+
|
|
556
|
+
ux.append(c)
|
|
557
|
+
|
|
558
|
+
return chr(int(''.join(ux), 16))
|
|
559
|
+
|
|
560
|
+
def _do_extended_ident(self, c: str):
|
|
561
|
+
check.state(self._buf.tell() == 0)
|
|
562
|
+
|
|
563
|
+
if c == '\\':
|
|
564
|
+
c = yield from self._do_unicode_escape()
|
|
565
|
+
|
|
566
|
+
elif not (c in '$_' or unicodedata.category(c).startswith('L')):
|
|
567
|
+
self._raise('Illegal identifier start')
|
|
568
|
+
|
|
569
|
+
self._buf.write(c)
|
|
570
|
+
|
|
306
571
|
pos = self.pos
|
|
307
|
-
|
|
572
|
+
|
|
308
573
|
while True:
|
|
309
574
|
try:
|
|
310
|
-
|
|
575
|
+
if (c := self._str_char_in()) is None: # type: ignore[assignment]
|
|
576
|
+
c = self._yield_char_in((yield None)) # noqa
|
|
311
577
|
except GeneratorExit:
|
|
312
578
|
self._raise('Unexpected end of input')
|
|
313
579
|
|
|
314
|
-
if
|
|
580
|
+
if c == '\\':
|
|
581
|
+
c = yield from self._do_unicode_escape()
|
|
582
|
+
self._buf.write(c)
|
|
583
|
+
continue
|
|
584
|
+
|
|
585
|
+
if not c:
|
|
315
586
|
break
|
|
316
587
|
|
|
317
|
-
if
|
|
318
|
-
|
|
588
|
+
if c not in '$_\u200C\u200D':
|
|
589
|
+
uc = unicodedata.category(c)
|
|
590
|
+
if not (uc.startswith(('L', 'M', 'N')) or uc == 'Pc'):
|
|
591
|
+
break
|
|
592
|
+
|
|
593
|
+
self._buf.write(c)
|
|
594
|
+
|
|
595
|
+
raw = self._flip_buf()
|
|
596
|
+
|
|
597
|
+
yield self._make_tok('IDENT', raw, raw, pos)
|
|
319
598
|
|
|
320
|
-
|
|
321
|
-
|
|
599
|
+
return self._do_main(c)
|
|
600
|
+
|
|
601
|
+
def _do_comment(self):
|
|
602
|
+
check.state(self._buf.tell() == 0)
|
|
603
|
+
|
|
604
|
+
pos = self.pos
|
|
605
|
+
try:
|
|
606
|
+
if (oc := self._str_char_in()) is None:
|
|
607
|
+
oc = self._yield_char_in((yield None)) # noqa
|
|
608
|
+
except GeneratorExit:
|
|
609
|
+
self._raise('Unexpected end of input')
|
|
610
|
+
|
|
611
|
+
if oc == '/':
|
|
612
|
+
while True:
|
|
613
|
+
try:
|
|
614
|
+
if (ic := self._str_char_in()) is None:
|
|
615
|
+
ic = self._yield_char_in((yield None)) # noqa
|
|
616
|
+
except GeneratorExit:
|
|
617
|
+
self._raise('Unexpected end of input')
|
|
618
|
+
|
|
619
|
+
if not ic or ic == '\n':
|
|
620
|
+
break
|
|
621
|
+
|
|
622
|
+
if self._include_comments:
|
|
623
|
+
self._buf.write(ic)
|
|
624
|
+
|
|
625
|
+
if self._include_comments:
|
|
626
|
+
cmt = self._flip_buf()
|
|
627
|
+
raw = f'//{cmt}\n' if self._include_raw else None
|
|
628
|
+
yield self._make_tok('COMMENT', cmt, raw, pos)
|
|
629
|
+
|
|
630
|
+
if not ic:
|
|
631
|
+
return
|
|
632
|
+
|
|
633
|
+
elif oc == '*':
|
|
634
|
+
lc: str | None = None
|
|
635
|
+
while True:
|
|
636
|
+
try:
|
|
637
|
+
if (ic := self._str_char_in()) is None:
|
|
638
|
+
ic = self._yield_char_in((yield None)) # noqa
|
|
639
|
+
except GeneratorExit:
|
|
640
|
+
self._raise('Unexpected end of input')
|
|
641
|
+
|
|
642
|
+
if lc == '*' and ic == '/':
|
|
643
|
+
break
|
|
644
|
+
|
|
645
|
+
if lc is not None and self._include_comments:
|
|
646
|
+
self._buf.write(lc)
|
|
647
|
+
lc = ic
|
|
648
|
+
|
|
649
|
+
if self._include_comments:
|
|
650
|
+
cmt = self._flip_buf()
|
|
651
|
+
raw = f'/*{cmt}*/' if self._include_raw else None
|
|
652
|
+
yield self._make_tok('COMMENT', cmt, raw, pos)
|
|
653
|
+
|
|
654
|
+
else:
|
|
655
|
+
self._raise(f'Unexpected character after comment start: {oc}')
|
|
322
656
|
|
|
323
657
|
return self._do_main()
|