omextra 0.0.0.dev423__py3-none-any.whl → 0.0.0.dev425__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.
- omextra/.omlish-manifests.json +14 -0
- omextra/__about__.py +3 -1
- omextra/defs.py +216 -0
- omextra/dynamic.py +219 -0
- omextra/formats/__init__.py +0 -0
- omextra/formats/json/Json.g4 +77 -0
- omextra/formats/json/__init__.py +0 -0
- omextra/formats/json/_antlr/JsonLexer.py +109 -0
- omextra/formats/json/_antlr/JsonListener.py +61 -0
- omextra/formats/json/_antlr/JsonParser.py +457 -0
- omextra/formats/json/_antlr/JsonVisitor.py +42 -0
- omextra/formats/json/_antlr/__init__.py +0 -0
- omextra/io/__init__.py +0 -0
- omextra/io/trampoline.py +289 -0
- omextra/specs/__init__.py +0 -0
- omextra/specs/irc/__init__.py +0 -0
- omextra/specs/irc/messages/__init__.py +0 -0
- omextra/specs/irc/messages/base.py +50 -0
- omextra/specs/irc/messages/formats.py +92 -0
- omextra/specs/irc/messages/messages.py +775 -0
- omextra/specs/irc/messages/parsing.py +99 -0
- omextra/specs/irc/numerics/__init__.py +0 -0
- omextra/specs/irc/numerics/formats.py +97 -0
- omextra/specs/irc/numerics/numerics.py +865 -0
- omextra/specs/irc/numerics/types.py +59 -0
- omextra/specs/irc/protocol/LICENSE +11 -0
- omextra/specs/irc/protocol/__init__.py +61 -0
- omextra/specs/irc/protocol/consts.py +6 -0
- omextra/specs/irc/protocol/errors.py +30 -0
- omextra/specs/irc/protocol/message.py +21 -0
- omextra/specs/irc/protocol/nuh.py +55 -0
- omextra/specs/irc/protocol/parsing.py +158 -0
- omextra/specs/irc/protocol/rendering.py +153 -0
- omextra/specs/irc/protocol/tags.py +102 -0
- omextra/specs/irc/protocol/utils.py +30 -0
- omextra/specs/proto/Protobuf3.g4 +396 -0
- omextra/specs/proto/__init__.py +0 -0
- omextra/specs/proto/_antlr/Protobuf3Lexer.py +340 -0
- omextra/specs/proto/_antlr/Protobuf3Listener.py +448 -0
- omextra/specs/proto/_antlr/Protobuf3Parser.py +3909 -0
- omextra/specs/proto/_antlr/Protobuf3Visitor.py +257 -0
- omextra/specs/proto/_antlr/__init__.py +0 -0
- omextra/specs/proto/nodes.py +54 -0
- omextra/specs/proto/parsing.py +98 -0
- omextra/sql/__init__.py +0 -0
- omextra/sql/parsing/Minisql.g4 +292 -0
- omextra/sql/parsing/__init__.py +0 -0
- omextra/sql/parsing/_antlr/MinisqlLexer.py +322 -0
- omextra/sql/parsing/_antlr/MinisqlListener.py +511 -0
- omextra/sql/parsing/_antlr/MinisqlParser.py +3763 -0
- omextra/sql/parsing/_antlr/MinisqlVisitor.py +292 -0
- omextra/sql/parsing/_antlr/__init__.py +0 -0
- omextra/sql/parsing/parsing.py +120 -0
- omextra/text/__init__.py +0 -0
- omextra/text/antlr/__init__.py +0 -0
- omextra/text/antlr/cli/__init__.py +0 -0
- omextra/text/antlr/cli/__main__.py +11 -0
- omextra/text/antlr/cli/cli.py +62 -0
- omextra/text/antlr/cli/consts.py +7 -0
- omextra/text/antlr/cli/gen.py +188 -0
- {omextra-0.0.0.dev423.dist-info → omextra-0.0.0.dev425.dist-info}/METADATA +2 -3
- omextra-0.0.0.dev425.dist-info/RECORD +67 -0
- omextra/.manifests.json +0 -1
- omextra-0.0.0.dev423.dist-info/RECORD +0 -9
- {omextra-0.0.0.dev423.dist-info → omextra-0.0.0.dev425.dist-info}/WHEEL +0 -0
- {omextra-0.0.0.dev423.dist-info → omextra-0.0.0.dev425.dist-info}/entry_points.txt +0 -0
- {omextra-0.0.0.dev423.dist-info → omextra-0.0.0.dev425.dist-info}/licenses/LICENSE +0 -0
- {omextra-0.0.0.dev423.dist-info → omextra-0.0.0.dev425.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"module": ".text.antlr.cli.__main__",
|
4
|
+
"attr": "_CLI_MODULE",
|
5
|
+
"file": "omextra/text/antlr/cli/__main__.py",
|
6
|
+
"line": 4,
|
7
|
+
"value": {
|
8
|
+
"!omdev.cli.types.CliModule": {
|
9
|
+
"name": "antlr",
|
10
|
+
"module": "omextra.text.antlr.cli.__main__"
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
14
|
+
]
|
omextra/__about__.py
CHANGED
@@ -8,7 +8,9 @@ class Project(ProjectBase):
|
|
8
8
|
description = 'omextra'
|
9
9
|
|
10
10
|
dependencies = [
|
11
|
-
|
11
|
+
# FIXME: text.antlr.cli deps omdev.cache.data, yet this lib is 'under' omdev.
|
12
|
+
# f'omdev == {__version__}',
|
13
|
+
|
12
14
|
f'omlish == {__version__}',
|
13
15
|
]
|
14
16
|
|
omextra/defs.py
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
"""
|
2
|
+
A self-awarely unpythonic set of helpers for defining common boilerplate methods (repr, hash_eq, delegates, etc) in
|
3
|
+
class definitions. Should be used sparingly for methods not directly used by humans (like repr) - @property's should
|
4
|
+
remain @property's for type annotation, tool assistance, debugging, and otherwise, but these are still nice to have in
|
5
|
+
certain circumstances (the real-world alternative usually being simply not adding them).
|
6
|
+
"""
|
7
|
+
# ruff: noqa: ANN201
|
8
|
+
import abc
|
9
|
+
import functools
|
10
|
+
import operator
|
11
|
+
import threading
|
12
|
+
|
13
|
+
from omlish import lang
|
14
|
+
|
15
|
+
|
16
|
+
##
|
17
|
+
|
18
|
+
|
19
|
+
_repr = repr
|
20
|
+
|
21
|
+
BASICS = {}
|
22
|
+
|
23
|
+
|
24
|
+
def _basic(fn):
|
25
|
+
if fn.__name__ in BASICS:
|
26
|
+
raise NameError(fn.__name__)
|
27
|
+
|
28
|
+
BASICS[fn.__name__] = fn
|
29
|
+
return fn
|
30
|
+
|
31
|
+
|
32
|
+
@lang.cls_dct_fn()
|
33
|
+
def basic(cls_dct, *attrs, basics=None):
|
34
|
+
if basics is None:
|
35
|
+
basics = BASICS.keys()
|
36
|
+
|
37
|
+
for k in basics:
|
38
|
+
fn = BASICS[k]
|
39
|
+
fn(*attrs, cls_dct=cls_dct)
|
40
|
+
|
41
|
+
|
42
|
+
_REPR_SEEN = threading.local()
|
43
|
+
|
44
|
+
|
45
|
+
def _repr_guard(fn):
|
46
|
+
@functools.wraps(fn)
|
47
|
+
def inner(obj, *args, **kwargs):
|
48
|
+
try:
|
49
|
+
ids = _REPR_SEEN.ids
|
50
|
+
|
51
|
+
except AttributeError:
|
52
|
+
ids = _REPR_SEEN.ids = set()
|
53
|
+
try:
|
54
|
+
ids.add(id(obj))
|
55
|
+
return fn(obj, *args, **kwargs)
|
56
|
+
finally:
|
57
|
+
del _REPR_SEEN.ids
|
58
|
+
|
59
|
+
else:
|
60
|
+
if id(obj) in ids:
|
61
|
+
return f'<seen:{type(obj).__name__}@{hex(id(obj))[2:]}>'
|
62
|
+
ids.add(id(obj))
|
63
|
+
return fn(obj, *args, **kwargs)
|
64
|
+
|
65
|
+
return inner
|
66
|
+
|
67
|
+
|
68
|
+
@_repr_guard
|
69
|
+
def build_attr_repr(obj, *, mro=False):
|
70
|
+
if mro:
|
71
|
+
attrs = [
|
72
|
+
attr
|
73
|
+
for ty in sorted( # noqa
|
74
|
+
reversed(type(obj).__mro__),
|
75
|
+
key=lambda _ty: _ty.__dict__.get('__repr_priority__', 0),
|
76
|
+
)
|
77
|
+
for attr in ty.__dict__.get('__repr_attrs__', [])
|
78
|
+
]
|
79
|
+
|
80
|
+
else:
|
81
|
+
attrs = obj.__repr_attrs__
|
82
|
+
|
83
|
+
s = ', '.join(f'{a}={"<self>" if v is obj else _repr(v)}' for a in attrs for v in [getattr(obj, a)])
|
84
|
+
return f'{type(obj).__name__}@{hex(id(obj))[2:]}({s})'
|
85
|
+
|
86
|
+
|
87
|
+
@_repr_guard
|
88
|
+
def build_repr(obj, *attrs):
|
89
|
+
return (
|
90
|
+
f'{type(obj).__name__}'
|
91
|
+
f'@{hex(id(obj))[2:]}'
|
92
|
+
f'({", ".join(f"{attr}={getattr(obj, attr)!r}" for attr in attrs)})'
|
93
|
+
)
|
94
|
+
|
95
|
+
|
96
|
+
@_basic
|
97
|
+
@lang.cls_dct_fn()
|
98
|
+
def repr(cls_dct, *attrs, mro=False, priority=None): # noqa
|
99
|
+
def __repr__(self): # noqa
|
100
|
+
return build_attr_repr(self, mro=mro)
|
101
|
+
|
102
|
+
cls_dct['__repr_attrs__'] = attrs
|
103
|
+
if priority is not None:
|
104
|
+
cls_dct['__repr_priority__'] = priority
|
105
|
+
|
106
|
+
cls_dct['__repr__'] = __repr__
|
107
|
+
|
108
|
+
|
109
|
+
@lang.cls_dct_fn()
|
110
|
+
def bare_repr(cls_dct, *attrs):
|
111
|
+
def __repr__(self): # noqa
|
112
|
+
return lang.attr_repr(self, *attrs)
|
113
|
+
|
114
|
+
cls_dct['__repr__'] = __repr__
|
115
|
+
|
116
|
+
|
117
|
+
@lang.cls_dct_fn()
|
118
|
+
def name_repr(cls_dct):
|
119
|
+
def __repr__(self): # noqa
|
120
|
+
return self.__name__
|
121
|
+
|
122
|
+
cls_dct['__repr__'] = __repr__
|
123
|
+
|
124
|
+
|
125
|
+
@lang.cls_dct_fn()
|
126
|
+
def ne(cls_dct):
|
127
|
+
def __ne__(self, other): # noqa
|
128
|
+
return not (self == other)
|
129
|
+
|
130
|
+
cls_dct['__ne__'] = __ne__
|
131
|
+
|
132
|
+
|
133
|
+
@lang.cls_dct_fn()
|
134
|
+
def no_order(cls_dct, *, raise_=None):
|
135
|
+
def fn(self, other):
|
136
|
+
if raise_ is None:
|
137
|
+
return NotImplemented
|
138
|
+
else:
|
139
|
+
raise raise_
|
140
|
+
|
141
|
+
for att in [
|
142
|
+
'__lt__',
|
143
|
+
'__le__',
|
144
|
+
'__gt__',
|
145
|
+
'__ge__',
|
146
|
+
]:
|
147
|
+
cls_dct[att] = fn
|
148
|
+
|
149
|
+
|
150
|
+
@_basic
|
151
|
+
@lang.cls_dct_fn()
|
152
|
+
def hash_eq(cls_dct, *attrs):
|
153
|
+
def __hash__(self): # noqa
|
154
|
+
return hash(tuple(getattr(self, attr) for attr in attrs))
|
155
|
+
|
156
|
+
cls_dct['__hash__'] = __hash__
|
157
|
+
|
158
|
+
def __eq__(self, other): # noqa
|
159
|
+
if type(other) is not type(self):
|
160
|
+
return False
|
161
|
+
|
162
|
+
for attr in attrs: # noqa
|
163
|
+
if getattr(self, attr) != getattr(other, attr):
|
164
|
+
return False
|
165
|
+
|
166
|
+
return True
|
167
|
+
|
168
|
+
cls_dct['__eq__'] = __eq__
|
169
|
+
|
170
|
+
ne(cls_dct=cls_dct)
|
171
|
+
|
172
|
+
|
173
|
+
@lang.cls_dct_fn()
|
174
|
+
def getter(cls_dct, *attrs):
|
175
|
+
for attr in attrs:
|
176
|
+
cls_dct[attr] = property(operator.attrgetter('_' + attr))
|
177
|
+
|
178
|
+
|
179
|
+
@lang.cls_dct_fn()
|
180
|
+
def not_implemented(cls_dct, *names, **kwargs):
|
181
|
+
wrapper = kwargs.pop('wrapper', lambda _: _)
|
182
|
+
if kwargs:
|
183
|
+
raise TypeError(kwargs)
|
184
|
+
|
185
|
+
ret = []
|
186
|
+
for name in names:
|
187
|
+
@wrapper
|
188
|
+
def not_implemented(self, *args, **kwargs):
|
189
|
+
raise NotImplementedError
|
190
|
+
|
191
|
+
not_implemented.__name__ = name
|
192
|
+
cls_dct[name] = not_implemented
|
193
|
+
ret.append(not_implemented)
|
194
|
+
|
195
|
+
return tuple(ret)
|
196
|
+
|
197
|
+
|
198
|
+
@lang.cls_dct_fn()
|
199
|
+
def abstract_method(cls_dct, *names):
|
200
|
+
return not_implemented(cls_dct, *names, wrapper=abc.abstractmethod)
|
201
|
+
|
202
|
+
|
203
|
+
@lang.cls_dct_fn()
|
204
|
+
def abstract_property(cls_dct, *names):
|
205
|
+
return not_implemented(cls_dct, *names, wrapper=lambda o: property(abc.abstractmethod(o)))
|
206
|
+
|
207
|
+
|
208
|
+
@lang.cls_dct_fn()
|
209
|
+
def abstract_hash_eq(cls_dct):
|
210
|
+
return not_implemented(
|
211
|
+
cls_dct,
|
212
|
+
'__hash__',
|
213
|
+
'__eq__',
|
214
|
+
'__ne__',
|
215
|
+
wrapper=abc.abstractmethod,
|
216
|
+
)
|
omextra/dynamic.py
ADDED
@@ -0,0 +1,219 @@
|
|
1
|
+
"""
|
2
|
+
Dynamically scoped variables (implemented by stackwalking). Unlike threadlocals these are generator-correct both in
|
3
|
+
binding and retrieval, and unlike ContextVars they require no manual context management. They are however *slow* and
|
4
|
+
should be used sparingly (once per sql statement executed not once per inner function call).
|
5
|
+
|
6
|
+
TODO:
|
7
|
+
- clj-style binding conveyance
|
8
|
+
- contextvar/async interop
|
9
|
+
- 'partializer'
|
10
|
+
"""
|
11
|
+
import contextlib
|
12
|
+
import functools
|
13
|
+
import sys
|
14
|
+
import types
|
15
|
+
import typing as ta
|
16
|
+
import weakref
|
17
|
+
|
18
|
+
from omlish import lang
|
19
|
+
|
20
|
+
|
21
|
+
T = ta.TypeVar('T')
|
22
|
+
|
23
|
+
|
24
|
+
##
|
25
|
+
|
26
|
+
|
27
|
+
_HOISTED_CODE_DEPTH: ta.MutableMapping[types.CodeType, int] = weakref.WeakKeyDictionary()
|
28
|
+
_MAX_HOIST_DEPTH = 0
|
29
|
+
|
30
|
+
|
31
|
+
def hoist(depth=0): # noqa
|
32
|
+
def inner(fn):
|
33
|
+
_HOISTED_CODE_DEPTH[fn.__code__] = depth
|
34
|
+
global _MAX_HOIST_DEPTH
|
35
|
+
_MAX_HOIST_DEPTH = max(_MAX_HOIST_DEPTH, depth)
|
36
|
+
return fn
|
37
|
+
return inner
|
38
|
+
|
39
|
+
|
40
|
+
hoist()(contextlib.ExitStack.enter_context) # noqa
|
41
|
+
|
42
|
+
|
43
|
+
class MISSING(lang.Marker):
|
44
|
+
pass
|
45
|
+
|
46
|
+
|
47
|
+
class UnboundVarError(ValueError):
|
48
|
+
pass
|
49
|
+
|
50
|
+
|
51
|
+
class Var(ta.Generic[T]):
|
52
|
+
def __init__(
|
53
|
+
self,
|
54
|
+
default: type[MISSING] | T = MISSING,
|
55
|
+
*,
|
56
|
+
new: ta.Callable[[], T] | type[MISSING] = MISSING,
|
57
|
+
validate: ta.Callable[[T], None] | None = None,
|
58
|
+
) -> None:
|
59
|
+
super().__init__()
|
60
|
+
|
61
|
+
if default is not MISSING and new is not MISSING:
|
62
|
+
raise TypeError('Cannot set both default and new')
|
63
|
+
elif default is not MISSING:
|
64
|
+
new = lambda: default # type: ignore
|
65
|
+
self._new: type[MISSING] | ta.Callable[[], T] = new
|
66
|
+
self._validate = validate
|
67
|
+
self._bindings_by_frame: ta.MutableMapping[types.FrameType, ta.MutableMapping[int, Binding]] = weakref.WeakValueDictionary() # noqa
|
68
|
+
|
69
|
+
@ta.overload
|
70
|
+
def __call__(self) -> T:
|
71
|
+
...
|
72
|
+
|
73
|
+
@ta.overload
|
74
|
+
def __call__(self, value: T, **kwargs: ta.Any) -> ta.ContextManager[T]:
|
75
|
+
...
|
76
|
+
|
77
|
+
def __call__(self, *args, **kwargs):
|
78
|
+
if not args:
|
79
|
+
if kwargs:
|
80
|
+
raise TypeError(kwargs)
|
81
|
+
return self.value
|
82
|
+
elif len(args) == 1:
|
83
|
+
return self.binding(*args, **kwargs)
|
84
|
+
else:
|
85
|
+
raise TypeError(args)
|
86
|
+
|
87
|
+
def binding(self, value: T, *, offset: int = 0) -> ta.ContextManager[T]:
|
88
|
+
if self._validate is not None:
|
89
|
+
self._validate(self.value)
|
90
|
+
return Binding(self, value, offset=offset)
|
91
|
+
|
92
|
+
def with_binding(self, value): # noqa
|
93
|
+
def outer(fn):
|
94
|
+
@functools.wraps(fn)
|
95
|
+
def inner(*args, **kwargs):
|
96
|
+
with self.binding(value):
|
97
|
+
return fn(*args, **kwargs)
|
98
|
+
return inner
|
99
|
+
return outer
|
100
|
+
|
101
|
+
def with_binding_fn(self, binding_fn): # noqa
|
102
|
+
this = self
|
103
|
+
|
104
|
+
def outer(fn):
|
105
|
+
class Descriptor:
|
106
|
+
@staticmethod
|
107
|
+
@functools.wraps(fn)
|
108
|
+
def __call__(*args, **kwargs): # noqa
|
109
|
+
with this.binding(binding_fn(*args, **kwargs)):
|
110
|
+
return fn(*args, **kwargs)
|
111
|
+
|
112
|
+
def __get__(self, obj, cls=None):
|
113
|
+
bound_binding_fn = binding_fn.__get__(obj, cls)
|
114
|
+
bound_fn = fn.__get__(obj, cls)
|
115
|
+
|
116
|
+
@functools.wraps(fn)
|
117
|
+
def inner(*args, **kwargs):
|
118
|
+
with this.binding(bound_binding_fn(*args, **kwargs)):
|
119
|
+
return bound_fn(*args, **kwargs)
|
120
|
+
|
121
|
+
return inner
|
122
|
+
|
123
|
+
dct: dict[str, ta.Any] = {k: getattr(fn, k) for k in functools.WRAPPER_ASSIGNMENTS}
|
124
|
+
return lang.new_type(fn.__name__, (Descriptor,), dct)()
|
125
|
+
|
126
|
+
return outer
|
127
|
+
|
128
|
+
@property
|
129
|
+
def values(self) -> ta.Iterator[T]:
|
130
|
+
frame = sys._getframe().f_back # noqa
|
131
|
+
while frame:
|
132
|
+
try:
|
133
|
+
frame_bindings = self._bindings_by_frame[frame]
|
134
|
+
except KeyError:
|
135
|
+
pass
|
136
|
+
else:
|
137
|
+
for level, frame_binding in sorted(frame_bindings.items()): # noqa
|
138
|
+
yield frame_binding._value # noqa
|
139
|
+
frame = frame.f_back
|
140
|
+
|
141
|
+
if self._new is not MISSING:
|
142
|
+
yield self._new() # type: ignore
|
143
|
+
|
144
|
+
def __iter__(self) -> ta.Iterator[T]:
|
145
|
+
return self.values
|
146
|
+
|
147
|
+
@property
|
148
|
+
def value(self) -> T:
|
149
|
+
try:
|
150
|
+
return next(self.values)
|
151
|
+
except StopIteration:
|
152
|
+
raise UnboundVarError from None
|
153
|
+
|
154
|
+
|
155
|
+
class Binding(ta.Generic[T]):
|
156
|
+
_frame: types.FrameType
|
157
|
+
_frame_bindings: ta.MutableMapping[int, 'Binding']
|
158
|
+
_level: int
|
159
|
+
|
160
|
+
def __init__(self, var: Var[T], value: T, *, offset: int = 0) -> None:
|
161
|
+
super().__init__()
|
162
|
+
|
163
|
+
self._var = var
|
164
|
+
self._value = value
|
165
|
+
self._offset = offset
|
166
|
+
|
167
|
+
def __enter__(self) -> T:
|
168
|
+
frame = sys._getframe(self._offset).f_back # noqa
|
169
|
+
lag_frame: types.FrameType | None = frame
|
170
|
+
while lag_frame is not None:
|
171
|
+
for cur_depth in range(_MAX_HOIST_DEPTH + 1):
|
172
|
+
if lag_frame is None:
|
173
|
+
break
|
174
|
+
try:
|
175
|
+
lag_hoist = _HOISTED_CODE_DEPTH[lag_frame.f_code]
|
176
|
+
except KeyError:
|
177
|
+
pass
|
178
|
+
else:
|
179
|
+
if lag_hoist >= cur_depth:
|
180
|
+
frame = lag_frame = lag_frame.f_back
|
181
|
+
break
|
182
|
+
lag_frame = lag_frame.f_back
|
183
|
+
else:
|
184
|
+
break
|
185
|
+
|
186
|
+
if frame is None:
|
187
|
+
raise RuntimeError
|
188
|
+
self._frame = frame
|
189
|
+
try:
|
190
|
+
self._frame_bindings = self._var._bindings_by_frame[self._frame] # noqa
|
191
|
+
except KeyError:
|
192
|
+
self._frame_bindings = self._var._bindings_by_frame[self._frame] = weakref.WeakValueDictionary() # noqa
|
193
|
+
self._level = 0
|
194
|
+
else:
|
195
|
+
self._level = min(self._frame_bindings.keys() or [1]) - 1
|
196
|
+
|
197
|
+
self._frame_bindings[self._level] = self
|
198
|
+
return self._value
|
199
|
+
|
200
|
+
def __exit__(self, et, e, tb):
|
201
|
+
if self._frame_bindings[self._level] is not self:
|
202
|
+
raise TypeError
|
203
|
+
|
204
|
+
del self._frame_bindings[self._level]
|
205
|
+
del self._frame_bindings
|
206
|
+
del self._frame
|
207
|
+
|
208
|
+
|
209
|
+
class _GeneratorContextManager(contextlib._GeneratorContextManager): # noqa
|
210
|
+
@hoist(2)
|
211
|
+
def __enter__(self):
|
212
|
+
return super().__enter__()
|
213
|
+
|
214
|
+
|
215
|
+
def contextmanager(fn): # noqa
|
216
|
+
@functools.wraps(fn)
|
217
|
+
def helper(*args, **kwds):
|
218
|
+
return _GeneratorContextManager(fn, args, kwds)
|
219
|
+
return helper # noqa
|
File without changes
|
@@ -0,0 +1,77 @@
|
|
1
|
+
// Taken from "The Definitive ANTLR 4 Reference" by Terence Parr
|
2
|
+
|
3
|
+
// Derived from https://json.org
|
4
|
+
|
5
|
+
// $antlr-format alignTrailingComments true, columnLimit 150, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments false, useTab false
|
6
|
+
// $antlr-format allowShortRulesOnASingleLine false, allowShortBlocksOnASingleLine true, alignSemicolons hanging, alignColons hanging
|
7
|
+
|
8
|
+
grammar Json;
|
9
|
+
|
10
|
+
json
|
11
|
+
: value EOF
|
12
|
+
;
|
13
|
+
|
14
|
+
obj
|
15
|
+
: '{' pair (',' pair)* '}'
|
16
|
+
| '{' '}'
|
17
|
+
;
|
18
|
+
|
19
|
+
pair
|
20
|
+
: STRING ':' value
|
21
|
+
;
|
22
|
+
|
23
|
+
arr
|
24
|
+
: '[' value (',' value)* ']'
|
25
|
+
| '[' ']'
|
26
|
+
;
|
27
|
+
|
28
|
+
value
|
29
|
+
: STRING
|
30
|
+
| NUMBER
|
31
|
+
| obj
|
32
|
+
| arr
|
33
|
+
| 'true'
|
34
|
+
| 'false'
|
35
|
+
| 'null'
|
36
|
+
;
|
37
|
+
|
38
|
+
// Lexer
|
39
|
+
|
40
|
+
STRING
|
41
|
+
: '"' (ESC | SAFECODEPOINT)* '"'
|
42
|
+
;
|
43
|
+
|
44
|
+
fragment ESC
|
45
|
+
: '\\' (["\\/bfnrt] | UNICODE)
|
46
|
+
;
|
47
|
+
|
48
|
+
fragment UNICODE
|
49
|
+
: 'u' HEX HEX HEX HEX
|
50
|
+
;
|
51
|
+
|
52
|
+
fragment HEX
|
53
|
+
: [0-9a-fA-F]
|
54
|
+
;
|
55
|
+
|
56
|
+
fragment SAFECODEPOINT
|
57
|
+
: ~ ["\\\u0000-\u001F]
|
58
|
+
;
|
59
|
+
|
60
|
+
NUMBER
|
61
|
+
: '-'? INT ('.' [0-9]+)? EXP?
|
62
|
+
;
|
63
|
+
|
64
|
+
fragment INT
|
65
|
+
// integer part forbids leading 0s (e.g. `01`)
|
66
|
+
: '0'
|
67
|
+
| [1-9] [0-9]*
|
68
|
+
;
|
69
|
+
|
70
|
+
fragment EXP
|
71
|
+
// exponent number permits leading 0s (e.g. `1e01`)
|
72
|
+
: [Ee] [+-]? [0-9]+
|
73
|
+
;
|
74
|
+
|
75
|
+
WS
|
76
|
+
: [ \t\n\r]+ -> skip
|
77
|
+
;
|
File without changes
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# type: ignore
|
2
|
+
# ruff: noqa
|
3
|
+
# flake8: noqa
|
4
|
+
# @omlish-generated
|
5
|
+
# Generated from Json.g4 by ANTLR 4.13.2
|
6
|
+
from omlish.text.antlr._runtime._all import *
|
7
|
+
from io import StringIO
|
8
|
+
import sys
|
9
|
+
if sys.version_info[1] > 5:
|
10
|
+
from typing import TextIO
|
11
|
+
else:
|
12
|
+
from typing.io import TextIO
|
13
|
+
|
14
|
+
|
15
|
+
def serializedATN():
|
16
|
+
return [
|
17
|
+
4,0,12,131,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,
|
18
|
+
2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,
|
19
|
+
13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,1,0,1,0,1,1,1,1,
|
20
|
+
1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,
|
21
|
+
1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,5,9,69,8,9,10,9,12,9,
|
22
|
+
72,9,9,1,9,1,9,1,10,1,10,1,10,3,10,79,8,10,1,11,1,11,1,11,1,11,1,
|
23
|
+
11,1,11,1,12,1,12,1,13,1,13,1,14,3,14,92,8,14,1,14,1,14,1,14,4,14,
|
24
|
+
97,8,14,11,14,12,14,98,3,14,101,8,14,1,14,3,14,104,8,14,1,15,1,15,
|
25
|
+
1,15,5,15,109,8,15,10,15,12,15,112,9,15,3,15,114,8,15,1,16,1,16,
|
26
|
+
3,16,118,8,16,1,16,4,16,121,8,16,11,16,12,16,122,1,17,4,17,126,8,
|
27
|
+
17,11,17,12,17,127,1,17,1,17,0,0,18,1,1,3,2,5,3,7,4,9,5,11,6,13,
|
28
|
+
7,15,8,17,9,19,10,21,0,23,0,25,0,27,0,29,11,31,0,33,0,35,12,1,0,
|
29
|
+
8,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,
|
30
|
+
0,48,57,65,70,97,102,3,0,0,31,34,34,92,92,1,0,48,57,1,0,49,57,2,
|
31
|
+
0,69,69,101,101,2,0,43,43,45,45,3,0,9,10,13,13,32,32,136,0,1,1,0,
|
32
|
+
0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,
|
33
|
+
0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,29,1,0,0,0,
|
34
|
+
0,35,1,0,0,0,1,37,1,0,0,0,3,39,1,0,0,0,5,41,1,0,0,0,7,43,1,0,0,0,
|
35
|
+
9,45,1,0,0,0,11,47,1,0,0,0,13,49,1,0,0,0,15,54,1,0,0,0,17,60,1,0,
|
36
|
+
0,0,19,65,1,0,0,0,21,75,1,0,0,0,23,80,1,0,0,0,25,86,1,0,0,0,27,88,
|
37
|
+
1,0,0,0,29,91,1,0,0,0,31,113,1,0,0,0,33,115,1,0,0,0,35,125,1,0,0,
|
38
|
+
0,37,38,5,123,0,0,38,2,1,0,0,0,39,40,5,44,0,0,40,4,1,0,0,0,41,42,
|
39
|
+
5,125,0,0,42,6,1,0,0,0,43,44,5,58,0,0,44,8,1,0,0,0,45,46,5,91,0,
|
40
|
+
0,46,10,1,0,0,0,47,48,5,93,0,0,48,12,1,0,0,0,49,50,5,116,0,0,50,
|
41
|
+
51,5,114,0,0,51,52,5,117,0,0,52,53,5,101,0,0,53,14,1,0,0,0,54,55,
|
42
|
+
5,102,0,0,55,56,5,97,0,0,56,57,5,108,0,0,57,58,5,115,0,0,58,59,5,
|
43
|
+
101,0,0,59,16,1,0,0,0,60,61,5,110,0,0,61,62,5,117,0,0,62,63,5,108,
|
44
|
+
0,0,63,64,5,108,0,0,64,18,1,0,0,0,65,70,5,34,0,0,66,69,3,21,10,0,
|
45
|
+
67,69,3,27,13,0,68,66,1,0,0,0,68,67,1,0,0,0,69,72,1,0,0,0,70,68,
|
46
|
+
1,0,0,0,70,71,1,0,0,0,71,73,1,0,0,0,72,70,1,0,0,0,73,74,5,34,0,0,
|
47
|
+
74,20,1,0,0,0,75,78,5,92,0,0,76,79,7,0,0,0,77,79,3,23,11,0,78,76,
|
48
|
+
1,0,0,0,78,77,1,0,0,0,79,22,1,0,0,0,80,81,5,117,0,0,81,82,3,25,12,
|
49
|
+
0,82,83,3,25,12,0,83,84,3,25,12,0,84,85,3,25,12,0,85,24,1,0,0,0,
|
50
|
+
86,87,7,1,0,0,87,26,1,0,0,0,88,89,8,2,0,0,89,28,1,0,0,0,90,92,5,
|
51
|
+
45,0,0,91,90,1,0,0,0,91,92,1,0,0,0,92,93,1,0,0,0,93,100,3,31,15,
|
52
|
+
0,94,96,5,46,0,0,95,97,7,3,0,0,96,95,1,0,0,0,97,98,1,0,0,0,98,96,
|
53
|
+
1,0,0,0,98,99,1,0,0,0,99,101,1,0,0,0,100,94,1,0,0,0,100,101,1,0,
|
54
|
+
0,0,101,103,1,0,0,0,102,104,3,33,16,0,103,102,1,0,0,0,103,104,1,
|
55
|
+
0,0,0,104,30,1,0,0,0,105,114,5,48,0,0,106,110,7,4,0,0,107,109,7,
|
56
|
+
3,0,0,108,107,1,0,0,0,109,112,1,0,0,0,110,108,1,0,0,0,110,111,1,
|
57
|
+
0,0,0,111,114,1,0,0,0,112,110,1,0,0,0,113,105,1,0,0,0,113,106,1,
|
58
|
+
0,0,0,114,32,1,0,0,0,115,117,7,5,0,0,116,118,7,6,0,0,117,116,1,0,
|
59
|
+
0,0,117,118,1,0,0,0,118,120,1,0,0,0,119,121,7,3,0,0,120,119,1,0,
|
60
|
+
0,0,121,122,1,0,0,0,122,120,1,0,0,0,122,123,1,0,0,0,123,34,1,0,0,
|
61
|
+
0,124,126,7,7,0,0,125,124,1,0,0,0,126,127,1,0,0,0,127,125,1,0,0,
|
62
|
+
0,127,128,1,0,0,0,128,129,1,0,0,0,129,130,6,17,0,0,130,36,1,0,0,
|
63
|
+
0,13,0,68,70,78,91,98,100,103,110,113,117,122,127,1,6,0,0
|
64
|
+
]
|
65
|
+
|
66
|
+
class JsonLexer(Lexer):
|
67
|
+
|
68
|
+
atn = ATNDeserializer().deserialize(serializedATN())
|
69
|
+
|
70
|
+
decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
|
71
|
+
|
72
|
+
T__0 = 1
|
73
|
+
T__1 = 2
|
74
|
+
T__2 = 3
|
75
|
+
T__3 = 4
|
76
|
+
T__4 = 5
|
77
|
+
T__5 = 6
|
78
|
+
T__6 = 7
|
79
|
+
T__7 = 8
|
80
|
+
T__8 = 9
|
81
|
+
STRING = 10
|
82
|
+
NUMBER = 11
|
83
|
+
WS = 12
|
84
|
+
|
85
|
+
channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]
|
86
|
+
|
87
|
+
modeNames = [ "DEFAULT_MODE" ]
|
88
|
+
|
89
|
+
literalNames = [ "<INVALID>",
|
90
|
+
"'{'", "','", "'}'", "':'", "'['", "']'", "'true'", "'false'",
|
91
|
+
"'null'" ]
|
92
|
+
|
93
|
+
symbolicNames = [ "<INVALID>",
|
94
|
+
"STRING", "NUMBER", "WS" ]
|
95
|
+
|
96
|
+
ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6",
|
97
|
+
"T__7", "T__8", "STRING", "ESC", "UNICODE", "HEX", "SAFECODEPOINT",
|
98
|
+
"NUMBER", "INT", "EXP", "WS" ]
|
99
|
+
|
100
|
+
grammarFileName = "Json.g4"
|
101
|
+
|
102
|
+
def __init__(self, input=None, output:TextIO = sys.stdout):
|
103
|
+
super().__init__(input, output)
|
104
|
+
self.checkVersion("4.13.2")
|
105
|
+
self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
|
106
|
+
self._actions = None
|
107
|
+
self._predicates = None
|
108
|
+
|
109
|
+
|