omextra 0.0.0.dev423__tar.gz → 0.0.0.dev425__tar.gz

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.
Files changed (76) hide show
  1. {omextra-0.0.0.dev423/omextra.egg-info → omextra-0.0.0.dev425}/PKG-INFO +2 -3
  2. omextra-0.0.0.dev425/omextra/.omlish-manifests.json +14 -0
  3. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/omextra/__about__.py +3 -1
  4. omextra-0.0.0.dev425/omextra/defs.py +216 -0
  5. omextra-0.0.0.dev425/omextra/dynamic.py +219 -0
  6. omextra-0.0.0.dev425/omextra/formats/__init__.py +0 -0
  7. omextra-0.0.0.dev425/omextra/formats/json/Json.g4 +77 -0
  8. omextra-0.0.0.dev425/omextra/formats/json/__init__.py +0 -0
  9. omextra-0.0.0.dev425/omextra/formats/json/_antlr/JsonLexer.py +109 -0
  10. omextra-0.0.0.dev425/omextra/formats/json/_antlr/JsonListener.py +61 -0
  11. omextra-0.0.0.dev425/omextra/formats/json/_antlr/JsonParser.py +457 -0
  12. omextra-0.0.0.dev425/omextra/formats/json/_antlr/JsonVisitor.py +42 -0
  13. omextra-0.0.0.dev425/omextra/formats/json/_antlr/__init__.py +0 -0
  14. omextra-0.0.0.dev425/omextra/io/__init__.py +0 -0
  15. omextra-0.0.0.dev425/omextra/io/trampoline.py +289 -0
  16. omextra-0.0.0.dev425/omextra/specs/__init__.py +0 -0
  17. omextra-0.0.0.dev425/omextra/specs/irc/__init__.py +0 -0
  18. omextra-0.0.0.dev425/omextra/specs/irc/messages/__init__.py +0 -0
  19. omextra-0.0.0.dev425/omextra/specs/irc/messages/base.py +50 -0
  20. omextra-0.0.0.dev425/omextra/specs/irc/messages/formats.py +92 -0
  21. omextra-0.0.0.dev425/omextra/specs/irc/messages/messages.py +775 -0
  22. omextra-0.0.0.dev425/omextra/specs/irc/messages/parsing.py +99 -0
  23. omextra-0.0.0.dev425/omextra/specs/irc/numerics/__init__.py +0 -0
  24. omextra-0.0.0.dev425/omextra/specs/irc/numerics/formats.py +97 -0
  25. omextra-0.0.0.dev425/omextra/specs/irc/numerics/numerics.py +865 -0
  26. omextra-0.0.0.dev425/omextra/specs/irc/numerics/types.py +59 -0
  27. omextra-0.0.0.dev425/omextra/specs/irc/protocol/LICENSE +11 -0
  28. omextra-0.0.0.dev425/omextra/specs/irc/protocol/__init__.py +61 -0
  29. omextra-0.0.0.dev425/omextra/specs/irc/protocol/consts.py +6 -0
  30. omextra-0.0.0.dev425/omextra/specs/irc/protocol/errors.py +30 -0
  31. omextra-0.0.0.dev425/omextra/specs/irc/protocol/message.py +21 -0
  32. omextra-0.0.0.dev425/omextra/specs/irc/protocol/nuh.py +55 -0
  33. omextra-0.0.0.dev425/omextra/specs/irc/protocol/parsing.py +158 -0
  34. omextra-0.0.0.dev425/omextra/specs/irc/protocol/rendering.py +153 -0
  35. omextra-0.0.0.dev425/omextra/specs/irc/protocol/tags.py +102 -0
  36. omextra-0.0.0.dev425/omextra/specs/irc/protocol/utils.py +30 -0
  37. omextra-0.0.0.dev425/omextra/specs/proto/Protobuf3.g4 +396 -0
  38. omextra-0.0.0.dev425/omextra/specs/proto/__init__.py +0 -0
  39. omextra-0.0.0.dev425/omextra/specs/proto/_antlr/Protobuf3Lexer.py +340 -0
  40. omextra-0.0.0.dev425/omextra/specs/proto/_antlr/Protobuf3Listener.py +448 -0
  41. omextra-0.0.0.dev425/omextra/specs/proto/_antlr/Protobuf3Parser.py +3909 -0
  42. omextra-0.0.0.dev425/omextra/specs/proto/_antlr/Protobuf3Visitor.py +257 -0
  43. omextra-0.0.0.dev425/omextra/specs/proto/_antlr/__init__.py +0 -0
  44. omextra-0.0.0.dev425/omextra/specs/proto/nodes.py +54 -0
  45. omextra-0.0.0.dev425/omextra/specs/proto/parsing.py +98 -0
  46. omextra-0.0.0.dev425/omextra/sql/__init__.py +0 -0
  47. omextra-0.0.0.dev425/omextra/sql/parsing/Minisql.g4 +292 -0
  48. omextra-0.0.0.dev425/omextra/sql/parsing/__init__.py +0 -0
  49. omextra-0.0.0.dev425/omextra/sql/parsing/_antlr/MinisqlLexer.py +322 -0
  50. omextra-0.0.0.dev425/omextra/sql/parsing/_antlr/MinisqlListener.py +511 -0
  51. omextra-0.0.0.dev425/omextra/sql/parsing/_antlr/MinisqlParser.py +3763 -0
  52. omextra-0.0.0.dev425/omextra/sql/parsing/_antlr/MinisqlVisitor.py +292 -0
  53. omextra-0.0.0.dev425/omextra/sql/parsing/_antlr/__init__.py +0 -0
  54. omextra-0.0.0.dev425/omextra/sql/parsing/parsing.py +120 -0
  55. omextra-0.0.0.dev425/omextra/text/__init__.py +0 -0
  56. omextra-0.0.0.dev425/omextra/text/antlr/__init__.py +0 -0
  57. omextra-0.0.0.dev425/omextra/text/antlr/cli/__init__.py +0 -0
  58. omextra-0.0.0.dev425/omextra/text/antlr/cli/__main__.py +11 -0
  59. omextra-0.0.0.dev425/omextra/text/antlr/cli/cli.py +62 -0
  60. omextra-0.0.0.dev425/omextra/text/antlr/cli/consts.py +7 -0
  61. omextra-0.0.0.dev425/omextra/text/antlr/cli/gen.py +188 -0
  62. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425/omextra.egg-info}/PKG-INFO +2 -3
  63. omextra-0.0.0.dev425/omextra.egg-info/SOURCES.txt +71 -0
  64. omextra-0.0.0.dev425/omextra.egg-info/requires.txt +1 -0
  65. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/pyproject.toml +3 -4
  66. omextra-0.0.0.dev423/omextra/.manifests.json +0 -1
  67. omextra-0.0.0.dev423/omextra.egg-info/SOURCES.txt +0 -13
  68. omextra-0.0.0.dev423/omextra.egg-info/requires.txt +0 -2
  69. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/LICENSE +0 -0
  70. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/MANIFEST.in +0 -0
  71. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/README.md +0 -0
  72. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/omextra/__init__.py +0 -0
  73. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/omextra.egg-info/dependency_links.txt +0 -0
  74. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/omextra.egg-info/entry_points.txt +0 -0
  75. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/omextra.egg-info/top_level.txt +0 -0
  76. {omextra-0.0.0.dev423 → omextra-0.0.0.dev425}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omextra
3
- Version: 0.0.0.dev423
3
+ Version: 0.0.0.dev425
4
4
  Summary: omextra
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,8 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omdev==0.0.0.dev423
18
- Requires-Dist: omlish==0.0.0.dev423
17
+ Requires-Dist: omlish==0.0.0.dev425
19
18
  Dynamic: license-file
20
19
 
21
20
  # Overview
@@ -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
+ ]
@@ -8,7 +8,9 @@ class Project(ProjectBase):
8
8
  description = 'omextra'
9
9
 
10
10
  dependencies = [
11
- f'omdev == {__version__}',
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
 
@@ -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
+ )
@@ -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
+