jaclang 0.5.7__py3-none-any.whl → 0.5.9__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 jaclang might be problematic. Click here for more details.
- jaclang/cli/cli.py +113 -7
- jaclang/cli/cmdreg.py +12 -0
- jaclang/compiler/__init__.py +58 -2
- jaclang/compiler/absyntree.py +1775 -61
- jaclang/compiler/codeloc.py +7 -0
- jaclang/compiler/compile.py +1 -1
- jaclang/compiler/constant.py +17 -0
- jaclang/compiler/parser.py +134 -112
- jaclang/compiler/passes/ir_pass.py +18 -0
- jaclang/compiler/passes/main/__init__.py +2 -0
- jaclang/compiler/passes/main/def_impl_match_pass.py +19 -3
- jaclang/compiler/passes/main/def_use_pass.py +1 -1
- jaclang/compiler/passes/main/fuse_typeinfo_pass.py +357 -0
- jaclang/compiler/passes/main/import_pass.py +7 -3
- jaclang/compiler/passes/main/pyast_gen_pass.py +350 -109
- jaclang/compiler/passes/main/pyast_load_pass.py +1779 -206
- jaclang/compiler/passes/main/registry_pass.py +126 -0
- jaclang/compiler/passes/main/schedules.py +4 -1
- jaclang/compiler/passes/main/sym_tab_build_pass.py +20 -28
- jaclang/compiler/passes/main/tests/test_pyast_build_pass.py +14 -5
- jaclang/compiler/passes/main/tests/test_registry_pass.py +39 -0
- jaclang/compiler/passes/main/tests/test_sym_tab_build_pass.py +8 -8
- jaclang/compiler/passes/main/tests/test_typeinfo_pass.py +7 -0
- jaclang/compiler/passes/main/type_check_pass.py +0 -1
- jaclang/compiler/passes/tool/jac_formatter_pass.py +8 -17
- jaclang/compiler/passes/tool/tests/test_unparse_validate.py +65 -0
- jaclang/compiler/passes/utils/mypy_ast_build.py +28 -14
- jaclang/compiler/symtable.py +23 -2
- jaclang/compiler/tests/test_parser.py +53 -0
- jaclang/compiler/workspace.py +52 -26
- jaclang/core/aott.py +193 -28
- jaclang/core/construct.py +59 -2
- jaclang/core/registry.py +115 -0
- jaclang/core/utils.py +25 -0
- jaclang/plugin/default.py +108 -26
- jaclang/plugin/feature.py +22 -4
- jaclang/plugin/spec.py +13 -7
- jaclang/utils/helpers.py +66 -3
- jaclang/utils/lang_tools.py +6 -38
- jaclang/utils/test.py +1 -0
- jaclang/utils/tests/test_lang_tools.py +11 -14
- jaclang/utils/treeprinter.py +10 -2
- {jaclang-0.5.7.dist-info → jaclang-0.5.9.dist-info}/METADATA +1 -1
- {jaclang-0.5.7.dist-info → jaclang-0.5.9.dist-info}/RECORD +47 -43
- {jaclang-0.5.7.dist-info → jaclang-0.5.9.dist-info}/WHEEL +1 -1
- jaclang/compiler/__jac_gen__/__init__.py +0 -0
- jaclang/compiler/__jac_gen__/jac_parser.py +0 -4069
- {jaclang-0.5.7.dist-info → jaclang-0.5.9.dist-info}/entry_points.txt +0 -0
- {jaclang-0.5.7.dist-info → jaclang-0.5.9.dist-info}/top_level.txt +0 -0
|
@@ -1,4069 +0,0 @@
|
|
|
1
|
-
# The file was automatically generated by Lark v1.1.9
|
|
2
|
-
__version__ = "1.1.9"
|
|
3
|
-
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# Lark Stand-alone Generator Tool
|
|
7
|
-
# ----------------------------------
|
|
8
|
-
# Generates a stand-alone LALR(1) parser
|
|
9
|
-
#
|
|
10
|
-
# Git: https://github.com/erezsh/lark
|
|
11
|
-
# Author: Erez Shinan (erezshin@gmail.com)
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
# >>> LICENSE
|
|
15
|
-
#
|
|
16
|
-
# This tool and its generated code use a separate license from Lark,
|
|
17
|
-
# and are subject to the terms of the Mozilla Public License, v. 2.0.
|
|
18
|
-
# If a copy of the MPL was not distributed with this
|
|
19
|
-
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
20
|
-
#
|
|
21
|
-
# If you wish to purchase a commercial license for this tool and its
|
|
22
|
-
# generated code, you may contact me via email or otherwise.
|
|
23
|
-
#
|
|
24
|
-
# If MPL2 is incompatible with your free or open-source project,
|
|
25
|
-
# contact me and we'll work it out.
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
from copy import deepcopy
|
|
30
|
-
from abc import ABC, abstractmethod
|
|
31
|
-
from types import ModuleType
|
|
32
|
-
from typing import (
|
|
33
|
-
TypeVar,
|
|
34
|
-
Generic,
|
|
35
|
-
Type,
|
|
36
|
-
Tuple,
|
|
37
|
-
List,
|
|
38
|
-
Dict,
|
|
39
|
-
Iterator,
|
|
40
|
-
Collection,
|
|
41
|
-
Callable,
|
|
42
|
-
Optional,
|
|
43
|
-
FrozenSet,
|
|
44
|
-
Any,
|
|
45
|
-
Union,
|
|
46
|
-
Iterable,
|
|
47
|
-
IO,
|
|
48
|
-
TYPE_CHECKING,
|
|
49
|
-
overload,
|
|
50
|
-
Sequence,
|
|
51
|
-
Pattern as REPattern,
|
|
52
|
-
ClassVar,
|
|
53
|
-
Set,
|
|
54
|
-
Mapping,
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class LarkError(Exception):
|
|
61
|
-
pass
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class ConfigurationError(LarkError, ValueError):
|
|
65
|
-
pass
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def assert_config(value, options: Collection, msg="Got %r, expected one of %s"):
|
|
69
|
-
if value not in options:
|
|
70
|
-
raise ConfigurationError(msg % (value, options))
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
class GrammarError(LarkError):
|
|
74
|
-
pass
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class ParseError(LarkError):
|
|
78
|
-
pass
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class LexError(LarkError):
|
|
82
|
-
pass
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
T = TypeVar("T")
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class UnexpectedInput(LarkError):
|
|
89
|
-
#--
|
|
90
|
-
|
|
91
|
-
line: int
|
|
92
|
-
column: int
|
|
93
|
-
pos_in_stream = None
|
|
94
|
-
state: Any
|
|
95
|
-
_terminals_by_name = None
|
|
96
|
-
interactive_parser: "InteractiveParser"
|
|
97
|
-
|
|
98
|
-
def get_context(self, text: str, span: int = 40) -> str:
|
|
99
|
-
#--
|
|
100
|
-
assert self.pos_in_stream is not None, self
|
|
101
|
-
pos = self.pos_in_stream
|
|
102
|
-
start = max(pos - span, 0)
|
|
103
|
-
end = pos + span
|
|
104
|
-
if not isinstance(text, bytes):
|
|
105
|
-
before = text[start:pos].rsplit("\n", 1)[-1]
|
|
106
|
-
after = text[pos:end].split("\n", 1)[0]
|
|
107
|
-
return before + after + "\n" + " " * len(before.expandtabs()) + "^\n"
|
|
108
|
-
else:
|
|
109
|
-
before = text[start:pos].rsplit(b"\n", 1)[-1]
|
|
110
|
-
after = text[pos:end].split(b"\n", 1)[0]
|
|
111
|
-
return (
|
|
112
|
-
before + after + b"\n" + b" " * len(before.expandtabs()) + b"^\n"
|
|
113
|
-
).decode("ascii", "backslashreplace")
|
|
114
|
-
|
|
115
|
-
def match_examples(
|
|
116
|
-
self,
|
|
117
|
-
parse_fn: "Callable[[str], Tree]",
|
|
118
|
-
examples: Union[Mapping[T, Iterable[str]], Iterable[Tuple[T, Iterable[str]]]],
|
|
119
|
-
token_type_match_fallback: bool = False,
|
|
120
|
-
use_accepts: bool = True,
|
|
121
|
-
) -> Optional[T]:
|
|
122
|
-
#--
|
|
123
|
-
assert self.state is not None, "Not supported for this exception"
|
|
124
|
-
|
|
125
|
-
if isinstance(examples, Mapping):
|
|
126
|
-
examples = examples.items()
|
|
127
|
-
|
|
128
|
-
candidate = (None, False)
|
|
129
|
-
for i, (label, example) in enumerate(examples):
|
|
130
|
-
assert not isinstance(example, str), "Expecting a list"
|
|
131
|
-
|
|
132
|
-
for j, malformed in enumerate(example):
|
|
133
|
-
try:
|
|
134
|
-
parse_fn(malformed)
|
|
135
|
-
except UnexpectedInput as ut:
|
|
136
|
-
if ut.state == self.state:
|
|
137
|
-
if (
|
|
138
|
-
use_accepts
|
|
139
|
-
and isinstance(self, UnexpectedToken)
|
|
140
|
-
and isinstance(ut, UnexpectedToken)
|
|
141
|
-
and ut.accepts != self.accepts
|
|
142
|
-
):
|
|
143
|
-
logger.debug(
|
|
144
|
-
"Different accepts with same state[%d]: %s != %s at example [%s][%s]"
|
|
145
|
-
% (self.state, self.accepts, ut.accepts, i, j)
|
|
146
|
-
)
|
|
147
|
-
continue
|
|
148
|
-
if isinstance(
|
|
149
|
-
self, (UnexpectedToken, UnexpectedEOF)
|
|
150
|
-
) and isinstance(ut, (UnexpectedToken, UnexpectedEOF)):
|
|
151
|
-
if ut.token == self.token: ##
|
|
152
|
-
|
|
153
|
-
logger.debug("Exact Match at example [%s][%s]" % (i, j))
|
|
154
|
-
return label
|
|
155
|
-
|
|
156
|
-
if token_type_match_fallback:
|
|
157
|
-
##
|
|
158
|
-
|
|
159
|
-
if (ut.token.type == self.token.type) and not candidate[
|
|
160
|
-
-1
|
|
161
|
-
]:
|
|
162
|
-
logger.debug(
|
|
163
|
-
"Token Type Fallback at example [%s][%s]"
|
|
164
|
-
% (i, j)
|
|
165
|
-
)
|
|
166
|
-
candidate = label, True
|
|
167
|
-
|
|
168
|
-
if candidate[0] is None:
|
|
169
|
-
logger.debug(
|
|
170
|
-
"Same State match at example [%s][%s]" % (i, j)
|
|
171
|
-
)
|
|
172
|
-
candidate = label, False
|
|
173
|
-
|
|
174
|
-
return candidate[0]
|
|
175
|
-
|
|
176
|
-
def _format_expected(self, expected):
|
|
177
|
-
if self._terminals_by_name:
|
|
178
|
-
d = self._terminals_by_name
|
|
179
|
-
expected = [
|
|
180
|
-
d[t_name].user_repr() if t_name in d else t_name for t_name in expected
|
|
181
|
-
]
|
|
182
|
-
return "Expected one of: \n\t* %s\n" % "\n\t* ".join(expected)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
class UnexpectedEOF(ParseError, UnexpectedInput):
|
|
186
|
-
#--
|
|
187
|
-
|
|
188
|
-
expected: "List[Token]"
|
|
189
|
-
|
|
190
|
-
def __init__(self, expected, state=None, terminals_by_name=None):
|
|
191
|
-
super(UnexpectedEOF, self).__init__()
|
|
192
|
-
|
|
193
|
-
self.expected = expected
|
|
194
|
-
self.state = state
|
|
195
|
-
from .lexer import Token
|
|
196
|
-
|
|
197
|
-
self.token = Token("<EOF>", "") ##
|
|
198
|
-
|
|
199
|
-
self.pos_in_stream = -1
|
|
200
|
-
self.line = -1
|
|
201
|
-
self.column = -1
|
|
202
|
-
self._terminals_by_name = terminals_by_name
|
|
203
|
-
|
|
204
|
-
def __str__(self):
|
|
205
|
-
message = "Unexpected end-of-input. "
|
|
206
|
-
message += self._format_expected(self.expected)
|
|
207
|
-
return message
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
class UnexpectedCharacters(LexError, UnexpectedInput):
|
|
211
|
-
#--
|
|
212
|
-
|
|
213
|
-
allowed: Set[str]
|
|
214
|
-
considered_tokens: Set[Any]
|
|
215
|
-
|
|
216
|
-
def __init__(
|
|
217
|
-
self,
|
|
218
|
-
seq,
|
|
219
|
-
lex_pos,
|
|
220
|
-
line,
|
|
221
|
-
column,
|
|
222
|
-
allowed=None,
|
|
223
|
-
considered_tokens=None,
|
|
224
|
-
state=None,
|
|
225
|
-
token_history=None,
|
|
226
|
-
terminals_by_name=None,
|
|
227
|
-
considered_rules=None,
|
|
228
|
-
):
|
|
229
|
-
super(UnexpectedCharacters, self).__init__()
|
|
230
|
-
|
|
231
|
-
##
|
|
232
|
-
|
|
233
|
-
self.line = line
|
|
234
|
-
self.column = column
|
|
235
|
-
self.pos_in_stream = lex_pos
|
|
236
|
-
self.state = state
|
|
237
|
-
self._terminals_by_name = terminals_by_name
|
|
238
|
-
|
|
239
|
-
self.allowed = allowed
|
|
240
|
-
self.considered_tokens = considered_tokens
|
|
241
|
-
self.considered_rules = considered_rules
|
|
242
|
-
self.token_history = token_history
|
|
243
|
-
|
|
244
|
-
if isinstance(seq, bytes):
|
|
245
|
-
self.char = seq[lex_pos : lex_pos + 1].decode("ascii", "backslashreplace")
|
|
246
|
-
else:
|
|
247
|
-
self.char = seq[lex_pos]
|
|
248
|
-
self._context = self.get_context(seq)
|
|
249
|
-
|
|
250
|
-
def __str__(self):
|
|
251
|
-
message = (
|
|
252
|
-
"No terminal matches '%s' in the current parser context, at line %d col %d"
|
|
253
|
-
% (self.char, self.line, self.column)
|
|
254
|
-
)
|
|
255
|
-
message += "\n\n" + self._context
|
|
256
|
-
if self.allowed:
|
|
257
|
-
message += self._format_expected(self.allowed)
|
|
258
|
-
if self.token_history:
|
|
259
|
-
message += "\nPrevious tokens: %s\n" % ", ".join(
|
|
260
|
-
repr(t) for t in self.token_history
|
|
261
|
-
)
|
|
262
|
-
return message
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
class UnexpectedToken(ParseError, UnexpectedInput):
|
|
266
|
-
#--
|
|
267
|
-
|
|
268
|
-
expected: Set[str]
|
|
269
|
-
considered_rules: Set[str]
|
|
270
|
-
|
|
271
|
-
def __init__(
|
|
272
|
-
self,
|
|
273
|
-
token,
|
|
274
|
-
expected,
|
|
275
|
-
considered_rules=None,
|
|
276
|
-
state=None,
|
|
277
|
-
interactive_parser=None,
|
|
278
|
-
terminals_by_name=None,
|
|
279
|
-
token_history=None,
|
|
280
|
-
):
|
|
281
|
-
super(UnexpectedToken, self).__init__()
|
|
282
|
-
|
|
283
|
-
##
|
|
284
|
-
|
|
285
|
-
self.line = getattr(token, "line", "?")
|
|
286
|
-
self.column = getattr(token, "column", "?")
|
|
287
|
-
self.pos_in_stream = getattr(token, "start_pos", None)
|
|
288
|
-
self.state = state
|
|
289
|
-
|
|
290
|
-
self.token = token
|
|
291
|
-
self.expected = expected ##
|
|
292
|
-
|
|
293
|
-
self._accepts = NO_VALUE
|
|
294
|
-
self.considered_rules = considered_rules
|
|
295
|
-
self.interactive_parser = interactive_parser
|
|
296
|
-
self._terminals_by_name = terminals_by_name
|
|
297
|
-
self.token_history = token_history
|
|
298
|
-
|
|
299
|
-
@property
|
|
300
|
-
def accepts(self) -> Set[str]:
|
|
301
|
-
if self._accepts is NO_VALUE:
|
|
302
|
-
self._accepts = (
|
|
303
|
-
self.interactive_parser and self.interactive_parser.accepts()
|
|
304
|
-
)
|
|
305
|
-
return self._accepts
|
|
306
|
-
|
|
307
|
-
def __str__(self):
|
|
308
|
-
message = "Unexpected token %r at line %s, column %s.\n%s" % (
|
|
309
|
-
self.token,
|
|
310
|
-
self.line,
|
|
311
|
-
self.column,
|
|
312
|
-
self._format_expected(self.accepts or self.expected),
|
|
313
|
-
)
|
|
314
|
-
if self.token_history:
|
|
315
|
-
message += "Previous tokens: %r\n" % self.token_history
|
|
316
|
-
|
|
317
|
-
return message
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
class VisitError(LarkError):
|
|
321
|
-
#--
|
|
322
|
-
|
|
323
|
-
obj: "Union[Tree, Token]"
|
|
324
|
-
orig_exc: Exception
|
|
325
|
-
|
|
326
|
-
def __init__(self, rule, obj, orig_exc):
|
|
327
|
-
message = 'Error trying to process rule "%s":\n\n%s' % (rule, orig_exc)
|
|
328
|
-
super(VisitError, self).__init__(message)
|
|
329
|
-
|
|
330
|
-
self.rule = rule
|
|
331
|
-
self.obj = obj
|
|
332
|
-
self.orig_exc = orig_exc
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
class MissingVariableError(LarkError):
|
|
336
|
-
pass
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
import sys, re
|
|
341
|
-
import logging
|
|
342
|
-
|
|
343
|
-
logger: logging.Logger = logging.getLogger("lark")
|
|
344
|
-
logger.addHandler(logging.StreamHandler())
|
|
345
|
-
##
|
|
346
|
-
|
|
347
|
-
##
|
|
348
|
-
|
|
349
|
-
logger.setLevel(logging.CRITICAL)
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
NO_VALUE = object()
|
|
353
|
-
|
|
354
|
-
T = TypeVar("T")
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
def classify(
|
|
358
|
-
seq: Iterable, key: Optional[Callable] = None, value: Optional[Callable] = None
|
|
359
|
-
) -> Dict:
|
|
360
|
-
d: Dict[Any, Any] = {}
|
|
361
|
-
for item in seq:
|
|
362
|
-
k = key(item) if (key is not None) else item
|
|
363
|
-
v = value(item) if (value is not None) else item
|
|
364
|
-
try:
|
|
365
|
-
d[k].append(v)
|
|
366
|
-
except KeyError:
|
|
367
|
-
d[k] = [v]
|
|
368
|
-
return d
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
def _deserialize(data: Any, namespace: Dict[str, Any], memo: Dict) -> Any:
|
|
372
|
-
if isinstance(data, dict):
|
|
373
|
-
if "__type__" in data: ##
|
|
374
|
-
|
|
375
|
-
class_ = namespace[data["__type__"]]
|
|
376
|
-
return class_.deserialize(data, memo)
|
|
377
|
-
elif "@" in data:
|
|
378
|
-
return memo[data["@"]]
|
|
379
|
-
return {
|
|
380
|
-
key: _deserialize(value, namespace, memo) for key, value in data.items()
|
|
381
|
-
}
|
|
382
|
-
elif isinstance(data, list):
|
|
383
|
-
return [_deserialize(value, namespace, memo) for value in data]
|
|
384
|
-
return data
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
_T = TypeVar("_T", bound="Serialize")
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
class Serialize:
|
|
391
|
-
#--
|
|
392
|
-
|
|
393
|
-
def memo_serialize(self, types_to_memoize: List) -> Any:
|
|
394
|
-
memo = SerializeMemoizer(types_to_memoize)
|
|
395
|
-
return self.serialize(memo), memo.serialize()
|
|
396
|
-
|
|
397
|
-
def serialize(self, memo=None) -> Dict[str, Any]:
|
|
398
|
-
if memo and memo.in_types(self):
|
|
399
|
-
return {"@": memo.memoized.get(self)}
|
|
400
|
-
|
|
401
|
-
fields = getattr(self, "__serialize_fields__")
|
|
402
|
-
res = {f: _serialize(getattr(self, f), memo) for f in fields}
|
|
403
|
-
res["__type__"] = type(self).__name__
|
|
404
|
-
if hasattr(self, "_serialize"):
|
|
405
|
-
self._serialize(res, memo) ##
|
|
406
|
-
|
|
407
|
-
return res
|
|
408
|
-
|
|
409
|
-
@classmethod
|
|
410
|
-
def deserialize(cls: Type[_T], data: Dict[str, Any], memo: Dict[int, Any]) -> _T:
|
|
411
|
-
namespace = getattr(cls, "__serialize_namespace__", [])
|
|
412
|
-
namespace = {c.__name__: c for c in namespace}
|
|
413
|
-
|
|
414
|
-
fields = getattr(cls, "__serialize_fields__")
|
|
415
|
-
|
|
416
|
-
if "@" in data:
|
|
417
|
-
return memo[data["@"]]
|
|
418
|
-
|
|
419
|
-
inst = cls.__new__(cls)
|
|
420
|
-
for f in fields:
|
|
421
|
-
try:
|
|
422
|
-
setattr(inst, f, _deserialize(data[f], namespace, memo))
|
|
423
|
-
except KeyError as e:
|
|
424
|
-
raise KeyError("Cannot find key for class", cls, e)
|
|
425
|
-
|
|
426
|
-
if hasattr(inst, "_deserialize"):
|
|
427
|
-
inst._deserialize() ##
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
return inst
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
class SerializeMemoizer(Serialize):
|
|
434
|
-
#--
|
|
435
|
-
|
|
436
|
-
__serialize_fields__ = ("memoized",)
|
|
437
|
-
|
|
438
|
-
def __init__(self, types_to_memoize: List) -> None:
|
|
439
|
-
self.types_to_memoize = tuple(types_to_memoize)
|
|
440
|
-
self.memoized = Enumerator()
|
|
441
|
-
|
|
442
|
-
def in_types(self, value: Serialize) -> bool:
|
|
443
|
-
return isinstance(value, self.types_to_memoize)
|
|
444
|
-
|
|
445
|
-
def serialize(self) -> Dict[int, Any]: ##
|
|
446
|
-
|
|
447
|
-
return _serialize(self.memoized.reversed(), None)
|
|
448
|
-
|
|
449
|
-
@classmethod
|
|
450
|
-
def deserialize(cls, data: Dict[int, Any], namespace: Dict[str, Any], memo: Dict[Any, Any]) -> Dict[int, Any]: ##
|
|
451
|
-
|
|
452
|
-
return _deserialize(data, namespace, memo)
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
try:
|
|
456
|
-
import regex
|
|
457
|
-
|
|
458
|
-
_has_regex = True
|
|
459
|
-
except ImportError:
|
|
460
|
-
_has_regex = False
|
|
461
|
-
|
|
462
|
-
if sys.version_info >= (3, 11):
|
|
463
|
-
import re._parser as sre_parse
|
|
464
|
-
import re._constants as sre_constants
|
|
465
|
-
else:
|
|
466
|
-
import sre_parse
|
|
467
|
-
import sre_constants
|
|
468
|
-
|
|
469
|
-
categ_pattern = re.compile(r"\\p{[A-Za-z_]+}")
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
def get_regexp_width(expr: str) -> Union[Tuple[int, int], List[int]]:
|
|
473
|
-
if _has_regex:
|
|
474
|
-
##
|
|
475
|
-
|
|
476
|
-
##
|
|
477
|
-
|
|
478
|
-
##
|
|
479
|
-
|
|
480
|
-
regexp_final = re.sub(categ_pattern, "A", expr)
|
|
481
|
-
else:
|
|
482
|
-
if re.search(categ_pattern, expr):
|
|
483
|
-
raise ImportError(
|
|
484
|
-
"`regex` module must be installed in order to use Unicode categories.",
|
|
485
|
-
expr,
|
|
486
|
-
)
|
|
487
|
-
regexp_final = expr
|
|
488
|
-
try:
|
|
489
|
-
##
|
|
490
|
-
|
|
491
|
-
return [int(x) for x in sre_parse.parse(regexp_final).getwidth()] ##
|
|
492
|
-
|
|
493
|
-
except sre_constants.error:
|
|
494
|
-
if not _has_regex:
|
|
495
|
-
raise ValueError(expr)
|
|
496
|
-
else:
|
|
497
|
-
##
|
|
498
|
-
|
|
499
|
-
##
|
|
500
|
-
|
|
501
|
-
c = regex.compile(regexp_final)
|
|
502
|
-
##
|
|
503
|
-
|
|
504
|
-
##
|
|
505
|
-
|
|
506
|
-
MAXWIDTH = getattr(sre_parse, "MAXWIDTH", sre_constants.MAXREPEAT)
|
|
507
|
-
if c.match("") is None:
|
|
508
|
-
##
|
|
509
|
-
|
|
510
|
-
return 1, int(MAXWIDTH)
|
|
511
|
-
else:
|
|
512
|
-
return 0, int(MAXWIDTH)
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
from collections import OrderedDict
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
class Meta:
|
|
520
|
-
|
|
521
|
-
empty: bool
|
|
522
|
-
line: int
|
|
523
|
-
column: int
|
|
524
|
-
start_pos: int
|
|
525
|
-
end_line: int
|
|
526
|
-
end_column: int
|
|
527
|
-
end_pos: int
|
|
528
|
-
orig_expansion: "List[TerminalDef]"
|
|
529
|
-
match_tree: bool
|
|
530
|
-
|
|
531
|
-
def __init__(self):
|
|
532
|
-
self.empty = True
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
_Leaf_T = TypeVar("_Leaf_T")
|
|
536
|
-
Branch = Union[_Leaf_T, "Tree[_Leaf_T]"]
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
class Tree(Generic[_Leaf_T]):
|
|
540
|
-
#--
|
|
541
|
-
|
|
542
|
-
data: str
|
|
543
|
-
children: "List[Branch[_Leaf_T]]"
|
|
544
|
-
|
|
545
|
-
def __init__(
|
|
546
|
-
self, data: str, children: "List[Branch[_Leaf_T]]", meta: Optional[Meta] = None
|
|
547
|
-
) -> None:
|
|
548
|
-
self.data = data
|
|
549
|
-
self.children = children
|
|
550
|
-
self._meta = meta
|
|
551
|
-
|
|
552
|
-
@property
|
|
553
|
-
def meta(self) -> Meta:
|
|
554
|
-
if self._meta is None:
|
|
555
|
-
self._meta = Meta()
|
|
556
|
-
return self._meta
|
|
557
|
-
|
|
558
|
-
def __repr__(self):
|
|
559
|
-
return "Tree(%r, %r)" % (self.data, self.children)
|
|
560
|
-
|
|
561
|
-
def _pretty_label(self):
|
|
562
|
-
return self.data
|
|
563
|
-
|
|
564
|
-
def _pretty(self, level, indent_str):
|
|
565
|
-
yield f"{indent_str*level}{self._pretty_label()}"
|
|
566
|
-
if len(self.children) == 1 and not isinstance(self.children[0], Tree):
|
|
567
|
-
yield f"\t{self.children[0]}\n"
|
|
568
|
-
else:
|
|
569
|
-
yield "\n"
|
|
570
|
-
for n in self.children:
|
|
571
|
-
if isinstance(n, Tree):
|
|
572
|
-
yield from n._pretty(level + 1, indent_str)
|
|
573
|
-
else:
|
|
574
|
-
yield f"{indent_str*(level+1)}{n}\n"
|
|
575
|
-
|
|
576
|
-
def pretty(self, indent_str: str = " ") -> str:
|
|
577
|
-
#--
|
|
578
|
-
return "".join(self._pretty(0, indent_str))
|
|
579
|
-
|
|
580
|
-
def __rich__(self, parent: Optional["rich.tree.Tree"] = None) -> "rich.tree.Tree":
|
|
581
|
-
#--
|
|
582
|
-
return self._rich(parent)
|
|
583
|
-
|
|
584
|
-
def _rich(self, parent):
|
|
585
|
-
if parent:
|
|
586
|
-
tree = parent.add(f"[bold]{self.data}[/bold]")
|
|
587
|
-
else:
|
|
588
|
-
import rich.tree
|
|
589
|
-
|
|
590
|
-
tree = rich.tree.Tree(self.data)
|
|
591
|
-
|
|
592
|
-
for c in self.children:
|
|
593
|
-
if isinstance(c, Tree):
|
|
594
|
-
c._rich(tree)
|
|
595
|
-
else:
|
|
596
|
-
tree.add(f"[green]{c}[/green]")
|
|
597
|
-
|
|
598
|
-
return tree
|
|
599
|
-
|
|
600
|
-
def __eq__(self, other):
|
|
601
|
-
try:
|
|
602
|
-
return self.data == other.data and self.children == other.children
|
|
603
|
-
except AttributeError:
|
|
604
|
-
return False
|
|
605
|
-
|
|
606
|
-
def __ne__(self, other):
|
|
607
|
-
return not (self == other)
|
|
608
|
-
|
|
609
|
-
def __hash__(self) -> int:
|
|
610
|
-
return hash((self.data, tuple(self.children)))
|
|
611
|
-
|
|
612
|
-
def iter_subtrees(self) -> "Iterator[Tree[_Leaf_T]]":
|
|
613
|
-
#--
|
|
614
|
-
queue = [self]
|
|
615
|
-
subtrees = OrderedDict()
|
|
616
|
-
for subtree in queue:
|
|
617
|
-
subtrees[id(subtree)] = subtree
|
|
618
|
-
##
|
|
619
|
-
|
|
620
|
-
queue += [
|
|
621
|
-
c
|
|
622
|
-
for c in reversed(subtree.children) ##
|
|
623
|
-
|
|
624
|
-
if isinstance(c, Tree) and id(c) not in subtrees
|
|
625
|
-
]
|
|
626
|
-
|
|
627
|
-
del queue
|
|
628
|
-
return reversed(list(subtrees.values()))
|
|
629
|
-
|
|
630
|
-
def iter_subtrees_topdown(self):
|
|
631
|
-
#--
|
|
632
|
-
stack = [self]
|
|
633
|
-
stack_append = stack.append
|
|
634
|
-
stack_pop = stack.pop
|
|
635
|
-
while stack:
|
|
636
|
-
node = stack_pop()
|
|
637
|
-
if not isinstance(node, Tree):
|
|
638
|
-
continue
|
|
639
|
-
yield node
|
|
640
|
-
for child in reversed(node.children):
|
|
641
|
-
stack_append(child)
|
|
642
|
-
|
|
643
|
-
def find_pred(
|
|
644
|
-
self, pred: "Callable[[Tree[_Leaf_T]], bool]"
|
|
645
|
-
) -> "Iterator[Tree[_Leaf_T]]":
|
|
646
|
-
#--
|
|
647
|
-
return filter(pred, self.iter_subtrees())
|
|
648
|
-
|
|
649
|
-
def find_data(self, data: str) -> "Iterator[Tree[_Leaf_T]]":
|
|
650
|
-
#--
|
|
651
|
-
return self.find_pred(lambda t: t.data == data)
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
from functools import wraps, update_wrapper
|
|
655
|
-
from inspect import getmembers, getmro
|
|
656
|
-
|
|
657
|
-
_Return_T = TypeVar("_Return_T")
|
|
658
|
-
_Return_V = TypeVar("_Return_V")
|
|
659
|
-
_Leaf_T = TypeVar("_Leaf_T")
|
|
660
|
-
_Leaf_U = TypeVar("_Leaf_U")
|
|
661
|
-
_R = TypeVar("_R")
|
|
662
|
-
_FUNC = Callable[..., _Return_T]
|
|
663
|
-
_DECORATED = Union[_FUNC, type]
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
class _DiscardType:
|
|
667
|
-
#--
|
|
668
|
-
|
|
669
|
-
def __repr__(self):
|
|
670
|
-
return "lark.visitors.Discard"
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
Discard = _DiscardType()
|
|
674
|
-
|
|
675
|
-
##
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
class _Decoratable:
|
|
680
|
-
#--
|
|
681
|
-
|
|
682
|
-
@classmethod
|
|
683
|
-
def _apply_v_args(cls, visit_wrapper):
|
|
684
|
-
mro = getmro(cls)
|
|
685
|
-
assert mro[0] is cls
|
|
686
|
-
libmembers = {name for _cls in mro[1:] for name, _ in getmembers(_cls)}
|
|
687
|
-
for name, value in getmembers(cls):
|
|
688
|
-
|
|
689
|
-
##
|
|
690
|
-
|
|
691
|
-
if name.startswith("_") or (
|
|
692
|
-
name in libmembers and name not in cls.__dict__
|
|
693
|
-
):
|
|
694
|
-
continue
|
|
695
|
-
if not callable(value):
|
|
696
|
-
continue
|
|
697
|
-
|
|
698
|
-
##
|
|
699
|
-
|
|
700
|
-
if isinstance(cls.__dict__[name], _VArgsWrapper):
|
|
701
|
-
continue
|
|
702
|
-
|
|
703
|
-
setattr(cls, name, _VArgsWrapper(cls.__dict__[name], visit_wrapper))
|
|
704
|
-
return cls
|
|
705
|
-
|
|
706
|
-
def __class_getitem__(cls, _):
|
|
707
|
-
return cls
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
class Transformer(_Decoratable, ABC, Generic[_Leaf_T, _Return_T]):
|
|
711
|
-
#--
|
|
712
|
-
|
|
713
|
-
__visit_tokens__ = True ##
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
def __init__(self, visit_tokens: bool = True) -> None:
|
|
717
|
-
self.__visit_tokens__ = visit_tokens
|
|
718
|
-
|
|
719
|
-
def _call_userfunc(self, tree, new_children=None):
|
|
720
|
-
##
|
|
721
|
-
|
|
722
|
-
children = new_children if new_children is not None else tree.children
|
|
723
|
-
try:
|
|
724
|
-
f = getattr(self, tree.data)
|
|
725
|
-
except AttributeError:
|
|
726
|
-
return self.__default__(tree.data, children, tree.meta)
|
|
727
|
-
else:
|
|
728
|
-
try:
|
|
729
|
-
wrapper = getattr(f, "visit_wrapper", None)
|
|
730
|
-
if wrapper is not None:
|
|
731
|
-
return f.visit_wrapper(f, tree.data, children, tree.meta)
|
|
732
|
-
else:
|
|
733
|
-
return f(children)
|
|
734
|
-
except GrammarError:
|
|
735
|
-
raise
|
|
736
|
-
except Exception as e:
|
|
737
|
-
raise VisitError(tree.data, tree, e)
|
|
738
|
-
|
|
739
|
-
def _call_userfunc_token(self, token):
|
|
740
|
-
try:
|
|
741
|
-
f = getattr(self, token.type)
|
|
742
|
-
except AttributeError:
|
|
743
|
-
return self.__default_token__(token)
|
|
744
|
-
else:
|
|
745
|
-
try:
|
|
746
|
-
return f(token)
|
|
747
|
-
except GrammarError:
|
|
748
|
-
raise
|
|
749
|
-
except Exception as e:
|
|
750
|
-
raise VisitError(token.type, token, e)
|
|
751
|
-
|
|
752
|
-
def _transform_children(self, children):
|
|
753
|
-
for c in children:
|
|
754
|
-
if isinstance(c, Tree):
|
|
755
|
-
res = self._transform_tree(c)
|
|
756
|
-
elif self.__visit_tokens__ and isinstance(c, Token):
|
|
757
|
-
res = self._call_userfunc_token(c)
|
|
758
|
-
else:
|
|
759
|
-
res = c
|
|
760
|
-
|
|
761
|
-
if res is not Discard:
|
|
762
|
-
yield res
|
|
763
|
-
|
|
764
|
-
def _transform_tree(self, tree):
|
|
765
|
-
children = list(self._transform_children(tree.children))
|
|
766
|
-
return self._call_userfunc(tree, children)
|
|
767
|
-
|
|
768
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
769
|
-
#--
|
|
770
|
-
return self._transform_tree(tree)
|
|
771
|
-
|
|
772
|
-
def __mul__(
|
|
773
|
-
self: "Transformer[_Leaf_T, Tree[_Leaf_U]]",
|
|
774
|
-
other: "Union[Transformer[_Leaf_U, _Return_V], TransformerChain[_Leaf_U, _Return_V,]]",
|
|
775
|
-
) -> "TransformerChain[_Leaf_T, _Return_V]":
|
|
776
|
-
#--
|
|
777
|
-
return TransformerChain(self, other)
|
|
778
|
-
|
|
779
|
-
def __default__(self, data, children, meta):
|
|
780
|
-
#--
|
|
781
|
-
return Tree(data, children, meta)
|
|
782
|
-
|
|
783
|
-
def __default_token__(self, token):
|
|
784
|
-
#--
|
|
785
|
-
return token
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
def merge_transformers(base_transformer=None, **transformers_to_merge):
|
|
789
|
-
#--
|
|
790
|
-
if base_transformer is None:
|
|
791
|
-
base_transformer = Transformer()
|
|
792
|
-
for prefix, transformer in transformers_to_merge.items():
|
|
793
|
-
for method_name in dir(transformer):
|
|
794
|
-
method = getattr(transformer, method_name)
|
|
795
|
-
if not callable(method):
|
|
796
|
-
continue
|
|
797
|
-
if method_name.startswith("_") or method_name == "transform":
|
|
798
|
-
continue
|
|
799
|
-
prefixed_method = prefix + "__" + method_name
|
|
800
|
-
if hasattr(base_transformer, prefixed_method):
|
|
801
|
-
raise AttributeError(
|
|
802
|
-
"Cannot merge: method '%s' appears more than once" % prefixed_method
|
|
803
|
-
)
|
|
804
|
-
|
|
805
|
-
setattr(base_transformer, prefixed_method, method)
|
|
806
|
-
|
|
807
|
-
return base_transformer
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
class InlineTransformer(Transformer): ##
|
|
811
|
-
|
|
812
|
-
def _call_userfunc(self, tree, new_children=None):
|
|
813
|
-
##
|
|
814
|
-
|
|
815
|
-
children = new_children if new_children is not None else tree.children
|
|
816
|
-
try:
|
|
817
|
-
f = getattr(self, tree.data)
|
|
818
|
-
except AttributeError:
|
|
819
|
-
return self.__default__(tree.data, children, tree.meta)
|
|
820
|
-
else:
|
|
821
|
-
return f(*children)
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
class TransformerChain(Generic[_Leaf_T, _Return_T]):
|
|
825
|
-
|
|
826
|
-
transformers: "Tuple[Union[Transformer, TransformerChain], ...]"
|
|
827
|
-
|
|
828
|
-
def __init__(self, *transformers: "Union[Transformer, TransformerChain]") -> None:
|
|
829
|
-
self.transformers = transformers
|
|
830
|
-
|
|
831
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
832
|
-
for t in self.transformers:
|
|
833
|
-
tree = t.transform(tree)
|
|
834
|
-
return cast(_Return_T, tree)
|
|
835
|
-
|
|
836
|
-
def __mul__(
|
|
837
|
-
self: "TransformerChain[_Leaf_T, Tree[_Leaf_U]]",
|
|
838
|
-
other: "Union[Transformer[_Leaf_U, _Return_V], TransformerChain[_Leaf_U, _Return_V]]",
|
|
839
|
-
) -> "TransformerChain[_Leaf_T, _Return_V]":
|
|
840
|
-
return TransformerChain(*self.transformers + (other,))
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
class Transformer_InPlace(Transformer[_Leaf_T, _Return_T]):
|
|
844
|
-
#--
|
|
845
|
-
|
|
846
|
-
def _transform_tree(self, tree): ##
|
|
847
|
-
|
|
848
|
-
return self._call_userfunc(tree)
|
|
849
|
-
|
|
850
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
851
|
-
for subtree in tree.iter_subtrees():
|
|
852
|
-
subtree.children = list(self._transform_children(subtree.children))
|
|
853
|
-
|
|
854
|
-
return self._transform_tree(tree)
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
class Transformer_NonRecursive(Transformer[_Leaf_T, _Return_T]):
|
|
858
|
-
#--
|
|
859
|
-
|
|
860
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
861
|
-
##
|
|
862
|
-
|
|
863
|
-
rev_postfix = []
|
|
864
|
-
q: List[Branch[_Leaf_T]] = [tree]
|
|
865
|
-
while q:
|
|
866
|
-
t = q.pop()
|
|
867
|
-
rev_postfix.append(t)
|
|
868
|
-
if isinstance(t, Tree):
|
|
869
|
-
q += t.children
|
|
870
|
-
|
|
871
|
-
##
|
|
872
|
-
|
|
873
|
-
stack: List = []
|
|
874
|
-
for x in reversed(rev_postfix):
|
|
875
|
-
if isinstance(x, Tree):
|
|
876
|
-
size = len(x.children)
|
|
877
|
-
if size:
|
|
878
|
-
args = stack[-size:]
|
|
879
|
-
del stack[-size:]
|
|
880
|
-
else:
|
|
881
|
-
args = []
|
|
882
|
-
|
|
883
|
-
res = self._call_userfunc(x, args)
|
|
884
|
-
if res is not Discard:
|
|
885
|
-
stack.append(res)
|
|
886
|
-
|
|
887
|
-
elif self.__visit_tokens__ and isinstance(x, Token):
|
|
888
|
-
res = self._call_userfunc_token(x)
|
|
889
|
-
if res is not Discard:
|
|
890
|
-
stack.append(res)
|
|
891
|
-
else:
|
|
892
|
-
stack.append(x)
|
|
893
|
-
|
|
894
|
-
(result,) = stack ##
|
|
895
|
-
|
|
896
|
-
##
|
|
897
|
-
|
|
898
|
-
##
|
|
899
|
-
|
|
900
|
-
##
|
|
901
|
-
|
|
902
|
-
return cast(_Return_T, result)
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
class Transformer_InPlaceRecursive(Transformer):
|
|
906
|
-
#--
|
|
907
|
-
|
|
908
|
-
def _transform_tree(self, tree):
|
|
909
|
-
tree.children = list(self._transform_children(tree.children))
|
|
910
|
-
return self._call_userfunc(tree)
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
##
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
class VisitorBase:
|
|
918
|
-
def _call_userfunc(self, tree):
|
|
919
|
-
return getattr(self, tree.data, self.__default__)(tree)
|
|
920
|
-
|
|
921
|
-
def __default__(self, tree):
|
|
922
|
-
#--
|
|
923
|
-
return tree
|
|
924
|
-
|
|
925
|
-
def __class_getitem__(cls, _):
|
|
926
|
-
return cls
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
class Visitor(VisitorBase, ABC, Generic[_Leaf_T]):
|
|
930
|
-
#--
|
|
931
|
-
|
|
932
|
-
def visit(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
933
|
-
#--
|
|
934
|
-
for subtree in tree.iter_subtrees():
|
|
935
|
-
self._call_userfunc(subtree)
|
|
936
|
-
return tree
|
|
937
|
-
|
|
938
|
-
def visit_topdown(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
939
|
-
#--
|
|
940
|
-
for subtree in tree.iter_subtrees_topdown():
|
|
941
|
-
self._call_userfunc(subtree)
|
|
942
|
-
return tree
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
class Visitor_Recursive(VisitorBase, Generic[_Leaf_T]):
|
|
946
|
-
#--
|
|
947
|
-
|
|
948
|
-
def visit(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
949
|
-
#--
|
|
950
|
-
for child in tree.children:
|
|
951
|
-
if isinstance(child, Tree):
|
|
952
|
-
self.visit(child)
|
|
953
|
-
|
|
954
|
-
self._call_userfunc(tree)
|
|
955
|
-
return tree
|
|
956
|
-
|
|
957
|
-
def visit_topdown(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
958
|
-
#--
|
|
959
|
-
self._call_userfunc(tree)
|
|
960
|
-
|
|
961
|
-
for child in tree.children:
|
|
962
|
-
if isinstance(child, Tree):
|
|
963
|
-
self.visit_topdown(child)
|
|
964
|
-
|
|
965
|
-
return tree
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
class Interpreter(_Decoratable, ABC, Generic[_Leaf_T, _Return_T]):
|
|
969
|
-
#--
|
|
970
|
-
|
|
971
|
-
def visit(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
972
|
-
##
|
|
973
|
-
|
|
974
|
-
##
|
|
975
|
-
|
|
976
|
-
##
|
|
977
|
-
|
|
978
|
-
return self._visit_tree(tree)
|
|
979
|
-
|
|
980
|
-
def _visit_tree(self, tree: Tree[_Leaf_T]):
|
|
981
|
-
f = getattr(self, tree.data)
|
|
982
|
-
wrapper = getattr(f, "visit_wrapper", None)
|
|
983
|
-
if wrapper is not None:
|
|
984
|
-
return f.visit_wrapper(f, tree.data, tree.children, tree.meta)
|
|
985
|
-
else:
|
|
986
|
-
return f(tree)
|
|
987
|
-
|
|
988
|
-
def visit_children(self, tree: Tree[_Leaf_T]) -> List:
|
|
989
|
-
return [
|
|
990
|
-
self._visit_tree(child) if isinstance(child, Tree) else child
|
|
991
|
-
for child in tree.children
|
|
992
|
-
]
|
|
993
|
-
|
|
994
|
-
def __getattr__(self, name):
|
|
995
|
-
return self.__default__
|
|
996
|
-
|
|
997
|
-
def __default__(self, tree):
|
|
998
|
-
return self.visit_children(tree)
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
_InterMethod = Callable[[Type[Interpreter], _Return_T], _R]
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
def visit_children_decor(func: _InterMethod) -> _InterMethod:
|
|
1005
|
-
#--
|
|
1006
|
-
|
|
1007
|
-
@wraps(func)
|
|
1008
|
-
def inner(cls, tree):
|
|
1009
|
-
values = cls.visit_children(tree)
|
|
1010
|
-
return func(cls, values)
|
|
1011
|
-
|
|
1012
|
-
return inner
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
##
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
def _apply_v_args(obj, visit_wrapper):
|
|
1020
|
-
try:
|
|
1021
|
-
_apply = obj._apply_v_args
|
|
1022
|
-
except AttributeError:
|
|
1023
|
-
return _VArgsWrapper(obj, visit_wrapper)
|
|
1024
|
-
else:
|
|
1025
|
-
return _apply(visit_wrapper)
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
class _VArgsWrapper:
|
|
1029
|
-
#--
|
|
1030
|
-
|
|
1031
|
-
base_func: Callable
|
|
1032
|
-
|
|
1033
|
-
def __init__(
|
|
1034
|
-
self, func: Callable, visit_wrapper: Callable[[Callable, str, list, Any], Any]
|
|
1035
|
-
):
|
|
1036
|
-
if isinstance(func, _VArgsWrapper):
|
|
1037
|
-
func = func.base_func
|
|
1038
|
-
##
|
|
1039
|
-
|
|
1040
|
-
self.base_func = func ##
|
|
1041
|
-
|
|
1042
|
-
self.visit_wrapper = visit_wrapper
|
|
1043
|
-
update_wrapper(self, func)
|
|
1044
|
-
|
|
1045
|
-
def __call__(self, *args, **kwargs):
|
|
1046
|
-
return self.base_func(*args, **kwargs)
|
|
1047
|
-
|
|
1048
|
-
def __get__(self, instance, owner=None):
|
|
1049
|
-
try:
|
|
1050
|
-
##
|
|
1051
|
-
|
|
1052
|
-
##
|
|
1053
|
-
|
|
1054
|
-
g = type(self.base_func).__get__
|
|
1055
|
-
except AttributeError:
|
|
1056
|
-
return self
|
|
1057
|
-
else:
|
|
1058
|
-
return _VArgsWrapper(g(self.base_func, instance, owner), self.visit_wrapper)
|
|
1059
|
-
|
|
1060
|
-
def __set_name__(self, owner, name):
|
|
1061
|
-
try:
|
|
1062
|
-
f = type(self.base_func).__set_name__
|
|
1063
|
-
except AttributeError:
|
|
1064
|
-
return
|
|
1065
|
-
else:
|
|
1066
|
-
f(self.base_func, owner, name)
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
def _vargs_inline(f, _data, children, _meta):
|
|
1070
|
-
return f(*children)
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
def _vargs_meta_inline(f, _data, children, meta):
|
|
1074
|
-
return f(meta, *children)
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
def _vargs_meta(f, _data, children, meta):
|
|
1078
|
-
return f(meta, children)
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
def _vargs_tree(f, data, children, meta):
|
|
1082
|
-
return f(Tree(data, children, meta))
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
def v_args(
|
|
1086
|
-
inline: bool = False,
|
|
1087
|
-
meta: bool = False,
|
|
1088
|
-
tree: bool = False,
|
|
1089
|
-
wrapper: Optional[Callable] = None,
|
|
1090
|
-
) -> Callable[[_DECORATED], _DECORATED]:
|
|
1091
|
-
#--
|
|
1092
|
-
if tree and (meta or inline):
|
|
1093
|
-
raise ValueError(
|
|
1094
|
-
"Visitor functions cannot combine 'tree' with 'meta' or 'inline'."
|
|
1095
|
-
)
|
|
1096
|
-
|
|
1097
|
-
func = None
|
|
1098
|
-
if meta:
|
|
1099
|
-
if inline:
|
|
1100
|
-
func = _vargs_meta_inline
|
|
1101
|
-
else:
|
|
1102
|
-
func = _vargs_meta
|
|
1103
|
-
elif inline:
|
|
1104
|
-
func = _vargs_inline
|
|
1105
|
-
elif tree:
|
|
1106
|
-
func = _vargs_tree
|
|
1107
|
-
|
|
1108
|
-
if wrapper is not None:
|
|
1109
|
-
if func is not None:
|
|
1110
|
-
raise ValueError(
|
|
1111
|
-
"Cannot use 'wrapper' along with 'tree', 'meta' or 'inline'."
|
|
1112
|
-
)
|
|
1113
|
-
func = wrapper
|
|
1114
|
-
|
|
1115
|
-
def _visitor_args_dec(obj):
|
|
1116
|
-
return _apply_v_args(obj, func)
|
|
1117
|
-
|
|
1118
|
-
return _visitor_args_dec
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
TOKEN_DEFAULT_PRIORITY = 0
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
class Symbol(Serialize):
|
|
1126
|
-
__slots__ = ("name",)
|
|
1127
|
-
|
|
1128
|
-
name: str
|
|
1129
|
-
is_term: ClassVar[bool] = NotImplemented
|
|
1130
|
-
|
|
1131
|
-
def __init__(self, name: str) -> None:
|
|
1132
|
-
self.name = name
|
|
1133
|
-
|
|
1134
|
-
def __eq__(self, other):
|
|
1135
|
-
assert isinstance(other, Symbol), other
|
|
1136
|
-
return self.is_term == other.is_term and self.name == other.name
|
|
1137
|
-
|
|
1138
|
-
def __ne__(self, other):
|
|
1139
|
-
return not (self == other)
|
|
1140
|
-
|
|
1141
|
-
def __hash__(self):
|
|
1142
|
-
return hash(self.name)
|
|
1143
|
-
|
|
1144
|
-
def __repr__(self):
|
|
1145
|
-
return "%s(%r)" % (type(self).__name__, self.name)
|
|
1146
|
-
|
|
1147
|
-
fullrepr = property(__repr__)
|
|
1148
|
-
|
|
1149
|
-
def renamed(self, f):
|
|
1150
|
-
return type(self)(f(self.name))
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
class Terminal(Symbol):
|
|
1154
|
-
__serialize_fields__ = "name", "filter_out"
|
|
1155
|
-
|
|
1156
|
-
is_term: ClassVar[bool] = True
|
|
1157
|
-
|
|
1158
|
-
def __init__(self, name, filter_out=False):
|
|
1159
|
-
self.name = name
|
|
1160
|
-
self.filter_out = filter_out
|
|
1161
|
-
|
|
1162
|
-
@property
|
|
1163
|
-
def fullrepr(self):
|
|
1164
|
-
return "%s(%r, %r)" % (type(self).__name__, self.name, self.filter_out)
|
|
1165
|
-
|
|
1166
|
-
def renamed(self, f):
|
|
1167
|
-
return type(self)(f(self.name), self.filter_out)
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
class NonTerminal(Symbol):
|
|
1171
|
-
__serialize_fields__ = ("name",)
|
|
1172
|
-
|
|
1173
|
-
is_term: ClassVar[bool] = False
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
class RuleOptions(Serialize):
|
|
1177
|
-
__serialize_fields__ = (
|
|
1178
|
-
"keep_all_tokens",
|
|
1179
|
-
"expand1",
|
|
1180
|
-
"priority",
|
|
1181
|
-
"template_source",
|
|
1182
|
-
"empty_indices",
|
|
1183
|
-
)
|
|
1184
|
-
|
|
1185
|
-
keep_all_tokens: bool
|
|
1186
|
-
expand1: bool
|
|
1187
|
-
priority: Optional[int]
|
|
1188
|
-
template_source: Optional[str]
|
|
1189
|
-
empty_indices: Tuple[bool, ...]
|
|
1190
|
-
|
|
1191
|
-
def __init__(
|
|
1192
|
-
self,
|
|
1193
|
-
keep_all_tokens: bool = False,
|
|
1194
|
-
expand1: bool = False,
|
|
1195
|
-
priority: Optional[int] = None,
|
|
1196
|
-
template_source: Optional[str] = None,
|
|
1197
|
-
empty_indices: Tuple[bool, ...] = (),
|
|
1198
|
-
) -> None:
|
|
1199
|
-
self.keep_all_tokens = keep_all_tokens
|
|
1200
|
-
self.expand1 = expand1
|
|
1201
|
-
self.priority = priority
|
|
1202
|
-
self.template_source = template_source
|
|
1203
|
-
self.empty_indices = empty_indices
|
|
1204
|
-
|
|
1205
|
-
def __repr__(self):
|
|
1206
|
-
return "RuleOptions(%r, %r, %r, %r)" % (
|
|
1207
|
-
self.keep_all_tokens,
|
|
1208
|
-
self.expand1,
|
|
1209
|
-
self.priority,
|
|
1210
|
-
self.template_source,
|
|
1211
|
-
)
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
class Rule(Serialize):
|
|
1215
|
-
#--
|
|
1216
|
-
|
|
1217
|
-
__slots__ = ("origin", "expansion", "alias", "options", "order", "_hash")
|
|
1218
|
-
|
|
1219
|
-
__serialize_fields__ = "origin", "expansion", "order", "alias", "options"
|
|
1220
|
-
__serialize_namespace__ = Terminal, NonTerminal, RuleOptions
|
|
1221
|
-
|
|
1222
|
-
origin: NonTerminal
|
|
1223
|
-
expansion: Sequence[Symbol]
|
|
1224
|
-
order: int
|
|
1225
|
-
alias: Optional[str]
|
|
1226
|
-
options: RuleOptions
|
|
1227
|
-
_hash: int
|
|
1228
|
-
|
|
1229
|
-
def __init__(
|
|
1230
|
-
self,
|
|
1231
|
-
origin: NonTerminal,
|
|
1232
|
-
expansion: Sequence[Symbol],
|
|
1233
|
-
order: int = 0,
|
|
1234
|
-
alias: Optional[str] = None,
|
|
1235
|
-
options: Optional[RuleOptions] = None,
|
|
1236
|
-
):
|
|
1237
|
-
self.origin = origin
|
|
1238
|
-
self.expansion = expansion
|
|
1239
|
-
self.alias = alias
|
|
1240
|
-
self.order = order
|
|
1241
|
-
self.options = options or RuleOptions()
|
|
1242
|
-
self._hash = hash((self.origin, tuple(self.expansion)))
|
|
1243
|
-
|
|
1244
|
-
def _deserialize(self):
|
|
1245
|
-
self._hash = hash((self.origin, tuple(self.expansion)))
|
|
1246
|
-
|
|
1247
|
-
def __str__(self):
|
|
1248
|
-
return "<%s : %s>" % (
|
|
1249
|
-
self.origin.name,
|
|
1250
|
-
" ".join(x.name for x in self.expansion),
|
|
1251
|
-
)
|
|
1252
|
-
|
|
1253
|
-
def __repr__(self):
|
|
1254
|
-
return "Rule(%r, %r, %r, %r)" % (
|
|
1255
|
-
self.origin,
|
|
1256
|
-
self.expansion,
|
|
1257
|
-
self.alias,
|
|
1258
|
-
self.options,
|
|
1259
|
-
)
|
|
1260
|
-
|
|
1261
|
-
def __hash__(self):
|
|
1262
|
-
return self._hash
|
|
1263
|
-
|
|
1264
|
-
def __eq__(self, other):
|
|
1265
|
-
if not isinstance(other, Rule):
|
|
1266
|
-
return False
|
|
1267
|
-
return self.origin == other.origin and self.expansion == other.expansion
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
from copy import copy
|
|
1272
|
-
|
|
1273
|
-
try: ##
|
|
1274
|
-
|
|
1275
|
-
has_interegular = bool(interegular)
|
|
1276
|
-
except NameError:
|
|
1277
|
-
has_interegular = False
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
class Pattern(Serialize, ABC):
|
|
1281
|
-
#--
|
|
1282
|
-
|
|
1283
|
-
value: str
|
|
1284
|
-
flags: Collection[str]
|
|
1285
|
-
raw: Optional[str]
|
|
1286
|
-
type: ClassVar[str]
|
|
1287
|
-
|
|
1288
|
-
def __init__(
|
|
1289
|
-
self, value: str, flags: Collection[str] = (), raw: Optional[str] = None
|
|
1290
|
-
) -> None:
|
|
1291
|
-
self.value = value
|
|
1292
|
-
self.flags = frozenset(flags)
|
|
1293
|
-
self.raw = raw
|
|
1294
|
-
|
|
1295
|
-
def __repr__(self):
|
|
1296
|
-
return repr(self.to_regexp())
|
|
1297
|
-
|
|
1298
|
-
##
|
|
1299
|
-
|
|
1300
|
-
def __hash__(self):
|
|
1301
|
-
return hash((type(self), self.value, self.flags))
|
|
1302
|
-
|
|
1303
|
-
def __eq__(self, other):
|
|
1304
|
-
return (
|
|
1305
|
-
type(self) == type(other)
|
|
1306
|
-
and self.value == other.value
|
|
1307
|
-
and self.flags == other.flags
|
|
1308
|
-
)
|
|
1309
|
-
|
|
1310
|
-
@abstractmethod
|
|
1311
|
-
def to_regexp(self) -> str:
|
|
1312
|
-
raise NotImplementedError()
|
|
1313
|
-
|
|
1314
|
-
@property
|
|
1315
|
-
@abstractmethod
|
|
1316
|
-
def min_width(self) -> int:
|
|
1317
|
-
raise NotImplementedError()
|
|
1318
|
-
|
|
1319
|
-
@property
|
|
1320
|
-
@abstractmethod
|
|
1321
|
-
def max_width(self) -> int:
|
|
1322
|
-
raise NotImplementedError()
|
|
1323
|
-
|
|
1324
|
-
def _get_flags(self, value):
|
|
1325
|
-
for f in self.flags:
|
|
1326
|
-
value = "(?%s:%s)" % (f, value)
|
|
1327
|
-
return value
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
class PatternStr(Pattern):
|
|
1331
|
-
__serialize_fields__ = "value", "flags", "raw"
|
|
1332
|
-
|
|
1333
|
-
type: ClassVar[str] = "str"
|
|
1334
|
-
|
|
1335
|
-
def to_regexp(self) -> str:
|
|
1336
|
-
return self._get_flags(re.escape(self.value))
|
|
1337
|
-
|
|
1338
|
-
@property
|
|
1339
|
-
def min_width(self) -> int:
|
|
1340
|
-
return len(self.value)
|
|
1341
|
-
|
|
1342
|
-
@property
|
|
1343
|
-
def max_width(self) -> int:
|
|
1344
|
-
return len(self.value)
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
class PatternRE(Pattern):
|
|
1348
|
-
__serialize_fields__ = "value", "flags", "raw", "_width"
|
|
1349
|
-
|
|
1350
|
-
type: ClassVar[str] = "re"
|
|
1351
|
-
|
|
1352
|
-
def to_regexp(self) -> str:
|
|
1353
|
-
return self._get_flags(self.value)
|
|
1354
|
-
|
|
1355
|
-
_width = None
|
|
1356
|
-
|
|
1357
|
-
def _get_width(self):
|
|
1358
|
-
if self._width is None:
|
|
1359
|
-
self._width = get_regexp_width(self.to_regexp())
|
|
1360
|
-
return self._width
|
|
1361
|
-
|
|
1362
|
-
@property
|
|
1363
|
-
def min_width(self) -> int:
|
|
1364
|
-
return self._get_width()[0]
|
|
1365
|
-
|
|
1366
|
-
@property
|
|
1367
|
-
def max_width(self) -> int:
|
|
1368
|
-
return self._get_width()[1]
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
class TerminalDef(Serialize):
|
|
1372
|
-
#--
|
|
1373
|
-
__serialize_fields__ = "name", "pattern", "priority"
|
|
1374
|
-
__serialize_namespace__ = PatternStr, PatternRE
|
|
1375
|
-
|
|
1376
|
-
name: str
|
|
1377
|
-
pattern: Pattern
|
|
1378
|
-
priority: int
|
|
1379
|
-
|
|
1380
|
-
def __init__(
|
|
1381
|
-
self, name: str, pattern: Pattern, priority: int = TOKEN_DEFAULT_PRIORITY
|
|
1382
|
-
) -> None:
|
|
1383
|
-
assert isinstance(pattern, Pattern), pattern
|
|
1384
|
-
self.name = name
|
|
1385
|
-
self.pattern = pattern
|
|
1386
|
-
self.priority = priority
|
|
1387
|
-
|
|
1388
|
-
def __repr__(self):
|
|
1389
|
-
return "%s(%r, %r)" % (type(self).__name__, self.name, self.pattern)
|
|
1390
|
-
|
|
1391
|
-
def user_repr(self) -> str:
|
|
1392
|
-
if self.name.startswith("__"): ##
|
|
1393
|
-
|
|
1394
|
-
return self.pattern.raw or self.name
|
|
1395
|
-
else:
|
|
1396
|
-
return self.name
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
_T = TypeVar("_T", bound="Token")
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
class Token(str):
|
|
1403
|
-
#--
|
|
1404
|
-
|
|
1405
|
-
__slots__ = (
|
|
1406
|
-
"type",
|
|
1407
|
-
"start_pos",
|
|
1408
|
-
"value",
|
|
1409
|
-
"line",
|
|
1410
|
-
"column",
|
|
1411
|
-
"end_line",
|
|
1412
|
-
"end_column",
|
|
1413
|
-
"end_pos",
|
|
1414
|
-
)
|
|
1415
|
-
|
|
1416
|
-
__match_args__ = ("type", "value")
|
|
1417
|
-
|
|
1418
|
-
type: str
|
|
1419
|
-
start_pos: Optional[int]
|
|
1420
|
-
value: Any
|
|
1421
|
-
line: Optional[int]
|
|
1422
|
-
column: Optional[int]
|
|
1423
|
-
end_line: Optional[int]
|
|
1424
|
-
end_column: Optional[int]
|
|
1425
|
-
end_pos: Optional[int]
|
|
1426
|
-
|
|
1427
|
-
@overload
|
|
1428
|
-
def __new__(
|
|
1429
|
-
cls,
|
|
1430
|
-
type: str,
|
|
1431
|
-
value: Any,
|
|
1432
|
-
start_pos: Optional[int] = None,
|
|
1433
|
-
line: Optional[int] = None,
|
|
1434
|
-
column: Optional[int] = None,
|
|
1435
|
-
end_line: Optional[int] = None,
|
|
1436
|
-
end_column: Optional[int] = None,
|
|
1437
|
-
end_pos: Optional[int] = None,
|
|
1438
|
-
) -> "Token": ...
|
|
1439
|
-
|
|
1440
|
-
@overload
|
|
1441
|
-
def __new__(
|
|
1442
|
-
cls,
|
|
1443
|
-
type_: str,
|
|
1444
|
-
value: Any,
|
|
1445
|
-
start_pos: Optional[int] = None,
|
|
1446
|
-
line: Optional[int] = None,
|
|
1447
|
-
column: Optional[int] = None,
|
|
1448
|
-
end_line: Optional[int] = None,
|
|
1449
|
-
end_column: Optional[int] = None,
|
|
1450
|
-
end_pos: Optional[int] = None,
|
|
1451
|
-
) -> "Token": ...
|
|
1452
|
-
|
|
1453
|
-
def __new__(cls, *args, **kwargs):
|
|
1454
|
-
if "type_" in kwargs:
|
|
1455
|
-
warnings.warn(
|
|
1456
|
-
"`type_` is deprecated use `type` instead", DeprecationWarning
|
|
1457
|
-
)
|
|
1458
|
-
|
|
1459
|
-
if "type" in kwargs:
|
|
1460
|
-
raise TypeError(
|
|
1461
|
-
"Error: using both 'type' and the deprecated 'type_' as arguments."
|
|
1462
|
-
)
|
|
1463
|
-
kwargs["type"] = kwargs.pop("type_")
|
|
1464
|
-
|
|
1465
|
-
return cls._future_new(*args, **kwargs)
|
|
1466
|
-
|
|
1467
|
-
@classmethod
|
|
1468
|
-
def _future_new(
|
|
1469
|
-
cls,
|
|
1470
|
-
type,
|
|
1471
|
-
value,
|
|
1472
|
-
start_pos=None,
|
|
1473
|
-
line=None,
|
|
1474
|
-
column=None,
|
|
1475
|
-
end_line=None,
|
|
1476
|
-
end_column=None,
|
|
1477
|
-
end_pos=None,
|
|
1478
|
-
):
|
|
1479
|
-
inst = super(Token, cls).__new__(cls, value)
|
|
1480
|
-
|
|
1481
|
-
inst.type = type
|
|
1482
|
-
inst.start_pos = start_pos
|
|
1483
|
-
inst.value = value
|
|
1484
|
-
inst.line = line
|
|
1485
|
-
inst.column = column
|
|
1486
|
-
inst.end_line = end_line
|
|
1487
|
-
inst.end_column = end_column
|
|
1488
|
-
inst.end_pos = end_pos
|
|
1489
|
-
return inst
|
|
1490
|
-
|
|
1491
|
-
@overload
|
|
1492
|
-
def update(
|
|
1493
|
-
self, type: Optional[str] = None, value: Optional[Any] = None
|
|
1494
|
-
) -> "Token": ...
|
|
1495
|
-
|
|
1496
|
-
@overload
|
|
1497
|
-
def update(
|
|
1498
|
-
self, type_: Optional[str] = None, value: Optional[Any] = None
|
|
1499
|
-
) -> "Token": ...
|
|
1500
|
-
|
|
1501
|
-
def update(self, *args, **kwargs):
|
|
1502
|
-
if "type_" in kwargs:
|
|
1503
|
-
warnings.warn(
|
|
1504
|
-
"`type_` is deprecated use `type` instead", DeprecationWarning
|
|
1505
|
-
)
|
|
1506
|
-
|
|
1507
|
-
if "type" in kwargs:
|
|
1508
|
-
raise TypeError(
|
|
1509
|
-
"Error: using both 'type' and the deprecated 'type_' as arguments."
|
|
1510
|
-
)
|
|
1511
|
-
kwargs["type"] = kwargs.pop("type_")
|
|
1512
|
-
|
|
1513
|
-
return self._future_update(*args, **kwargs)
|
|
1514
|
-
|
|
1515
|
-
def _future_update(
|
|
1516
|
-
self, type: Optional[str] = None, value: Optional[Any] = None
|
|
1517
|
-
) -> "Token":
|
|
1518
|
-
return Token.new_borrow_pos(
|
|
1519
|
-
type if type is not None else self.type,
|
|
1520
|
-
value if value is not None else self.value,
|
|
1521
|
-
self,
|
|
1522
|
-
)
|
|
1523
|
-
|
|
1524
|
-
@classmethod
|
|
1525
|
-
def new_borrow_pos(cls: Type[_T], type_: str, value: Any, borrow_t: "Token") -> _T:
|
|
1526
|
-
return cls(
|
|
1527
|
-
type_,
|
|
1528
|
-
value,
|
|
1529
|
-
borrow_t.start_pos,
|
|
1530
|
-
borrow_t.line,
|
|
1531
|
-
borrow_t.column,
|
|
1532
|
-
borrow_t.end_line,
|
|
1533
|
-
borrow_t.end_column,
|
|
1534
|
-
borrow_t.end_pos,
|
|
1535
|
-
)
|
|
1536
|
-
|
|
1537
|
-
def __reduce__(self):
|
|
1538
|
-
return (
|
|
1539
|
-
self.__class__,
|
|
1540
|
-
(self.type, self.value, self.start_pos, self.line, self.column),
|
|
1541
|
-
)
|
|
1542
|
-
|
|
1543
|
-
def __repr__(self):
|
|
1544
|
-
return "Token(%r, %r)" % (self.type, self.value)
|
|
1545
|
-
|
|
1546
|
-
def __deepcopy__(self, memo):
|
|
1547
|
-
return Token(self.type, self.value, self.start_pos, self.line, self.column)
|
|
1548
|
-
|
|
1549
|
-
def __eq__(self, other):
|
|
1550
|
-
if isinstance(other, Token) and self.type != other.type:
|
|
1551
|
-
return False
|
|
1552
|
-
|
|
1553
|
-
return str.__eq__(self, other)
|
|
1554
|
-
|
|
1555
|
-
__hash__ = str.__hash__
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
class LineCounter:
|
|
1559
|
-
#--
|
|
1560
|
-
|
|
1561
|
-
__slots__ = "char_pos", "line", "column", "line_start_pos", "newline_char"
|
|
1562
|
-
|
|
1563
|
-
def __init__(self, newline_char):
|
|
1564
|
-
self.newline_char = newline_char
|
|
1565
|
-
self.char_pos = 0
|
|
1566
|
-
self.line = 1
|
|
1567
|
-
self.column = 1
|
|
1568
|
-
self.line_start_pos = 0
|
|
1569
|
-
|
|
1570
|
-
def __eq__(self, other):
|
|
1571
|
-
if not isinstance(other, LineCounter):
|
|
1572
|
-
return NotImplemented
|
|
1573
|
-
|
|
1574
|
-
return (
|
|
1575
|
-
self.char_pos == other.char_pos and self.newline_char == other.newline_char
|
|
1576
|
-
)
|
|
1577
|
-
|
|
1578
|
-
def feed(self, token: Token, test_newline=True):
|
|
1579
|
-
#--
|
|
1580
|
-
if test_newline:
|
|
1581
|
-
newlines = token.count(self.newline_char)
|
|
1582
|
-
if newlines:
|
|
1583
|
-
self.line += newlines
|
|
1584
|
-
self.line_start_pos = (
|
|
1585
|
-
self.char_pos + token.rindex(self.newline_char) + 1
|
|
1586
|
-
)
|
|
1587
|
-
|
|
1588
|
-
self.char_pos += len(token)
|
|
1589
|
-
self.column = self.char_pos - self.line_start_pos + 1
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
class UnlessCallback:
|
|
1593
|
-
def __init__(self, scanner):
|
|
1594
|
-
self.scanner = scanner
|
|
1595
|
-
|
|
1596
|
-
def __call__(self, t):
|
|
1597
|
-
res = self.scanner.match(t.value, 0)
|
|
1598
|
-
if res:
|
|
1599
|
-
_value, t.type = res
|
|
1600
|
-
return t
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
class CallChain:
|
|
1604
|
-
def __init__(self, callback1, callback2, cond):
|
|
1605
|
-
self.callback1 = callback1
|
|
1606
|
-
self.callback2 = callback2
|
|
1607
|
-
self.cond = cond
|
|
1608
|
-
|
|
1609
|
-
def __call__(self, t):
|
|
1610
|
-
t2 = self.callback1(t)
|
|
1611
|
-
return self.callback2(t) if self.cond(t2) else t2
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
def _get_match(re_, regexp, s, flags):
|
|
1615
|
-
m = re_.match(regexp, s, flags)
|
|
1616
|
-
if m:
|
|
1617
|
-
return m.group(0)
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
def _create_unless(terminals, g_regex_flags, re_, use_bytes):
|
|
1621
|
-
tokens_by_type = classify(terminals, lambda t: type(t.pattern))
|
|
1622
|
-
assert len(tokens_by_type) <= 2, tokens_by_type.keys()
|
|
1623
|
-
embedded_strs = set()
|
|
1624
|
-
callback = {}
|
|
1625
|
-
for retok in tokens_by_type.get(PatternRE, []):
|
|
1626
|
-
unless = []
|
|
1627
|
-
for strtok in tokens_by_type.get(PatternStr, []):
|
|
1628
|
-
if strtok.priority != retok.priority:
|
|
1629
|
-
continue
|
|
1630
|
-
s = strtok.pattern.value
|
|
1631
|
-
if s == _get_match(re_, retok.pattern.to_regexp(), s, g_regex_flags):
|
|
1632
|
-
unless.append(strtok)
|
|
1633
|
-
if strtok.pattern.flags <= retok.pattern.flags:
|
|
1634
|
-
embedded_strs.add(strtok)
|
|
1635
|
-
if unless:
|
|
1636
|
-
callback[retok.name] = UnlessCallback(
|
|
1637
|
-
Scanner(
|
|
1638
|
-
unless, g_regex_flags, re_, match_whole=True, use_bytes=use_bytes
|
|
1639
|
-
)
|
|
1640
|
-
)
|
|
1641
|
-
|
|
1642
|
-
new_terminals = [t for t in terminals if t not in embedded_strs]
|
|
1643
|
-
return new_terminals, callback
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
class Scanner:
|
|
1647
|
-
def __init__(self, terminals, g_regex_flags, re_, use_bytes, match_whole=False):
|
|
1648
|
-
self.terminals = terminals
|
|
1649
|
-
self.g_regex_flags = g_regex_flags
|
|
1650
|
-
self.re_ = re_
|
|
1651
|
-
self.use_bytes = use_bytes
|
|
1652
|
-
self.match_whole = match_whole
|
|
1653
|
-
|
|
1654
|
-
self.allowed_types = {t.name for t in self.terminals}
|
|
1655
|
-
|
|
1656
|
-
self._mres = self._build_mres(terminals, len(terminals))
|
|
1657
|
-
|
|
1658
|
-
def _build_mres(self, terminals, max_size):
|
|
1659
|
-
##
|
|
1660
|
-
|
|
1661
|
-
##
|
|
1662
|
-
|
|
1663
|
-
##
|
|
1664
|
-
|
|
1665
|
-
postfix = "$" if self.match_whole else ""
|
|
1666
|
-
mres = []
|
|
1667
|
-
while terminals:
|
|
1668
|
-
pattern = "|".join(
|
|
1669
|
-
"(?P<%s>%s)" % (t.name, t.pattern.to_regexp() + postfix)
|
|
1670
|
-
for t in terminals[:max_size]
|
|
1671
|
-
)
|
|
1672
|
-
if self.use_bytes:
|
|
1673
|
-
pattern = pattern.encode("latin-1")
|
|
1674
|
-
try:
|
|
1675
|
-
mre = self.re_.compile(pattern, self.g_regex_flags)
|
|
1676
|
-
except AssertionError: ##
|
|
1677
|
-
|
|
1678
|
-
return self._build_mres(terminals, max_size // 2)
|
|
1679
|
-
|
|
1680
|
-
mres.append(mre)
|
|
1681
|
-
terminals = terminals[max_size:]
|
|
1682
|
-
return mres
|
|
1683
|
-
|
|
1684
|
-
def match(self, text, pos):
|
|
1685
|
-
for mre in self._mres:
|
|
1686
|
-
m = mre.match(text, pos)
|
|
1687
|
-
if m:
|
|
1688
|
-
return m.group(0), m.lastgroup
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
def _regexp_has_newline(r: str):
|
|
1692
|
-
#--
|
|
1693
|
-
return (
|
|
1694
|
-
"\n" in r or "\\n" in r or "\\s" in r or "[^" in r or ("(?s" in r and "." in r)
|
|
1695
|
-
)
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
class LexerState:
|
|
1699
|
-
#--
|
|
1700
|
-
|
|
1701
|
-
__slots__ = "text", "line_ctr", "last_token"
|
|
1702
|
-
|
|
1703
|
-
text: str
|
|
1704
|
-
line_ctr: LineCounter
|
|
1705
|
-
last_token: Optional[Token]
|
|
1706
|
-
|
|
1707
|
-
def __init__(
|
|
1708
|
-
self,
|
|
1709
|
-
text: str,
|
|
1710
|
-
line_ctr: Optional[LineCounter] = None,
|
|
1711
|
-
last_token: Optional[Token] = None,
|
|
1712
|
-
):
|
|
1713
|
-
self.text = text
|
|
1714
|
-
self.line_ctr = line_ctr or LineCounter(
|
|
1715
|
-
b"\n" if isinstance(text, bytes) else "\n"
|
|
1716
|
-
)
|
|
1717
|
-
self.last_token = last_token
|
|
1718
|
-
|
|
1719
|
-
def __eq__(self, other):
|
|
1720
|
-
if not isinstance(other, LexerState):
|
|
1721
|
-
return NotImplemented
|
|
1722
|
-
|
|
1723
|
-
return (
|
|
1724
|
-
self.text is other.text
|
|
1725
|
-
and self.line_ctr == other.line_ctr
|
|
1726
|
-
and self.last_token == other.last_token
|
|
1727
|
-
)
|
|
1728
|
-
|
|
1729
|
-
def __copy__(self):
|
|
1730
|
-
return type(self)(self.text, copy(self.line_ctr), self.last_token)
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
class LexerThread:
|
|
1734
|
-
#--
|
|
1735
|
-
|
|
1736
|
-
def __init__(self, lexer: "Lexer", lexer_state: LexerState):
|
|
1737
|
-
self.lexer = lexer
|
|
1738
|
-
self.state = lexer_state
|
|
1739
|
-
|
|
1740
|
-
@classmethod
|
|
1741
|
-
def from_text(cls, lexer: "Lexer", text: str) -> "LexerThread":
|
|
1742
|
-
return cls(lexer, LexerState(text))
|
|
1743
|
-
|
|
1744
|
-
def lex(self, parser_state):
|
|
1745
|
-
return self.lexer.lex(self.state, parser_state)
|
|
1746
|
-
|
|
1747
|
-
def __copy__(self):
|
|
1748
|
-
return type(self)(self.lexer, copy(self.state))
|
|
1749
|
-
|
|
1750
|
-
_Token = Token
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
_Callback = Callable[[Token], Token]
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
class Lexer(ABC):
|
|
1757
|
-
#--
|
|
1758
|
-
|
|
1759
|
-
@abstractmethod
|
|
1760
|
-
def lex(self, lexer_state: LexerState, parser_state: Any) -> Iterator[Token]:
|
|
1761
|
-
return NotImplemented
|
|
1762
|
-
|
|
1763
|
-
def make_lexer_state(self, text):
|
|
1764
|
-
#--
|
|
1765
|
-
return LexerState(text)
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
def _check_regex_collisions(
|
|
1769
|
-
terminal_to_regexp: Dict[TerminalDef, str],
|
|
1770
|
-
comparator,
|
|
1771
|
-
strict_mode,
|
|
1772
|
-
max_collisions_to_show=8,
|
|
1773
|
-
):
|
|
1774
|
-
if not comparator:
|
|
1775
|
-
comparator = interegular.Comparator.from_regexes(terminal_to_regexp)
|
|
1776
|
-
|
|
1777
|
-
##
|
|
1778
|
-
|
|
1779
|
-
##
|
|
1780
|
-
|
|
1781
|
-
max_time = 2 if strict_mode else 0.2
|
|
1782
|
-
|
|
1783
|
-
##
|
|
1784
|
-
|
|
1785
|
-
if comparator.count_marked_pairs() >= max_collisions_to_show:
|
|
1786
|
-
return
|
|
1787
|
-
for group in classify(terminal_to_regexp, lambda t: t.priority).values():
|
|
1788
|
-
for a, b in comparator.check(group, skip_marked=True):
|
|
1789
|
-
assert a.priority == b.priority
|
|
1790
|
-
##
|
|
1791
|
-
|
|
1792
|
-
comparator.mark(a, b)
|
|
1793
|
-
|
|
1794
|
-
##
|
|
1795
|
-
|
|
1796
|
-
message = f"Collision between Terminals {a.name} and {b.name}. "
|
|
1797
|
-
try:
|
|
1798
|
-
example = comparator.get_example_overlap(
|
|
1799
|
-
a, b, max_time
|
|
1800
|
-
).format_multiline()
|
|
1801
|
-
except ValueError:
|
|
1802
|
-
##
|
|
1803
|
-
|
|
1804
|
-
example = "No example could be found fast enough. However, the collision does still exists"
|
|
1805
|
-
if strict_mode:
|
|
1806
|
-
raise LexError(f"{message}\n{example}")
|
|
1807
|
-
logger.warning(
|
|
1808
|
-
"%s The lexer will choose between them arbitrarily.\n%s",
|
|
1809
|
-
message,
|
|
1810
|
-
example,
|
|
1811
|
-
)
|
|
1812
|
-
if comparator.count_marked_pairs() >= max_collisions_to_show:
|
|
1813
|
-
logger.warning("Found 8 regex collisions, will not check for more.")
|
|
1814
|
-
return
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
class AbstractBasicLexer(Lexer):
|
|
1818
|
-
terminals_by_name: Dict[str, TerminalDef]
|
|
1819
|
-
|
|
1820
|
-
@abstractmethod
|
|
1821
|
-
def __init__(self, conf: "LexerConf", comparator=None) -> None: ...
|
|
1822
|
-
|
|
1823
|
-
@abstractmethod
|
|
1824
|
-
def next_token(self, lex_state: LexerState, parser_state: Any = None) -> Token: ...
|
|
1825
|
-
|
|
1826
|
-
def lex(self, state: LexerState, parser_state: Any) -> Iterator[Token]:
|
|
1827
|
-
with suppress(EOFError):
|
|
1828
|
-
while True:
|
|
1829
|
-
yield self.next_token(state, parser_state)
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
class BasicLexer(AbstractBasicLexer):
|
|
1833
|
-
terminals: Collection[TerminalDef]
|
|
1834
|
-
ignore_types: FrozenSet[str]
|
|
1835
|
-
newline_types: FrozenSet[str]
|
|
1836
|
-
user_callbacks: Dict[str, _Callback]
|
|
1837
|
-
callback: Dict[str, _Callback]
|
|
1838
|
-
re: ModuleType
|
|
1839
|
-
|
|
1840
|
-
def __init__(self, conf: "LexerConf", comparator=None) -> None:
|
|
1841
|
-
terminals = list(conf.terminals)
|
|
1842
|
-
assert all(isinstance(t, TerminalDef) for t in terminals), terminals
|
|
1843
|
-
|
|
1844
|
-
self.re = conf.re_module
|
|
1845
|
-
|
|
1846
|
-
if not conf.skip_validation:
|
|
1847
|
-
##
|
|
1848
|
-
|
|
1849
|
-
terminal_to_regexp = {}
|
|
1850
|
-
for t in terminals:
|
|
1851
|
-
regexp = t.pattern.to_regexp()
|
|
1852
|
-
try:
|
|
1853
|
-
self.re.compile(regexp, conf.g_regex_flags)
|
|
1854
|
-
except self.re.error:
|
|
1855
|
-
raise LexError("Cannot compile token %s: %s" % (t.name, t.pattern))
|
|
1856
|
-
|
|
1857
|
-
if t.pattern.min_width == 0:
|
|
1858
|
-
raise LexError(
|
|
1859
|
-
"Lexer does not allow zero-width terminals. (%s: %s)"
|
|
1860
|
-
% (t.name, t.pattern)
|
|
1861
|
-
)
|
|
1862
|
-
if t.pattern.type == "re":
|
|
1863
|
-
terminal_to_regexp[t] = regexp
|
|
1864
|
-
|
|
1865
|
-
if not (set(conf.ignore) <= {t.name for t in terminals}):
|
|
1866
|
-
raise LexError(
|
|
1867
|
-
"Ignore terminals are not defined: %s"
|
|
1868
|
-
% (set(conf.ignore) - {t.name for t in terminals})
|
|
1869
|
-
)
|
|
1870
|
-
|
|
1871
|
-
if has_interegular:
|
|
1872
|
-
_check_regex_collisions(terminal_to_regexp, comparator, conf.strict)
|
|
1873
|
-
elif conf.strict:
|
|
1874
|
-
raise LexError(
|
|
1875
|
-
"interegular must be installed for strict mode. Use `pip install 'lark[interegular]'`."
|
|
1876
|
-
)
|
|
1877
|
-
|
|
1878
|
-
##
|
|
1879
|
-
|
|
1880
|
-
self.newline_types = frozenset(
|
|
1881
|
-
t.name for t in terminals if _regexp_has_newline(t.pattern.to_regexp())
|
|
1882
|
-
)
|
|
1883
|
-
self.ignore_types = frozenset(conf.ignore)
|
|
1884
|
-
|
|
1885
|
-
terminals.sort(
|
|
1886
|
-
key=lambda x: (
|
|
1887
|
-
-x.priority,
|
|
1888
|
-
-x.pattern.max_width,
|
|
1889
|
-
-len(x.pattern.value),
|
|
1890
|
-
x.name,
|
|
1891
|
-
)
|
|
1892
|
-
)
|
|
1893
|
-
self.terminals = terminals
|
|
1894
|
-
self.user_callbacks = conf.callbacks
|
|
1895
|
-
self.g_regex_flags = conf.g_regex_flags
|
|
1896
|
-
self.use_bytes = conf.use_bytes
|
|
1897
|
-
self.terminals_by_name = conf.terminals_by_name
|
|
1898
|
-
|
|
1899
|
-
self._scanner = None
|
|
1900
|
-
|
|
1901
|
-
def _build_scanner(self):
|
|
1902
|
-
terminals, self.callback = _create_unless(
|
|
1903
|
-
self.terminals, self.g_regex_flags, self.re, self.use_bytes
|
|
1904
|
-
)
|
|
1905
|
-
assert all(self.callback.values())
|
|
1906
|
-
|
|
1907
|
-
for type_, f in self.user_callbacks.items():
|
|
1908
|
-
if type_ in self.callback:
|
|
1909
|
-
##
|
|
1910
|
-
|
|
1911
|
-
self.callback[type_] = CallChain(
|
|
1912
|
-
self.callback[type_], f, lambda t: t.type == type_
|
|
1913
|
-
)
|
|
1914
|
-
else:
|
|
1915
|
-
self.callback[type_] = f
|
|
1916
|
-
|
|
1917
|
-
self._scanner = Scanner(terminals, self.g_regex_flags, self.re, self.use_bytes)
|
|
1918
|
-
|
|
1919
|
-
@property
|
|
1920
|
-
def scanner(self):
|
|
1921
|
-
if self._scanner is None:
|
|
1922
|
-
self._build_scanner()
|
|
1923
|
-
return self._scanner
|
|
1924
|
-
|
|
1925
|
-
def match(self, text, pos):
|
|
1926
|
-
return self.scanner.match(text, pos)
|
|
1927
|
-
|
|
1928
|
-
def next_token(self, lex_state: LexerState, parser_state: Any = None) -> Token:
|
|
1929
|
-
line_ctr = lex_state.line_ctr
|
|
1930
|
-
while line_ctr.char_pos < len(lex_state.text):
|
|
1931
|
-
res = self.match(lex_state.text, line_ctr.char_pos)
|
|
1932
|
-
if not res:
|
|
1933
|
-
allowed = self.scanner.allowed_types - self.ignore_types
|
|
1934
|
-
if not allowed:
|
|
1935
|
-
allowed = {"<END-OF-FILE>"}
|
|
1936
|
-
raise UnexpectedCharacters(
|
|
1937
|
-
lex_state.text,
|
|
1938
|
-
line_ctr.char_pos,
|
|
1939
|
-
line_ctr.line,
|
|
1940
|
-
line_ctr.column,
|
|
1941
|
-
allowed=allowed,
|
|
1942
|
-
token_history=lex_state.last_token and [lex_state.last_token],
|
|
1943
|
-
state=parser_state,
|
|
1944
|
-
terminals_by_name=self.terminals_by_name,
|
|
1945
|
-
)
|
|
1946
|
-
|
|
1947
|
-
value, type_ = res
|
|
1948
|
-
|
|
1949
|
-
ignored = type_ in self.ignore_types
|
|
1950
|
-
t = None
|
|
1951
|
-
if not ignored or type_ in self.callback:
|
|
1952
|
-
t = Token(
|
|
1953
|
-
type_, value, line_ctr.char_pos, line_ctr.line, line_ctr.column
|
|
1954
|
-
)
|
|
1955
|
-
line_ctr.feed(value, type_ in self.newline_types)
|
|
1956
|
-
if t is not None:
|
|
1957
|
-
t.end_line = line_ctr.line
|
|
1958
|
-
t.end_column = line_ctr.column
|
|
1959
|
-
t.end_pos = line_ctr.char_pos
|
|
1960
|
-
if t.type in self.callback:
|
|
1961
|
-
t = self.callback[t.type](t)
|
|
1962
|
-
if not ignored:
|
|
1963
|
-
if not isinstance(t, Token):
|
|
1964
|
-
raise LexError(
|
|
1965
|
-
"Callbacks must return a token (returned %r)" % t
|
|
1966
|
-
)
|
|
1967
|
-
lex_state.last_token = t
|
|
1968
|
-
return t
|
|
1969
|
-
|
|
1970
|
-
##
|
|
1971
|
-
|
|
1972
|
-
raise EOFError(self)
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
class ContextualLexer(Lexer):
|
|
1976
|
-
lexers: Dict[int, AbstractBasicLexer]
|
|
1977
|
-
root_lexer: AbstractBasicLexer
|
|
1978
|
-
|
|
1979
|
-
BasicLexer: Type[AbstractBasicLexer] = BasicLexer
|
|
1980
|
-
|
|
1981
|
-
def __init__(
|
|
1982
|
-
self,
|
|
1983
|
-
conf: "LexerConf",
|
|
1984
|
-
states: Dict[int, Collection[str]],
|
|
1985
|
-
always_accept: Collection[str] = (),
|
|
1986
|
-
) -> None:
|
|
1987
|
-
terminals = list(conf.terminals)
|
|
1988
|
-
terminals_by_name = conf.terminals_by_name
|
|
1989
|
-
|
|
1990
|
-
trad_conf = copy(conf)
|
|
1991
|
-
trad_conf.terminals = terminals
|
|
1992
|
-
|
|
1993
|
-
if has_interegular and not conf.skip_validation:
|
|
1994
|
-
comparator = interegular.Comparator.from_regexes(
|
|
1995
|
-
{t: t.pattern.to_regexp() for t in terminals}
|
|
1996
|
-
)
|
|
1997
|
-
else:
|
|
1998
|
-
comparator = None
|
|
1999
|
-
lexer_by_tokens: Dict[FrozenSet[str], AbstractBasicLexer] = {}
|
|
2000
|
-
self.lexers = {}
|
|
2001
|
-
for state, accepts in states.items():
|
|
2002
|
-
key = frozenset(accepts)
|
|
2003
|
-
try:
|
|
2004
|
-
lexer = lexer_by_tokens[key]
|
|
2005
|
-
except KeyError:
|
|
2006
|
-
accepts = set(accepts) | set(conf.ignore) | set(always_accept)
|
|
2007
|
-
lexer_conf = copy(trad_conf)
|
|
2008
|
-
lexer_conf.terminals = [
|
|
2009
|
-
terminals_by_name[n] for n in accepts if n in terminals_by_name
|
|
2010
|
-
]
|
|
2011
|
-
lexer = self.BasicLexer(lexer_conf, comparator)
|
|
2012
|
-
lexer_by_tokens[key] = lexer
|
|
2013
|
-
|
|
2014
|
-
self.lexers[state] = lexer
|
|
2015
|
-
|
|
2016
|
-
assert trad_conf.terminals is terminals
|
|
2017
|
-
trad_conf.skip_validation = True ##
|
|
2018
|
-
|
|
2019
|
-
self.root_lexer = self.BasicLexer(trad_conf, comparator)
|
|
2020
|
-
|
|
2021
|
-
def lex(
|
|
2022
|
-
self, lexer_state: LexerState, parser_state: "ParserState"
|
|
2023
|
-
) -> Iterator[Token]:
|
|
2024
|
-
try:
|
|
2025
|
-
while True:
|
|
2026
|
-
lexer = self.lexers[parser_state.position]
|
|
2027
|
-
yield lexer.next_token(lexer_state, parser_state)
|
|
2028
|
-
except EOFError:
|
|
2029
|
-
pass
|
|
2030
|
-
except UnexpectedCharacters as e:
|
|
2031
|
-
##
|
|
2032
|
-
|
|
2033
|
-
##
|
|
2034
|
-
|
|
2035
|
-
try:
|
|
2036
|
-
last_token = (
|
|
2037
|
-
lexer_state.last_token
|
|
2038
|
-
) ##
|
|
2039
|
-
|
|
2040
|
-
token = self.root_lexer.next_token(lexer_state, parser_state)
|
|
2041
|
-
raise UnexpectedToken(
|
|
2042
|
-
token,
|
|
2043
|
-
e.allowed,
|
|
2044
|
-
state=parser_state,
|
|
2045
|
-
token_history=[last_token],
|
|
2046
|
-
terminals_by_name=self.root_lexer.terminals_by_name,
|
|
2047
|
-
)
|
|
2048
|
-
except UnexpectedCharacters:
|
|
2049
|
-
raise e ##
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
_ParserArgType: "TypeAlias" = 'Literal["earley", "lalr", "cyk", "auto"]'
|
|
2056
|
-
_LexerArgType: "TypeAlias" = (
|
|
2057
|
-
'Union[Literal["auto", "basic", "contextual", "dynamic", "dynamic_complete"], Type[Lexer]]'
|
|
2058
|
-
)
|
|
2059
|
-
_LexerCallback = Callable[[Token], Token]
|
|
2060
|
-
ParserCallbacks = Dict[str, Callable]
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
class LexerConf(Serialize):
|
|
2064
|
-
__serialize_fields__ = (
|
|
2065
|
-
"terminals",
|
|
2066
|
-
"ignore",
|
|
2067
|
-
"g_regex_flags",
|
|
2068
|
-
"use_bytes",
|
|
2069
|
-
"lexer_type",
|
|
2070
|
-
)
|
|
2071
|
-
__serialize_namespace__ = (TerminalDef,)
|
|
2072
|
-
|
|
2073
|
-
terminals: Collection[TerminalDef]
|
|
2074
|
-
re_module: ModuleType
|
|
2075
|
-
ignore: Collection[str]
|
|
2076
|
-
postlex: "Optional[PostLex]"
|
|
2077
|
-
callbacks: Dict[str, _LexerCallback]
|
|
2078
|
-
g_regex_flags: int
|
|
2079
|
-
skip_validation: bool
|
|
2080
|
-
use_bytes: bool
|
|
2081
|
-
lexer_type: Optional[_LexerArgType]
|
|
2082
|
-
strict: bool
|
|
2083
|
-
|
|
2084
|
-
def __init__(
|
|
2085
|
-
self,
|
|
2086
|
-
terminals: Collection[TerminalDef],
|
|
2087
|
-
re_module: ModuleType,
|
|
2088
|
-
ignore: Collection[str] = (),
|
|
2089
|
-
postlex: "Optional[PostLex]" = None,
|
|
2090
|
-
callbacks: Optional[Dict[str, _LexerCallback]] = None,
|
|
2091
|
-
g_regex_flags: int = 0,
|
|
2092
|
-
skip_validation: bool = False,
|
|
2093
|
-
use_bytes: bool = False,
|
|
2094
|
-
strict: bool = False,
|
|
2095
|
-
):
|
|
2096
|
-
self.terminals = terminals
|
|
2097
|
-
self.terminals_by_name = {t.name: t for t in self.terminals}
|
|
2098
|
-
assert len(self.terminals) == len(self.terminals_by_name)
|
|
2099
|
-
self.ignore = ignore
|
|
2100
|
-
self.postlex = postlex
|
|
2101
|
-
self.callbacks = callbacks or {}
|
|
2102
|
-
self.g_regex_flags = g_regex_flags
|
|
2103
|
-
self.re_module = re_module
|
|
2104
|
-
self.skip_validation = skip_validation
|
|
2105
|
-
self.use_bytes = use_bytes
|
|
2106
|
-
self.strict = strict
|
|
2107
|
-
self.lexer_type = None
|
|
2108
|
-
|
|
2109
|
-
def _deserialize(self):
|
|
2110
|
-
self.terminals_by_name = {t.name: t for t in self.terminals}
|
|
2111
|
-
|
|
2112
|
-
def __deepcopy__(self, memo=None):
|
|
2113
|
-
return type(self)(
|
|
2114
|
-
deepcopy(self.terminals, memo),
|
|
2115
|
-
self.re_module,
|
|
2116
|
-
deepcopy(self.ignore, memo),
|
|
2117
|
-
deepcopy(self.postlex, memo),
|
|
2118
|
-
deepcopy(self.callbacks, memo),
|
|
2119
|
-
deepcopy(self.g_regex_flags, memo),
|
|
2120
|
-
deepcopy(self.skip_validation, memo),
|
|
2121
|
-
deepcopy(self.use_bytes, memo),
|
|
2122
|
-
)
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
class ParserConf(Serialize):
|
|
2126
|
-
__serialize_fields__ = "rules", "start", "parser_type"
|
|
2127
|
-
|
|
2128
|
-
rules: List["Rule"]
|
|
2129
|
-
callbacks: ParserCallbacks
|
|
2130
|
-
start: List[str]
|
|
2131
|
-
parser_type: _ParserArgType
|
|
2132
|
-
|
|
2133
|
-
def __init__(
|
|
2134
|
-
self, rules: List["Rule"], callbacks: ParserCallbacks, start: List[str]
|
|
2135
|
-
):
|
|
2136
|
-
assert isinstance(start, list)
|
|
2137
|
-
self.rules = rules
|
|
2138
|
-
self.callbacks = callbacks
|
|
2139
|
-
self.start = start
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
from functools import partial, wraps
|
|
2144
|
-
from itertools import product
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
class ExpandSingleChild:
|
|
2148
|
-
def __init__(self, node_builder):
|
|
2149
|
-
self.node_builder = node_builder
|
|
2150
|
-
|
|
2151
|
-
def __call__(self, children):
|
|
2152
|
-
if len(children) == 1:
|
|
2153
|
-
return children[0]
|
|
2154
|
-
else:
|
|
2155
|
-
return self.node_builder(children)
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
class PropagatePositions:
|
|
2159
|
-
def __init__(self, node_builder, node_filter=None):
|
|
2160
|
-
self.node_builder = node_builder
|
|
2161
|
-
self.node_filter = node_filter
|
|
2162
|
-
|
|
2163
|
-
def __call__(self, children):
|
|
2164
|
-
res = self.node_builder(children)
|
|
2165
|
-
|
|
2166
|
-
if isinstance(res, Tree):
|
|
2167
|
-
##
|
|
2168
|
-
|
|
2169
|
-
##
|
|
2170
|
-
|
|
2171
|
-
##
|
|
2172
|
-
|
|
2173
|
-
##
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
res_meta = res.meta
|
|
2177
|
-
|
|
2178
|
-
first_meta = self._pp_get_meta(children)
|
|
2179
|
-
if first_meta is not None:
|
|
2180
|
-
if not hasattr(res_meta, "line"):
|
|
2181
|
-
##
|
|
2182
|
-
|
|
2183
|
-
res_meta.line = getattr(
|
|
2184
|
-
first_meta, "container_line", first_meta.line
|
|
2185
|
-
)
|
|
2186
|
-
res_meta.column = getattr(
|
|
2187
|
-
first_meta, "container_column", first_meta.column
|
|
2188
|
-
)
|
|
2189
|
-
res_meta.start_pos = getattr(
|
|
2190
|
-
first_meta, "container_start_pos", first_meta.start_pos
|
|
2191
|
-
)
|
|
2192
|
-
res_meta.empty = False
|
|
2193
|
-
|
|
2194
|
-
res_meta.container_line = getattr(
|
|
2195
|
-
first_meta, "container_line", first_meta.line
|
|
2196
|
-
)
|
|
2197
|
-
res_meta.container_column = getattr(
|
|
2198
|
-
first_meta, "container_column", first_meta.column
|
|
2199
|
-
)
|
|
2200
|
-
res_meta.container_start_pos = getattr(
|
|
2201
|
-
first_meta, "container_start_pos", first_meta.start_pos
|
|
2202
|
-
)
|
|
2203
|
-
|
|
2204
|
-
last_meta = self._pp_get_meta(reversed(children))
|
|
2205
|
-
if last_meta is not None:
|
|
2206
|
-
if not hasattr(res_meta, "end_line"):
|
|
2207
|
-
res_meta.end_line = getattr(
|
|
2208
|
-
last_meta, "container_end_line", last_meta.end_line
|
|
2209
|
-
)
|
|
2210
|
-
res_meta.end_column = getattr(
|
|
2211
|
-
last_meta, "container_end_column", last_meta.end_column
|
|
2212
|
-
)
|
|
2213
|
-
res_meta.end_pos = getattr(
|
|
2214
|
-
last_meta, "container_end_pos", last_meta.end_pos
|
|
2215
|
-
)
|
|
2216
|
-
res_meta.empty = False
|
|
2217
|
-
|
|
2218
|
-
res_meta.container_end_line = getattr(
|
|
2219
|
-
last_meta, "container_end_line", last_meta.end_line
|
|
2220
|
-
)
|
|
2221
|
-
res_meta.container_end_column = getattr(
|
|
2222
|
-
last_meta, "container_end_column", last_meta.end_column
|
|
2223
|
-
)
|
|
2224
|
-
res_meta.container_end_pos = getattr(
|
|
2225
|
-
last_meta, "container_end_pos", last_meta.end_pos
|
|
2226
|
-
)
|
|
2227
|
-
|
|
2228
|
-
return res
|
|
2229
|
-
|
|
2230
|
-
def _pp_get_meta(self, children):
|
|
2231
|
-
for c in children:
|
|
2232
|
-
if self.node_filter is not None and not self.node_filter(c):
|
|
2233
|
-
continue
|
|
2234
|
-
if isinstance(c, Tree):
|
|
2235
|
-
if not c.meta.empty:
|
|
2236
|
-
return c.meta
|
|
2237
|
-
elif isinstance(c, Token):
|
|
2238
|
-
return c
|
|
2239
|
-
elif hasattr(c, "__lark_meta__"):
|
|
2240
|
-
return c.__lark_meta__()
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
def make_propagate_positions(option):
|
|
2244
|
-
if callable(option):
|
|
2245
|
-
return partial(PropagatePositions, node_filter=option)
|
|
2246
|
-
elif option is True:
|
|
2247
|
-
return PropagatePositions
|
|
2248
|
-
elif option is False:
|
|
2249
|
-
return None
|
|
2250
|
-
|
|
2251
|
-
raise ConfigurationError("Invalid option for propagate_positions: %r" % option)
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
class ChildFilter:
|
|
2255
|
-
def __init__(self, to_include, append_none, node_builder):
|
|
2256
|
-
self.node_builder = node_builder
|
|
2257
|
-
self.to_include = to_include
|
|
2258
|
-
self.append_none = append_none
|
|
2259
|
-
|
|
2260
|
-
def __call__(self, children):
|
|
2261
|
-
filtered = []
|
|
2262
|
-
|
|
2263
|
-
for i, to_expand, add_none in self.to_include:
|
|
2264
|
-
if add_none:
|
|
2265
|
-
filtered += [None] * add_none
|
|
2266
|
-
if to_expand:
|
|
2267
|
-
filtered += children[i].children
|
|
2268
|
-
else:
|
|
2269
|
-
filtered.append(children[i])
|
|
2270
|
-
|
|
2271
|
-
if self.append_none:
|
|
2272
|
-
filtered += [None] * self.append_none
|
|
2273
|
-
|
|
2274
|
-
return self.node_builder(filtered)
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
class ChildFilterLALR(ChildFilter):
|
|
2278
|
-
#--
|
|
2279
|
-
|
|
2280
|
-
def __call__(self, children):
|
|
2281
|
-
filtered = []
|
|
2282
|
-
for i, to_expand, add_none in self.to_include:
|
|
2283
|
-
if add_none:
|
|
2284
|
-
filtered += [None] * add_none
|
|
2285
|
-
if to_expand:
|
|
2286
|
-
if filtered:
|
|
2287
|
-
filtered += children[i].children
|
|
2288
|
-
else: ##
|
|
2289
|
-
|
|
2290
|
-
filtered = children[i].children
|
|
2291
|
-
else:
|
|
2292
|
-
filtered.append(children[i])
|
|
2293
|
-
|
|
2294
|
-
if self.append_none:
|
|
2295
|
-
filtered += [None] * self.append_none
|
|
2296
|
-
|
|
2297
|
-
return self.node_builder(filtered)
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
class ChildFilterLALR_NoPlaceholders(ChildFilter):
|
|
2301
|
-
#--
|
|
2302
|
-
|
|
2303
|
-
def __init__(self, to_include, node_builder):
|
|
2304
|
-
self.node_builder = node_builder
|
|
2305
|
-
self.to_include = to_include
|
|
2306
|
-
|
|
2307
|
-
def __call__(self, children):
|
|
2308
|
-
filtered = []
|
|
2309
|
-
for i, to_expand in self.to_include:
|
|
2310
|
-
if to_expand:
|
|
2311
|
-
if filtered:
|
|
2312
|
-
filtered += children[i].children
|
|
2313
|
-
else: ##
|
|
2314
|
-
|
|
2315
|
-
filtered = children[i].children
|
|
2316
|
-
else:
|
|
2317
|
-
filtered.append(children[i])
|
|
2318
|
-
return self.node_builder(filtered)
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
def _should_expand(sym):
|
|
2322
|
-
return not sym.is_term and sym.name.startswith("_")
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
def maybe_create_child_filter(
|
|
2326
|
-
expansion, keep_all_tokens, ambiguous, _empty_indices: List[bool]
|
|
2327
|
-
):
|
|
2328
|
-
##
|
|
2329
|
-
|
|
2330
|
-
if _empty_indices:
|
|
2331
|
-
assert _empty_indices.count(False) == len(expansion)
|
|
2332
|
-
s = "".join(str(int(b)) for b in _empty_indices)
|
|
2333
|
-
empty_indices = [len(ones) for ones in s.split("0")]
|
|
2334
|
-
assert len(empty_indices) == len(expansion) + 1, (empty_indices, len(expansion))
|
|
2335
|
-
else:
|
|
2336
|
-
empty_indices = [0] * (len(expansion) + 1)
|
|
2337
|
-
|
|
2338
|
-
to_include = []
|
|
2339
|
-
nones_to_add = 0
|
|
2340
|
-
for i, sym in enumerate(expansion):
|
|
2341
|
-
nones_to_add += empty_indices[i]
|
|
2342
|
-
if keep_all_tokens or not (sym.is_term and sym.filter_out):
|
|
2343
|
-
to_include.append((i, _should_expand(sym), nones_to_add))
|
|
2344
|
-
nones_to_add = 0
|
|
2345
|
-
|
|
2346
|
-
nones_to_add += empty_indices[len(expansion)]
|
|
2347
|
-
|
|
2348
|
-
if (
|
|
2349
|
-
_empty_indices
|
|
2350
|
-
or len(to_include) < len(expansion)
|
|
2351
|
-
or any(to_expand for i, to_expand, _ in to_include)
|
|
2352
|
-
):
|
|
2353
|
-
if _empty_indices or ambiguous:
|
|
2354
|
-
return partial(
|
|
2355
|
-
ChildFilter if ambiguous else ChildFilterLALR, to_include, nones_to_add
|
|
2356
|
-
)
|
|
2357
|
-
else:
|
|
2358
|
-
##
|
|
2359
|
-
|
|
2360
|
-
return partial(
|
|
2361
|
-
ChildFilterLALR_NoPlaceholders, [(i, x) for i, x, _ in to_include]
|
|
2362
|
-
)
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
class AmbiguousExpander:
|
|
2366
|
-
#--
|
|
2367
|
-
|
|
2368
|
-
def __init__(self, to_expand, tree_class, node_builder):
|
|
2369
|
-
self.node_builder = node_builder
|
|
2370
|
-
self.tree_class = tree_class
|
|
2371
|
-
self.to_expand = to_expand
|
|
2372
|
-
|
|
2373
|
-
def __call__(self, children):
|
|
2374
|
-
def _is_ambig_tree(t):
|
|
2375
|
-
return hasattr(t, "data") and t.data == "_ambig"
|
|
2376
|
-
|
|
2377
|
-
##
|
|
2378
|
-
|
|
2379
|
-
##
|
|
2380
|
-
|
|
2381
|
-
##
|
|
2382
|
-
|
|
2383
|
-
##
|
|
2384
|
-
|
|
2385
|
-
ambiguous = []
|
|
2386
|
-
for i, child in enumerate(children):
|
|
2387
|
-
if _is_ambig_tree(child):
|
|
2388
|
-
if i in self.to_expand:
|
|
2389
|
-
ambiguous.append(i)
|
|
2390
|
-
|
|
2391
|
-
child.expand_kids_by_data("_ambig")
|
|
2392
|
-
|
|
2393
|
-
if not ambiguous:
|
|
2394
|
-
return self.node_builder(children)
|
|
2395
|
-
|
|
2396
|
-
expand = [
|
|
2397
|
-
child.children if i in ambiguous else (child,)
|
|
2398
|
-
for i, child in enumerate(children)
|
|
2399
|
-
]
|
|
2400
|
-
return self.tree_class(
|
|
2401
|
-
"_ambig", [self.node_builder(list(f)) for f in product(*expand)]
|
|
2402
|
-
)
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
def maybe_create_ambiguous_expander(tree_class, expansion, keep_all_tokens):
|
|
2406
|
-
to_expand = [
|
|
2407
|
-
i
|
|
2408
|
-
for i, sym in enumerate(expansion)
|
|
2409
|
-
if keep_all_tokens
|
|
2410
|
-
or ((not (sym.is_term and sym.filter_out)) and _should_expand(sym))
|
|
2411
|
-
]
|
|
2412
|
-
if to_expand:
|
|
2413
|
-
return partial(AmbiguousExpander, to_expand, tree_class)
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
class AmbiguousIntermediateExpander:
|
|
2417
|
-
#--
|
|
2418
|
-
|
|
2419
|
-
def __init__(self, tree_class, node_builder):
|
|
2420
|
-
self.node_builder = node_builder
|
|
2421
|
-
self.tree_class = tree_class
|
|
2422
|
-
|
|
2423
|
-
def __call__(self, children):
|
|
2424
|
-
def _is_iambig_tree(child):
|
|
2425
|
-
return hasattr(child, "data") and child.data == "_iambig"
|
|
2426
|
-
|
|
2427
|
-
def _collapse_iambig(children):
|
|
2428
|
-
#--
|
|
2429
|
-
|
|
2430
|
-
##
|
|
2431
|
-
|
|
2432
|
-
##
|
|
2433
|
-
|
|
2434
|
-
if children and _is_iambig_tree(children[0]):
|
|
2435
|
-
iambig_node = children[0]
|
|
2436
|
-
result = []
|
|
2437
|
-
for grandchild in iambig_node.children:
|
|
2438
|
-
collapsed = _collapse_iambig(grandchild.children)
|
|
2439
|
-
if collapsed:
|
|
2440
|
-
for child in collapsed:
|
|
2441
|
-
child.children += children[1:]
|
|
2442
|
-
result += collapsed
|
|
2443
|
-
else:
|
|
2444
|
-
new_tree = self.tree_class(
|
|
2445
|
-
"_inter", grandchild.children + children[1:]
|
|
2446
|
-
)
|
|
2447
|
-
result.append(new_tree)
|
|
2448
|
-
return result
|
|
2449
|
-
|
|
2450
|
-
collapsed = _collapse_iambig(children)
|
|
2451
|
-
if collapsed:
|
|
2452
|
-
processed_nodes = [self.node_builder(c.children) for c in collapsed]
|
|
2453
|
-
return self.tree_class("_ambig", processed_nodes)
|
|
2454
|
-
|
|
2455
|
-
return self.node_builder(children)
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
def inplace_transformer(func):
|
|
2459
|
-
@wraps(func)
|
|
2460
|
-
def f(children):
|
|
2461
|
-
##
|
|
2462
|
-
|
|
2463
|
-
tree = Tree(func.__name__, children)
|
|
2464
|
-
return func(tree)
|
|
2465
|
-
|
|
2466
|
-
return f
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
def apply_visit_wrapper(func, name, wrapper):
|
|
2470
|
-
if wrapper is _vargs_meta or wrapper is _vargs_meta_inline:
|
|
2471
|
-
raise NotImplementedError("Meta args not supported for internal transformer")
|
|
2472
|
-
|
|
2473
|
-
@wraps(func)
|
|
2474
|
-
def f(children):
|
|
2475
|
-
return wrapper(func, name, children, None)
|
|
2476
|
-
|
|
2477
|
-
return f
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
class ParseTreeBuilder:
|
|
2481
|
-
def __init__(
|
|
2482
|
-
self,
|
|
2483
|
-
rules,
|
|
2484
|
-
tree_class,
|
|
2485
|
-
propagate_positions=False,
|
|
2486
|
-
ambiguous=False,
|
|
2487
|
-
maybe_placeholders=False,
|
|
2488
|
-
):
|
|
2489
|
-
self.tree_class = tree_class
|
|
2490
|
-
self.propagate_positions = propagate_positions
|
|
2491
|
-
self.ambiguous = ambiguous
|
|
2492
|
-
self.maybe_placeholders = maybe_placeholders
|
|
2493
|
-
|
|
2494
|
-
self.rule_builders = list(self._init_builders(rules))
|
|
2495
|
-
|
|
2496
|
-
def _init_builders(self, rules):
|
|
2497
|
-
propagate_positions = make_propagate_positions(self.propagate_positions)
|
|
2498
|
-
|
|
2499
|
-
for rule in rules:
|
|
2500
|
-
options = rule.options
|
|
2501
|
-
keep_all_tokens = options.keep_all_tokens
|
|
2502
|
-
expand_single_child = options.expand1
|
|
2503
|
-
|
|
2504
|
-
wrapper_chain = list(
|
|
2505
|
-
filter(
|
|
2506
|
-
None,
|
|
2507
|
-
[
|
|
2508
|
-
(expand_single_child and not rule.alias) and ExpandSingleChild,
|
|
2509
|
-
maybe_create_child_filter(
|
|
2510
|
-
rule.expansion,
|
|
2511
|
-
keep_all_tokens,
|
|
2512
|
-
self.ambiguous,
|
|
2513
|
-
options.empty_indices if self.maybe_placeholders else None,
|
|
2514
|
-
),
|
|
2515
|
-
propagate_positions,
|
|
2516
|
-
self.ambiguous
|
|
2517
|
-
and maybe_create_ambiguous_expander(
|
|
2518
|
-
self.tree_class, rule.expansion, keep_all_tokens
|
|
2519
|
-
),
|
|
2520
|
-
self.ambiguous
|
|
2521
|
-
and partial(AmbiguousIntermediateExpander, self.tree_class),
|
|
2522
|
-
],
|
|
2523
|
-
)
|
|
2524
|
-
)
|
|
2525
|
-
|
|
2526
|
-
yield rule, wrapper_chain
|
|
2527
|
-
|
|
2528
|
-
def create_callback(self, transformer=None):
|
|
2529
|
-
callbacks = {}
|
|
2530
|
-
|
|
2531
|
-
default_handler = getattr(transformer, "__default__", None)
|
|
2532
|
-
if default_handler:
|
|
2533
|
-
|
|
2534
|
-
def default_callback(data, children):
|
|
2535
|
-
return default_handler(data, children, None)
|
|
2536
|
-
|
|
2537
|
-
else:
|
|
2538
|
-
default_callback = self.tree_class
|
|
2539
|
-
|
|
2540
|
-
for rule, wrapper_chain in self.rule_builders:
|
|
2541
|
-
|
|
2542
|
-
user_callback_name = (
|
|
2543
|
-
rule.alias or rule.options.template_source or rule.origin.name
|
|
2544
|
-
)
|
|
2545
|
-
try:
|
|
2546
|
-
f = getattr(transformer, user_callback_name)
|
|
2547
|
-
wrapper = getattr(f, "visit_wrapper", None)
|
|
2548
|
-
if wrapper is not None:
|
|
2549
|
-
f = apply_visit_wrapper(f, user_callback_name, wrapper)
|
|
2550
|
-
elif isinstance(transformer, Transformer_InPlace):
|
|
2551
|
-
f = inplace_transformer(f)
|
|
2552
|
-
except AttributeError:
|
|
2553
|
-
f = partial(default_callback, user_callback_name)
|
|
2554
|
-
|
|
2555
|
-
for w in wrapper_chain:
|
|
2556
|
-
f = w(f)
|
|
2557
|
-
|
|
2558
|
-
if rule in callbacks:
|
|
2559
|
-
raise GrammarError("Rule '%s' already exists" % (rule,))
|
|
2560
|
-
|
|
2561
|
-
callbacks[rule] = f
|
|
2562
|
-
|
|
2563
|
-
return callbacks
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
class Action:
|
|
2570
|
-
def __init__(self, name):
|
|
2571
|
-
self.name = name
|
|
2572
|
-
|
|
2573
|
-
def __str__(self):
|
|
2574
|
-
return self.name
|
|
2575
|
-
|
|
2576
|
-
def __repr__(self):
|
|
2577
|
-
return str(self)
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
Shift = Action("Shift")
|
|
2581
|
-
Reduce = Action("Reduce")
|
|
2582
|
-
|
|
2583
|
-
StateT = TypeVar("StateT")
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
class ParseTableBase(Generic[StateT]):
|
|
2587
|
-
states: Dict[StateT, Dict[str, Tuple]]
|
|
2588
|
-
start_states: Dict[str, StateT]
|
|
2589
|
-
end_states: Dict[str, StateT]
|
|
2590
|
-
|
|
2591
|
-
def __init__(self, states, start_states, end_states):
|
|
2592
|
-
self.states = states
|
|
2593
|
-
self.start_states = start_states
|
|
2594
|
-
self.end_states = end_states
|
|
2595
|
-
|
|
2596
|
-
def serialize(self, memo):
|
|
2597
|
-
tokens = Enumerator()
|
|
2598
|
-
|
|
2599
|
-
states = {
|
|
2600
|
-
state: {
|
|
2601
|
-
tokens.get(token): (
|
|
2602
|
-
(1, arg.serialize(memo)) if action is Reduce else (0, arg)
|
|
2603
|
-
)
|
|
2604
|
-
for token, (action, arg) in actions.items()
|
|
2605
|
-
}
|
|
2606
|
-
for state, actions in self.states.items()
|
|
2607
|
-
}
|
|
2608
|
-
|
|
2609
|
-
return {
|
|
2610
|
-
"tokens": tokens.reversed(),
|
|
2611
|
-
"states": states,
|
|
2612
|
-
"start_states": self.start_states,
|
|
2613
|
-
"end_states": self.end_states,
|
|
2614
|
-
}
|
|
2615
|
-
|
|
2616
|
-
@classmethod
|
|
2617
|
-
def deserialize(cls, data, memo):
|
|
2618
|
-
tokens = data["tokens"]
|
|
2619
|
-
states = {
|
|
2620
|
-
state: {
|
|
2621
|
-
tokens[token]: (
|
|
2622
|
-
(Reduce, Rule.deserialize(arg, memo))
|
|
2623
|
-
if action == 1
|
|
2624
|
-
else (Shift, arg)
|
|
2625
|
-
)
|
|
2626
|
-
for token, (action, arg) in actions.items()
|
|
2627
|
-
}
|
|
2628
|
-
for state, actions in data["states"].items()
|
|
2629
|
-
}
|
|
2630
|
-
return cls(states, data["start_states"], data["end_states"])
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
class ParseTable(ParseTableBase["State"]):
|
|
2634
|
-
#--
|
|
2635
|
-
|
|
2636
|
-
pass
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
class IntParseTable(ParseTableBase[int]):
|
|
2640
|
-
#--
|
|
2641
|
-
|
|
2642
|
-
@classmethod
|
|
2643
|
-
def from_ParseTable(cls, parse_table: ParseTable):
|
|
2644
|
-
enum = list(parse_table.states)
|
|
2645
|
-
state_to_idx: Dict["State", int] = {s: i for i, s in enumerate(enum)}
|
|
2646
|
-
int_states = {}
|
|
2647
|
-
|
|
2648
|
-
for s, la in parse_table.states.items():
|
|
2649
|
-
la = {
|
|
2650
|
-
k: (v[0], state_to_idx[v[1]]) if v[0] is Shift else v
|
|
2651
|
-
for k, v in la.items()
|
|
2652
|
-
}
|
|
2653
|
-
int_states[state_to_idx[s]] = la
|
|
2654
|
-
|
|
2655
|
-
start_states = {
|
|
2656
|
-
start: state_to_idx[s] for start, s in parse_table.start_states.items()
|
|
2657
|
-
}
|
|
2658
|
-
end_states = {
|
|
2659
|
-
start: state_to_idx[s] for start, s in parse_table.end_states.items()
|
|
2660
|
-
}
|
|
2661
|
-
return cls(int_states, start_states, end_states)
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
class ParseConf(Generic[StateT]):
|
|
2668
|
-
__slots__ = (
|
|
2669
|
-
"parse_table",
|
|
2670
|
-
"callbacks",
|
|
2671
|
-
"start",
|
|
2672
|
-
"start_state",
|
|
2673
|
-
"end_state",
|
|
2674
|
-
"states",
|
|
2675
|
-
)
|
|
2676
|
-
|
|
2677
|
-
parse_table: ParseTableBase[StateT]
|
|
2678
|
-
callbacks: ParserCallbacks
|
|
2679
|
-
start: str
|
|
2680
|
-
|
|
2681
|
-
start_state: StateT
|
|
2682
|
-
end_state: StateT
|
|
2683
|
-
states: Dict[StateT, Dict[str, tuple]]
|
|
2684
|
-
|
|
2685
|
-
def __init__(
|
|
2686
|
-
self,
|
|
2687
|
-
parse_table: ParseTableBase[StateT],
|
|
2688
|
-
callbacks: ParserCallbacks,
|
|
2689
|
-
start: str,
|
|
2690
|
-
):
|
|
2691
|
-
self.parse_table = parse_table
|
|
2692
|
-
|
|
2693
|
-
self.start_state = self.parse_table.start_states[start]
|
|
2694
|
-
self.end_state = self.parse_table.end_states[start]
|
|
2695
|
-
self.states = self.parse_table.states
|
|
2696
|
-
|
|
2697
|
-
self.callbacks = callbacks
|
|
2698
|
-
self.start = start
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
class ParserState(Generic[StateT]):
|
|
2702
|
-
__slots__ = "parse_conf", "lexer", "state_stack", "value_stack"
|
|
2703
|
-
|
|
2704
|
-
parse_conf: ParseConf[StateT]
|
|
2705
|
-
lexer: LexerThread
|
|
2706
|
-
state_stack: List[StateT]
|
|
2707
|
-
value_stack: list
|
|
2708
|
-
|
|
2709
|
-
def __init__(
|
|
2710
|
-
self,
|
|
2711
|
-
parse_conf: ParseConf[StateT],
|
|
2712
|
-
lexer: LexerThread,
|
|
2713
|
-
state_stack=None,
|
|
2714
|
-
value_stack=None,
|
|
2715
|
-
):
|
|
2716
|
-
self.parse_conf = parse_conf
|
|
2717
|
-
self.lexer = lexer
|
|
2718
|
-
self.state_stack = state_stack or [self.parse_conf.start_state]
|
|
2719
|
-
self.value_stack = value_stack or []
|
|
2720
|
-
|
|
2721
|
-
@property
|
|
2722
|
-
def position(self) -> StateT:
|
|
2723
|
-
return self.state_stack[-1]
|
|
2724
|
-
|
|
2725
|
-
##
|
|
2726
|
-
|
|
2727
|
-
def __eq__(self, other) -> bool:
|
|
2728
|
-
if not isinstance(other, ParserState):
|
|
2729
|
-
return NotImplemented
|
|
2730
|
-
return (
|
|
2731
|
-
len(self.state_stack) == len(other.state_stack)
|
|
2732
|
-
and self.position == other.position
|
|
2733
|
-
)
|
|
2734
|
-
|
|
2735
|
-
def __copy__(self):
|
|
2736
|
-
return type(self)(
|
|
2737
|
-
self.parse_conf,
|
|
2738
|
-
self.lexer, ##
|
|
2739
|
-
|
|
2740
|
-
copy(self.state_stack),
|
|
2741
|
-
deepcopy(self.value_stack),
|
|
2742
|
-
)
|
|
2743
|
-
|
|
2744
|
-
def copy(self) -> "ParserState[StateT]":
|
|
2745
|
-
return copy(self)
|
|
2746
|
-
|
|
2747
|
-
def feed_token(self, token: Token, is_end=False) -> Any:
|
|
2748
|
-
state_stack = self.state_stack
|
|
2749
|
-
value_stack = self.value_stack
|
|
2750
|
-
states = self.parse_conf.states
|
|
2751
|
-
end_state = self.parse_conf.end_state
|
|
2752
|
-
callbacks = self.parse_conf.callbacks
|
|
2753
|
-
|
|
2754
|
-
while True:
|
|
2755
|
-
state = state_stack[-1]
|
|
2756
|
-
try:
|
|
2757
|
-
action, arg = states[state][token.type]
|
|
2758
|
-
except KeyError:
|
|
2759
|
-
expected = {s for s in states[state].keys() if s.isupper()}
|
|
2760
|
-
raise UnexpectedToken(
|
|
2761
|
-
token, expected, state=self, interactive_parser=None
|
|
2762
|
-
)
|
|
2763
|
-
|
|
2764
|
-
assert arg != end_state
|
|
2765
|
-
|
|
2766
|
-
if action is Shift:
|
|
2767
|
-
##
|
|
2768
|
-
|
|
2769
|
-
assert not is_end
|
|
2770
|
-
state_stack.append(arg)
|
|
2771
|
-
value_stack.append(
|
|
2772
|
-
token
|
|
2773
|
-
if token.type not in callbacks
|
|
2774
|
-
else callbacks[token.type](token)
|
|
2775
|
-
)
|
|
2776
|
-
return
|
|
2777
|
-
else:
|
|
2778
|
-
##
|
|
2779
|
-
|
|
2780
|
-
rule = arg
|
|
2781
|
-
size = len(rule.expansion)
|
|
2782
|
-
if size:
|
|
2783
|
-
s = value_stack[-size:]
|
|
2784
|
-
del state_stack[-size:]
|
|
2785
|
-
del value_stack[-size:]
|
|
2786
|
-
else:
|
|
2787
|
-
s = []
|
|
2788
|
-
|
|
2789
|
-
value = callbacks[rule](s) if callbacks else s
|
|
2790
|
-
|
|
2791
|
-
_action, new_state = states[state_stack[-1]][rule.origin.name]
|
|
2792
|
-
assert _action is Shift
|
|
2793
|
-
state_stack.append(new_state)
|
|
2794
|
-
value_stack.append(value)
|
|
2795
|
-
|
|
2796
|
-
if is_end and state_stack[-1] == end_state:
|
|
2797
|
-
return value_stack[-1]
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
class LALR_Parser(Serialize):
|
|
2804
|
-
def __init__(
|
|
2805
|
-
self, parser_conf: ParserConf, debug: bool = False, strict: bool = False
|
|
2806
|
-
):
|
|
2807
|
-
analysis = LALR_Analyzer(parser_conf, debug=debug, strict=strict)
|
|
2808
|
-
analysis.compute_lalr()
|
|
2809
|
-
callbacks = parser_conf.callbacks
|
|
2810
|
-
|
|
2811
|
-
self._parse_table = analysis.parse_table
|
|
2812
|
-
self.parser_conf = parser_conf
|
|
2813
|
-
self.parser = _Parser(analysis.parse_table, callbacks, debug)
|
|
2814
|
-
|
|
2815
|
-
@classmethod
|
|
2816
|
-
def deserialize(cls, data, memo, callbacks, debug=False):
|
|
2817
|
-
inst = cls.__new__(cls)
|
|
2818
|
-
inst._parse_table = IntParseTable.deserialize(data, memo)
|
|
2819
|
-
inst.parser = _Parser(inst._parse_table, callbacks, debug)
|
|
2820
|
-
return inst
|
|
2821
|
-
|
|
2822
|
-
def serialize(self, memo: Any = None) -> Dict[str, Any]:
|
|
2823
|
-
return self._parse_table.serialize(memo)
|
|
2824
|
-
|
|
2825
|
-
def parse_interactive(self, lexer: LexerThread, start: str):
|
|
2826
|
-
return self.parser.parse(lexer, start, start_interactive=True)
|
|
2827
|
-
|
|
2828
|
-
def parse(self, lexer, start, on_error=None):
|
|
2829
|
-
try:
|
|
2830
|
-
return self.parser.parse(lexer, start)
|
|
2831
|
-
except UnexpectedInput as e:
|
|
2832
|
-
if on_error is None:
|
|
2833
|
-
raise
|
|
2834
|
-
|
|
2835
|
-
while True:
|
|
2836
|
-
if isinstance(e, UnexpectedCharacters):
|
|
2837
|
-
s = e.interactive_parser.lexer_thread.state
|
|
2838
|
-
p = s.line_ctr.char_pos
|
|
2839
|
-
|
|
2840
|
-
if not on_error(e):
|
|
2841
|
-
raise e
|
|
2842
|
-
|
|
2843
|
-
if isinstance(e, UnexpectedCharacters):
|
|
2844
|
-
##
|
|
2845
|
-
|
|
2846
|
-
if p == s.line_ctr.char_pos:
|
|
2847
|
-
s.line_ctr.feed(s.text[p : p + 1])
|
|
2848
|
-
|
|
2849
|
-
try:
|
|
2850
|
-
return e.interactive_parser.resume_parse()
|
|
2851
|
-
except UnexpectedToken as e2:
|
|
2852
|
-
if (
|
|
2853
|
-
isinstance(e, UnexpectedToken)
|
|
2854
|
-
and e.token.type == e2.token.type == "$END"
|
|
2855
|
-
and e.interactive_parser == e2.interactive_parser
|
|
2856
|
-
):
|
|
2857
|
-
##
|
|
2858
|
-
|
|
2859
|
-
raise e2
|
|
2860
|
-
e = e2
|
|
2861
|
-
except UnexpectedCharacters as e2:
|
|
2862
|
-
e = e2
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
class _Parser:
|
|
2866
|
-
parse_table: ParseTableBase
|
|
2867
|
-
callbacks: ParserCallbacks
|
|
2868
|
-
debug: bool
|
|
2869
|
-
|
|
2870
|
-
def __init__(
|
|
2871
|
-
self,
|
|
2872
|
-
parse_table: ParseTableBase,
|
|
2873
|
-
callbacks: ParserCallbacks,
|
|
2874
|
-
debug: bool = False,
|
|
2875
|
-
):
|
|
2876
|
-
self.parse_table = parse_table
|
|
2877
|
-
self.callbacks = callbacks
|
|
2878
|
-
self.debug = debug
|
|
2879
|
-
|
|
2880
|
-
def parse(
|
|
2881
|
-
self,
|
|
2882
|
-
lexer: LexerThread,
|
|
2883
|
-
start: str,
|
|
2884
|
-
value_stack=None,
|
|
2885
|
-
state_stack=None,
|
|
2886
|
-
start_interactive=False,
|
|
2887
|
-
):
|
|
2888
|
-
parse_conf = ParseConf(self.parse_table, self.callbacks, start)
|
|
2889
|
-
parser_state = ParserState(parse_conf, lexer, state_stack, value_stack)
|
|
2890
|
-
if start_interactive:
|
|
2891
|
-
return InteractiveParser(self, parser_state, parser_state.lexer)
|
|
2892
|
-
return self.parse_from_state(parser_state)
|
|
2893
|
-
|
|
2894
|
-
def parse_from_state(self, state: ParserState, last_token: Optional[Token] = None):
|
|
2895
|
-
#--
|
|
2896
|
-
try:
|
|
2897
|
-
token = last_token
|
|
2898
|
-
for token in state.lexer.lex(state):
|
|
2899
|
-
assert token is not None
|
|
2900
|
-
state.feed_token(token)
|
|
2901
|
-
|
|
2902
|
-
end_token = (
|
|
2903
|
-
Token.new_borrow_pos("$END", "", token)
|
|
2904
|
-
if token
|
|
2905
|
-
else Token("$END", "", 0, 1, 1)
|
|
2906
|
-
)
|
|
2907
|
-
return state.feed_token(end_token, True)
|
|
2908
|
-
except UnexpectedInput as e:
|
|
2909
|
-
try:
|
|
2910
|
-
e.interactive_parser = InteractiveParser(self, state, state.lexer)
|
|
2911
|
-
except NameError:
|
|
2912
|
-
pass
|
|
2913
|
-
raise e
|
|
2914
|
-
except Exception as e:
|
|
2915
|
-
if self.debug:
|
|
2916
|
-
print("")
|
|
2917
|
-
print("STATE STACK DUMP")
|
|
2918
|
-
print("----------------")
|
|
2919
|
-
for i, s in enumerate(state.state_stack):
|
|
2920
|
-
print("%d)" % i, s)
|
|
2921
|
-
print("")
|
|
2922
|
-
|
|
2923
|
-
raise
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
class InteractiveParser:
|
|
2930
|
-
#--
|
|
2931
|
-
|
|
2932
|
-
def __init__(self, parser, parser_state, lexer_thread: LexerThread):
|
|
2933
|
-
self.parser = parser
|
|
2934
|
-
self.parser_state = parser_state
|
|
2935
|
-
self.lexer_thread = lexer_thread
|
|
2936
|
-
self.result = None
|
|
2937
|
-
|
|
2938
|
-
@property
|
|
2939
|
-
def lexer_state(self) -> LexerThread:
|
|
2940
|
-
warnings.warn(
|
|
2941
|
-
"lexer_state will be removed in subsequent releases. Use lexer_thread instead.",
|
|
2942
|
-
DeprecationWarning,
|
|
2943
|
-
)
|
|
2944
|
-
return self.lexer_thread
|
|
2945
|
-
|
|
2946
|
-
def feed_token(self, token: Token):
|
|
2947
|
-
#--
|
|
2948
|
-
return self.parser_state.feed_token(token, token.type == "$END")
|
|
2949
|
-
|
|
2950
|
-
def iter_parse(self) -> Iterator[Token]:
|
|
2951
|
-
#--
|
|
2952
|
-
for token in self.lexer_thread.lex(self.parser_state):
|
|
2953
|
-
yield token
|
|
2954
|
-
self.result = self.feed_token(token)
|
|
2955
|
-
|
|
2956
|
-
def exhaust_lexer(self) -> List[Token]:
|
|
2957
|
-
#--
|
|
2958
|
-
return list(self.iter_parse())
|
|
2959
|
-
|
|
2960
|
-
def feed_eof(self, last_token=None):
|
|
2961
|
-
#--
|
|
2962
|
-
eof = (
|
|
2963
|
-
Token.new_borrow_pos("$END", "", last_token)
|
|
2964
|
-
if last_token is not None
|
|
2965
|
-
else self.lexer_thread._Token("$END", "", 0, 1, 1)
|
|
2966
|
-
)
|
|
2967
|
-
return self.feed_token(eof)
|
|
2968
|
-
|
|
2969
|
-
def __copy__(self):
|
|
2970
|
-
#--
|
|
2971
|
-
return type(self)(
|
|
2972
|
-
self.parser,
|
|
2973
|
-
copy(self.parser_state),
|
|
2974
|
-
copy(self.lexer_thread),
|
|
2975
|
-
)
|
|
2976
|
-
|
|
2977
|
-
def copy(self):
|
|
2978
|
-
return copy(self)
|
|
2979
|
-
|
|
2980
|
-
def __eq__(self, other):
|
|
2981
|
-
if not isinstance(other, InteractiveParser):
|
|
2982
|
-
return False
|
|
2983
|
-
|
|
2984
|
-
return (
|
|
2985
|
-
self.parser_state == other.parser_state
|
|
2986
|
-
and self.lexer_thread == other.lexer_thread
|
|
2987
|
-
)
|
|
2988
|
-
|
|
2989
|
-
def as_immutable(self):
|
|
2990
|
-
#--
|
|
2991
|
-
p = copy(self)
|
|
2992
|
-
return ImmutableInteractiveParser(p.parser, p.parser_state, p.lexer_thread)
|
|
2993
|
-
|
|
2994
|
-
def pretty(self):
|
|
2995
|
-
#--
|
|
2996
|
-
out = ["Parser choices:"]
|
|
2997
|
-
for k, v in self.choices().items():
|
|
2998
|
-
out.append("\t- %s -> %r" % (k, v))
|
|
2999
|
-
out.append("stack size: %s" % len(self.parser_state.state_stack))
|
|
3000
|
-
return "\n".join(out)
|
|
3001
|
-
|
|
3002
|
-
def choices(self):
|
|
3003
|
-
#--
|
|
3004
|
-
return self.parser_state.parse_conf.parse_table.states[
|
|
3005
|
-
self.parser_state.position
|
|
3006
|
-
]
|
|
3007
|
-
|
|
3008
|
-
def accepts(self):
|
|
3009
|
-
#--
|
|
3010
|
-
accepts = set()
|
|
3011
|
-
conf_no_callbacks = copy(self.parser_state.parse_conf)
|
|
3012
|
-
##
|
|
3013
|
-
|
|
3014
|
-
##
|
|
3015
|
-
|
|
3016
|
-
conf_no_callbacks.callbacks = {}
|
|
3017
|
-
for t in self.choices():
|
|
3018
|
-
if t.isupper(): ##
|
|
3019
|
-
|
|
3020
|
-
new_cursor = copy(self)
|
|
3021
|
-
new_cursor.parser_state.parse_conf = conf_no_callbacks
|
|
3022
|
-
try:
|
|
3023
|
-
new_cursor.feed_token(self.lexer_thread._Token(t, ""))
|
|
3024
|
-
except UnexpectedToken:
|
|
3025
|
-
pass
|
|
3026
|
-
else:
|
|
3027
|
-
accepts.add(t)
|
|
3028
|
-
return accepts
|
|
3029
|
-
|
|
3030
|
-
def resume_parse(self):
|
|
3031
|
-
#--
|
|
3032
|
-
return self.parser.parse_from_state(
|
|
3033
|
-
self.parser_state, last_token=self.lexer_thread.state.last_token
|
|
3034
|
-
)
|
|
3035
|
-
|
|
3036
|
-
|
|
3037
|
-
class ImmutableInteractiveParser(InteractiveParser):
|
|
3038
|
-
#--
|
|
3039
|
-
|
|
3040
|
-
result = None
|
|
3041
|
-
|
|
3042
|
-
def __hash__(self):
|
|
3043
|
-
return hash((self.parser_state, self.lexer_thread))
|
|
3044
|
-
|
|
3045
|
-
def feed_token(self, token):
|
|
3046
|
-
c = copy(self)
|
|
3047
|
-
c.result = InteractiveParser.feed_token(c, token)
|
|
3048
|
-
return c
|
|
3049
|
-
|
|
3050
|
-
def exhaust_lexer(self):
|
|
3051
|
-
#--
|
|
3052
|
-
cursor = self.as_mutable()
|
|
3053
|
-
cursor.exhaust_lexer()
|
|
3054
|
-
return cursor.as_immutable()
|
|
3055
|
-
|
|
3056
|
-
def as_mutable(self):
|
|
3057
|
-
#--
|
|
3058
|
-
p = copy(self)
|
|
3059
|
-
return InteractiveParser(p.parser, p.parser_state, p.lexer_thread)
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
def _wrap_lexer(lexer_class):
|
|
3066
|
-
future_interface = getattr(lexer_class, "__future_interface__", False)
|
|
3067
|
-
if future_interface:
|
|
3068
|
-
return lexer_class
|
|
3069
|
-
else:
|
|
3070
|
-
|
|
3071
|
-
class CustomLexerWrapper(Lexer):
|
|
3072
|
-
def __init__(self, lexer_conf):
|
|
3073
|
-
self.lexer = lexer_class(lexer_conf)
|
|
3074
|
-
|
|
3075
|
-
def lex(self, lexer_state, parser_state):
|
|
3076
|
-
return self.lexer.lex(lexer_state.text)
|
|
3077
|
-
|
|
3078
|
-
return CustomLexerWrapper
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
def _deserialize_parsing_frontend(data, memo, lexer_conf, callbacks, options):
|
|
3082
|
-
parser_conf = ParserConf.deserialize(data["parser_conf"], memo)
|
|
3083
|
-
cls = (options and options._plugins.get("LALR_Parser")) or LALR_Parser
|
|
3084
|
-
parser = cls.deserialize(data["parser"], memo, callbacks, options.debug)
|
|
3085
|
-
parser_conf.callbacks = callbacks
|
|
3086
|
-
return ParsingFrontend(lexer_conf, parser_conf, options, parser=parser)
|
|
3087
|
-
|
|
3088
|
-
|
|
3089
|
-
_parser_creators: "Dict[str, Callable[[LexerConf, Any, Any], Any]]" = {}
|
|
3090
|
-
|
|
3091
|
-
|
|
3092
|
-
class ParsingFrontend(Serialize):
|
|
3093
|
-
__serialize_fields__ = "lexer_conf", "parser_conf", "parser"
|
|
3094
|
-
|
|
3095
|
-
lexer_conf: LexerConf
|
|
3096
|
-
parser_conf: ParserConf
|
|
3097
|
-
options: Any
|
|
3098
|
-
|
|
3099
|
-
def __init__(
|
|
3100
|
-
self, lexer_conf: LexerConf, parser_conf: ParserConf, options, parser=None
|
|
3101
|
-
):
|
|
3102
|
-
self.parser_conf = parser_conf
|
|
3103
|
-
self.lexer_conf = lexer_conf
|
|
3104
|
-
self.options = options
|
|
3105
|
-
|
|
3106
|
-
##
|
|
3107
|
-
|
|
3108
|
-
if parser: ##
|
|
3109
|
-
|
|
3110
|
-
self.parser = parser
|
|
3111
|
-
else:
|
|
3112
|
-
create_parser = _parser_creators.get(parser_conf.parser_type)
|
|
3113
|
-
assert (
|
|
3114
|
-
create_parser is not None
|
|
3115
|
-
), "{} is not supported in standalone mode".format(parser_conf.parser_type)
|
|
3116
|
-
self.parser = create_parser(lexer_conf, parser_conf, options)
|
|
3117
|
-
|
|
3118
|
-
##
|
|
3119
|
-
|
|
3120
|
-
lexer_type = lexer_conf.lexer_type
|
|
3121
|
-
self.skip_lexer = False
|
|
3122
|
-
if lexer_type in ("dynamic", "dynamic_complete"):
|
|
3123
|
-
assert lexer_conf.postlex is None
|
|
3124
|
-
self.skip_lexer = True
|
|
3125
|
-
return
|
|
3126
|
-
|
|
3127
|
-
if isinstance(lexer_type, type):
|
|
3128
|
-
assert issubclass(lexer_type, Lexer)
|
|
3129
|
-
self.lexer = _wrap_lexer(lexer_type)(lexer_conf)
|
|
3130
|
-
elif isinstance(lexer_type, str):
|
|
3131
|
-
create_lexer = {
|
|
3132
|
-
"basic": create_basic_lexer,
|
|
3133
|
-
"contextual": create_contextual_lexer,
|
|
3134
|
-
}[lexer_type]
|
|
3135
|
-
self.lexer = create_lexer(
|
|
3136
|
-
lexer_conf, self.parser, lexer_conf.postlex, options
|
|
3137
|
-
)
|
|
3138
|
-
else:
|
|
3139
|
-
raise TypeError("Bad value for lexer_type: {lexer_type}")
|
|
3140
|
-
|
|
3141
|
-
if lexer_conf.postlex:
|
|
3142
|
-
self.lexer = PostLexConnector(self.lexer, lexer_conf.postlex)
|
|
3143
|
-
|
|
3144
|
-
def _verify_start(self, start=None):
|
|
3145
|
-
if start is None:
|
|
3146
|
-
start_decls = self.parser_conf.start
|
|
3147
|
-
if len(start_decls) > 1:
|
|
3148
|
-
raise ConfigurationError(
|
|
3149
|
-
"Lark initialized with more than 1 possible start rule. Must specify which start rule to parse",
|
|
3150
|
-
start_decls,
|
|
3151
|
-
)
|
|
3152
|
-
(start,) = start_decls
|
|
3153
|
-
elif start not in self.parser_conf.start:
|
|
3154
|
-
raise ConfigurationError(
|
|
3155
|
-
"Unknown start rule %s. Must be one of %r"
|
|
3156
|
-
% (start, self.parser_conf.start)
|
|
3157
|
-
)
|
|
3158
|
-
return start
|
|
3159
|
-
|
|
3160
|
-
def _make_lexer_thread(self, text: str) -> Union[str, LexerThread]:
|
|
3161
|
-
cls = (self.options and self.options._plugins.get("LexerThread")) or LexerThread
|
|
3162
|
-
return text if self.skip_lexer else cls.from_text(self.lexer, text)
|
|
3163
|
-
|
|
3164
|
-
def parse(self, text: str, start=None, on_error=None):
|
|
3165
|
-
chosen_start = self._verify_start(start)
|
|
3166
|
-
kw = {} if on_error is None else {"on_error": on_error}
|
|
3167
|
-
stream = self._make_lexer_thread(text)
|
|
3168
|
-
return self.parser.parse(stream, chosen_start, **kw)
|
|
3169
|
-
|
|
3170
|
-
def parse_interactive(self, text: Optional[str] = None, start=None):
|
|
3171
|
-
##
|
|
3172
|
-
|
|
3173
|
-
##
|
|
3174
|
-
|
|
3175
|
-
chosen_start = self._verify_start(start)
|
|
3176
|
-
if self.parser_conf.parser_type != "lalr":
|
|
3177
|
-
raise ConfigurationError(
|
|
3178
|
-
"parse_interactive() currently only works with parser='lalr' "
|
|
3179
|
-
)
|
|
3180
|
-
stream = self._make_lexer_thread(text) ##
|
|
3181
|
-
|
|
3182
|
-
return self.parser.parse_interactive(stream, chosen_start)
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
def _validate_frontend_args(parser, lexer) -> None:
|
|
3186
|
-
assert_config(parser, ("lalr", "earley", "cyk"))
|
|
3187
|
-
if not isinstance(lexer, type): ##
|
|
3188
|
-
|
|
3189
|
-
expected = {
|
|
3190
|
-
"lalr": ("basic", "contextual"),
|
|
3191
|
-
"earley": ("basic", "dynamic", "dynamic_complete"),
|
|
3192
|
-
"cyk": ("basic",),
|
|
3193
|
-
}[parser]
|
|
3194
|
-
assert_config(
|
|
3195
|
-
lexer,
|
|
3196
|
-
expected,
|
|
3197
|
-
"Parser %r does not support lexer %%r, expected one of %%s" % parser,
|
|
3198
|
-
)
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
def _get_lexer_callbacks(transformer, terminals):
|
|
3202
|
-
result = {}
|
|
3203
|
-
for terminal in terminals:
|
|
3204
|
-
callback = getattr(transformer, terminal.name, None)
|
|
3205
|
-
if callback is not None:
|
|
3206
|
-
result[terminal.name] = callback
|
|
3207
|
-
return result
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
class PostLexConnector:
|
|
3211
|
-
def __init__(self, lexer, postlexer):
|
|
3212
|
-
self.lexer = lexer
|
|
3213
|
-
self.postlexer = postlexer
|
|
3214
|
-
|
|
3215
|
-
def lex(self, lexer_state, parser_state):
|
|
3216
|
-
i = self.lexer.lex(lexer_state, parser_state)
|
|
3217
|
-
return self.postlexer.process(i)
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
def create_basic_lexer(lexer_conf, parser, postlex, options) -> BasicLexer:
|
|
3221
|
-
cls = (options and options._plugins.get("BasicLexer")) or BasicLexer
|
|
3222
|
-
return cls(lexer_conf)
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
def create_contextual_lexer(
|
|
3226
|
-
lexer_conf: LexerConf, parser, postlex, options
|
|
3227
|
-
) -> ContextualLexer:
|
|
3228
|
-
cls = (options and options._plugins.get("ContextualLexer")) or ContextualLexer
|
|
3229
|
-
parse_table: ParseTableBase[int] = parser._parse_table
|
|
3230
|
-
states: Dict[int, Collection[str]] = {
|
|
3231
|
-
idx: list(t.keys()) for idx, t in parse_table.states.items()
|
|
3232
|
-
}
|
|
3233
|
-
always_accept: Collection[str] = postlex.always_accept if postlex else ()
|
|
3234
|
-
return cls(lexer_conf, states, always_accept=always_accept)
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
def create_lalr_parser(
|
|
3238
|
-
lexer_conf: LexerConf, parser_conf: ParserConf, options=None
|
|
3239
|
-
) -> LALR_Parser:
|
|
3240
|
-
debug = options.debug if options else False
|
|
3241
|
-
strict = options.strict if options else False
|
|
3242
|
-
cls = (options and options._plugins.get("LALR_Parser")) or LALR_Parser
|
|
3243
|
-
return cls(parser_conf, debug=debug, strict=strict)
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
_parser_creators["lalr"] = create_lalr_parser
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
class PostLex(ABC):
|
|
3252
|
-
@abstractmethod
|
|
3253
|
-
def process(self, stream: Iterator[Token]) -> Iterator[Token]:
|
|
3254
|
-
return stream
|
|
3255
|
-
|
|
3256
|
-
always_accept: Iterable[str] = ()
|
|
3257
|
-
|
|
3258
|
-
|
|
3259
|
-
class LarkOptions(Serialize):
|
|
3260
|
-
#--
|
|
3261
|
-
|
|
3262
|
-
start: List[str]
|
|
3263
|
-
debug: bool
|
|
3264
|
-
strict: bool
|
|
3265
|
-
transformer: "Optional[Transformer]"
|
|
3266
|
-
propagate_positions: Union[bool, str]
|
|
3267
|
-
maybe_placeholders: bool
|
|
3268
|
-
cache: Union[bool, str]
|
|
3269
|
-
regex: bool
|
|
3270
|
-
g_regex_flags: int
|
|
3271
|
-
keep_all_tokens: bool
|
|
3272
|
-
tree_class: Optional[Callable[[str, List], Any]]
|
|
3273
|
-
parser: _ParserArgType
|
|
3274
|
-
lexer: _LexerArgType
|
|
3275
|
-
ambiguity: 'Literal["auto", "resolve", "explicit", "forest"]'
|
|
3276
|
-
postlex: Optional[PostLex]
|
|
3277
|
-
priority: 'Optional[Literal["auto", "normal", "invert"]]'
|
|
3278
|
-
lexer_callbacks: Dict[str, Callable[[Token], Token]]
|
|
3279
|
-
use_bytes: bool
|
|
3280
|
-
ordered_sets: bool
|
|
3281
|
-
edit_terminals: Optional[Callable[[TerminalDef], TerminalDef]]
|
|
3282
|
-
import_paths: "List[Union[str, Callable[[Union[None, str, PackageResource], str], Tuple[str, str]]]]"
|
|
3283
|
-
source_path: Optional[str]
|
|
3284
|
-
|
|
3285
|
-
OPTIONS_DOC = r"""
|
|
3286
|
-
**=== General Options ===**
|
|
3287
|
-
|
|
3288
|
-
start
|
|
3289
|
-
The start symbol. Either a string, or a list of strings for multiple possible starts (Default: "start")
|
|
3290
|
-
debug
|
|
3291
|
-
Display debug information and extra warnings. Use only when debugging (Default: ``False``)
|
|
3292
|
-
When used with Earley, it generates a forest graph as "sppf.png", if 'dot' is installed.
|
|
3293
|
-
strict
|
|
3294
|
-
Throw an exception on any potential ambiguity, including shift/reduce conflicts, and regex collisions.
|
|
3295
|
-
transformer
|
|
3296
|
-
Applies the transformer to every parse tree (equivalent to applying it after the parse, but faster)
|
|
3297
|
-
propagate_positions
|
|
3298
|
-
Propagates positional attributes into the 'meta' attribute of all tree branches.
|
|
3299
|
-
Sets attributes: (line, column, end_line, end_column, start_pos, end_pos,
|
|
3300
|
-
container_line, container_column, container_end_line, container_end_column)
|
|
3301
|
-
Accepts ``False``, ``True``, or a callable, which will filter which nodes to ignore when propagating.
|
|
3302
|
-
maybe_placeholders
|
|
3303
|
-
When ``True``, the ``[]`` operator returns ``None`` when not matched.
|
|
3304
|
-
When ``False``, ``[]`` behaves like the ``?`` operator, and returns no value at all.
|
|
3305
|
-
(default= ``True``)
|
|
3306
|
-
cache
|
|
3307
|
-
Cache the results of the Lark grammar analysis, for x2 to x3 faster loading. LALR only for now.
|
|
3308
|
-
|
|
3309
|
-
- When ``False``, does nothing (default)
|
|
3310
|
-
- When ``True``, caches to a temporary file in the local directory
|
|
3311
|
-
- When given a string, caches to the path pointed by the string
|
|
3312
|
-
regex
|
|
3313
|
-
When True, uses the ``regex`` module instead of the stdlib ``re``.
|
|
3314
|
-
g_regex_flags
|
|
3315
|
-
Flags that are applied to all terminals (both regex and strings)
|
|
3316
|
-
keep_all_tokens
|
|
3317
|
-
Prevent the tree builder from automagically removing "punctuation" tokens (Default: ``False``)
|
|
3318
|
-
tree_class
|
|
3319
|
-
Lark will produce trees comprised of instances of this class instead of the default ``lark.Tree``.
|
|
3320
|
-
|
|
3321
|
-
**=== Algorithm Options ===**
|
|
3322
|
-
|
|
3323
|
-
parser
|
|
3324
|
-
Decides which parser engine to use. Accepts "earley" or "lalr". (Default: "earley").
|
|
3325
|
-
(there is also a "cyk" option for legacy)
|
|
3326
|
-
lexer
|
|
3327
|
-
Decides whether or not to use a lexer stage
|
|
3328
|
-
|
|
3329
|
-
- "auto" (default): Choose for me based on the parser
|
|
3330
|
-
- "basic": Use a basic lexer
|
|
3331
|
-
- "contextual": Stronger lexer (only works with parser="lalr")
|
|
3332
|
-
- "dynamic": Flexible and powerful (only with parser="earley")
|
|
3333
|
-
- "dynamic_complete": Same as dynamic, but tries *every* variation of tokenizing possible.
|
|
3334
|
-
ambiguity
|
|
3335
|
-
Decides how to handle ambiguity in the parse. Only relevant if parser="earley"
|
|
3336
|
-
|
|
3337
|
-
- "resolve": The parser will automatically choose the simplest derivation
|
|
3338
|
-
(it chooses consistently: greedy for tokens, non-greedy for rules)
|
|
3339
|
-
- "explicit": The parser will return all derivations wrapped in "_ambig" tree nodes (i.e. a forest).
|
|
3340
|
-
- "forest": The parser will return the root of the shared packed parse forest.
|
|
3341
|
-
|
|
3342
|
-
**=== Misc. / Domain Specific Options ===**
|
|
3343
|
-
|
|
3344
|
-
postlex
|
|
3345
|
-
Lexer post-processing (Default: ``None``) Only works with the basic and contextual lexers.
|
|
3346
|
-
priority
|
|
3347
|
-
How priorities should be evaluated - "auto", ``None``, "normal", "invert" (Default: "auto")
|
|
3348
|
-
lexer_callbacks
|
|
3349
|
-
Dictionary of callbacks for the lexer. May alter tokens during lexing. Use with caution.
|
|
3350
|
-
use_bytes
|
|
3351
|
-
Accept an input of type ``bytes`` instead of ``str``.
|
|
3352
|
-
ordered_sets
|
|
3353
|
-
Should Earley use ordered-sets to achieve stable output (~10% slower than regular sets. Default: True)
|
|
3354
|
-
edit_terminals
|
|
3355
|
-
A callback for editing the terminals before parse.
|
|
3356
|
-
import_paths
|
|
3357
|
-
A List of either paths or loader functions to specify from where grammars are imported
|
|
3358
|
-
source_path
|
|
3359
|
-
Override the source of from where the grammar was loaded. Useful for relative imports and unconventional grammar loading
|
|
3360
|
-
**=== End of Options ===**
|
|
3361
|
-
"""
|
|
3362
|
-
if __doc__:
|
|
3363
|
-
__doc__ += OPTIONS_DOC
|
|
3364
|
-
|
|
3365
|
-
##
|
|
3366
|
-
|
|
3367
|
-
##
|
|
3368
|
-
|
|
3369
|
-
##
|
|
3370
|
-
|
|
3371
|
-
##
|
|
3372
|
-
|
|
3373
|
-
##
|
|
3374
|
-
|
|
3375
|
-
##
|
|
3376
|
-
|
|
3377
|
-
_defaults: Dict[str, Any] = {
|
|
3378
|
-
"debug": False,
|
|
3379
|
-
"strict": False,
|
|
3380
|
-
"keep_all_tokens": False,
|
|
3381
|
-
"tree_class": None,
|
|
3382
|
-
"cache": False,
|
|
3383
|
-
"postlex": None,
|
|
3384
|
-
"parser": "earley",
|
|
3385
|
-
"lexer": "auto",
|
|
3386
|
-
"transformer": None,
|
|
3387
|
-
"start": "start",
|
|
3388
|
-
"priority": "auto",
|
|
3389
|
-
"ambiguity": "auto",
|
|
3390
|
-
"regex": False,
|
|
3391
|
-
"propagate_positions": False,
|
|
3392
|
-
"lexer_callbacks": {},
|
|
3393
|
-
"maybe_placeholders": True,
|
|
3394
|
-
"edit_terminals": None,
|
|
3395
|
-
"g_regex_flags": 0,
|
|
3396
|
-
"use_bytes": False,
|
|
3397
|
-
"ordered_sets": True,
|
|
3398
|
-
"import_paths": [],
|
|
3399
|
-
"source_path": None,
|
|
3400
|
-
"_plugins": {},
|
|
3401
|
-
}
|
|
3402
|
-
|
|
3403
|
-
def __init__(self, options_dict: Dict[str, Any]) -> None:
|
|
3404
|
-
o = dict(options_dict)
|
|
3405
|
-
|
|
3406
|
-
options = {}
|
|
3407
|
-
for name, default in self._defaults.items():
|
|
3408
|
-
if name in o:
|
|
3409
|
-
value = o.pop(name)
|
|
3410
|
-
if isinstance(default, bool) and name not in (
|
|
3411
|
-
"cache",
|
|
3412
|
-
"use_bytes",
|
|
3413
|
-
"propagate_positions",
|
|
3414
|
-
):
|
|
3415
|
-
value = bool(value)
|
|
3416
|
-
else:
|
|
3417
|
-
value = default
|
|
3418
|
-
|
|
3419
|
-
options[name] = value
|
|
3420
|
-
|
|
3421
|
-
if isinstance(options["start"], str):
|
|
3422
|
-
options["start"] = [options["start"]]
|
|
3423
|
-
|
|
3424
|
-
self.__dict__["options"] = options
|
|
3425
|
-
|
|
3426
|
-
assert_config(self.parser, ("earley", "lalr", "cyk", None))
|
|
3427
|
-
|
|
3428
|
-
if self.parser == "earley" and self.transformer:
|
|
3429
|
-
raise ConfigurationError(
|
|
3430
|
-
"Cannot specify an embedded transformer when using the Earley algorithm. "
|
|
3431
|
-
"Please use your transformer on the resulting parse tree, or use a different algorithm (i.e. LALR)"
|
|
3432
|
-
)
|
|
3433
|
-
|
|
3434
|
-
if o:
|
|
3435
|
-
raise ConfigurationError("Unknown options: %s" % o.keys())
|
|
3436
|
-
|
|
3437
|
-
def __getattr__(self, name: str) -> Any:
|
|
3438
|
-
try:
|
|
3439
|
-
return self.__dict__["options"][name]
|
|
3440
|
-
except KeyError as e:
|
|
3441
|
-
raise AttributeError(e)
|
|
3442
|
-
|
|
3443
|
-
def __setattr__(self, name: str, value: str) -> None:
|
|
3444
|
-
assert_config(
|
|
3445
|
-
name, self.options.keys(), "%r isn't a valid option. Expected one of: %s"
|
|
3446
|
-
)
|
|
3447
|
-
self.options[name] = value
|
|
3448
|
-
|
|
3449
|
-
def serialize(self, memo=None) -> Dict[str, Any]:
|
|
3450
|
-
return self.options
|
|
3451
|
-
|
|
3452
|
-
@classmethod
|
|
3453
|
-
def deserialize(
|
|
3454
|
-
cls, data: Dict[str, Any], memo: Dict[int, Union[TerminalDef, Rule]]
|
|
3455
|
-
) -> "LarkOptions":
|
|
3456
|
-
return cls(data)
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
##
|
|
3460
|
-
|
|
3461
|
-
##
|
|
3462
|
-
|
|
3463
|
-
_LOAD_ALLOWED_OPTIONS = {
|
|
3464
|
-
"postlex",
|
|
3465
|
-
"transformer",
|
|
3466
|
-
"lexer_callbacks",
|
|
3467
|
-
"use_bytes",
|
|
3468
|
-
"debug",
|
|
3469
|
-
"g_regex_flags",
|
|
3470
|
-
"regex",
|
|
3471
|
-
"propagate_positions",
|
|
3472
|
-
"tree_class",
|
|
3473
|
-
"_plugins",
|
|
3474
|
-
}
|
|
3475
|
-
|
|
3476
|
-
_VALID_PRIORITY_OPTIONS = ("auto", "normal", "invert", None)
|
|
3477
|
-
_VALID_AMBIGUITY_OPTIONS = ("auto", "resolve", "explicit", "forest")
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
_T = TypeVar("_T", bound="Lark")
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
class Lark(Serialize):
|
|
3484
|
-
#--
|
|
3485
|
-
|
|
3486
|
-
source_path: str
|
|
3487
|
-
source_grammar: str
|
|
3488
|
-
grammar: "Grammar"
|
|
3489
|
-
options: LarkOptions
|
|
3490
|
-
lexer: Lexer
|
|
3491
|
-
parser: "ParsingFrontend"
|
|
3492
|
-
terminals: Collection[TerminalDef]
|
|
3493
|
-
|
|
3494
|
-
def __init__(self, grammar: "Union[Grammar, str, IO[str]]", **options) -> None:
|
|
3495
|
-
self.options = LarkOptions(options)
|
|
3496
|
-
re_module: types.ModuleType
|
|
3497
|
-
|
|
3498
|
-
##
|
|
3499
|
-
|
|
3500
|
-
use_regex = self.options.regex
|
|
3501
|
-
if use_regex:
|
|
3502
|
-
if _has_regex:
|
|
3503
|
-
re_module = regex
|
|
3504
|
-
else:
|
|
3505
|
-
raise ImportError(
|
|
3506
|
-
"`regex` module must be installed if calling `Lark(regex=True)`."
|
|
3507
|
-
)
|
|
3508
|
-
else:
|
|
3509
|
-
re_module = re
|
|
3510
|
-
|
|
3511
|
-
##
|
|
3512
|
-
|
|
3513
|
-
if self.options.source_path is None:
|
|
3514
|
-
try:
|
|
3515
|
-
self.source_path = grammar.name ##
|
|
3516
|
-
|
|
3517
|
-
except AttributeError:
|
|
3518
|
-
self.source_path = "<string>"
|
|
3519
|
-
else:
|
|
3520
|
-
self.source_path = self.options.source_path
|
|
3521
|
-
|
|
3522
|
-
##
|
|
3523
|
-
|
|
3524
|
-
try:
|
|
3525
|
-
read = grammar.read ##
|
|
3526
|
-
|
|
3527
|
-
except AttributeError:
|
|
3528
|
-
pass
|
|
3529
|
-
else:
|
|
3530
|
-
grammar = read()
|
|
3531
|
-
|
|
3532
|
-
cache_fn = None
|
|
3533
|
-
cache_sha256 = None
|
|
3534
|
-
if isinstance(grammar, str):
|
|
3535
|
-
self.source_grammar = grammar
|
|
3536
|
-
if self.options.use_bytes:
|
|
3537
|
-
if not isascii(grammar):
|
|
3538
|
-
raise ConfigurationError(
|
|
3539
|
-
"Grammar must be ascii only, when use_bytes=True"
|
|
3540
|
-
)
|
|
3541
|
-
|
|
3542
|
-
if self.options.cache:
|
|
3543
|
-
if self.options.parser != "lalr":
|
|
3544
|
-
raise ConfigurationError(
|
|
3545
|
-
"cache only works with parser='lalr' for now"
|
|
3546
|
-
)
|
|
3547
|
-
|
|
3548
|
-
unhashable = (
|
|
3549
|
-
"transformer",
|
|
3550
|
-
"postlex",
|
|
3551
|
-
"lexer_callbacks",
|
|
3552
|
-
"edit_terminals",
|
|
3553
|
-
"_plugins",
|
|
3554
|
-
)
|
|
3555
|
-
options_str = "".join(
|
|
3556
|
-
k + str(v) for k, v in options.items() if k not in unhashable
|
|
3557
|
-
)
|
|
3558
|
-
from . import __version__
|
|
3559
|
-
|
|
3560
|
-
s = grammar + options_str + __version__ + str(sys.version_info[:2])
|
|
3561
|
-
cache_sha256 = sha256_digest(s)
|
|
3562
|
-
|
|
3563
|
-
if isinstance(self.options.cache, str):
|
|
3564
|
-
cache_fn = self.options.cache
|
|
3565
|
-
else:
|
|
3566
|
-
if self.options.cache is not True:
|
|
3567
|
-
raise ConfigurationError("cache argument must be bool or str")
|
|
3568
|
-
|
|
3569
|
-
try:
|
|
3570
|
-
username = getpass.getuser()
|
|
3571
|
-
except Exception:
|
|
3572
|
-
##
|
|
3573
|
-
|
|
3574
|
-
##
|
|
3575
|
-
|
|
3576
|
-
##
|
|
3577
|
-
|
|
3578
|
-
username = "unknown"
|
|
3579
|
-
|
|
3580
|
-
cache_fn = (
|
|
3581
|
-
tempfile.gettempdir()
|
|
3582
|
-
+ "/.lark_cache_%s_%s_%s_%s.tmp"
|
|
3583
|
-
% (username, cache_sha256, *sys.version_info[:2])
|
|
3584
|
-
)
|
|
3585
|
-
|
|
3586
|
-
old_options = self.options
|
|
3587
|
-
try:
|
|
3588
|
-
with FS.open(cache_fn, "rb") as f:
|
|
3589
|
-
logger.debug("Loading grammar from cache: %s", cache_fn)
|
|
3590
|
-
##
|
|
3591
|
-
|
|
3592
|
-
for name in set(options) - _LOAD_ALLOWED_OPTIONS:
|
|
3593
|
-
del options[name]
|
|
3594
|
-
file_sha256 = f.readline().rstrip(b"\n")
|
|
3595
|
-
cached_used_files = pickle.load(f)
|
|
3596
|
-
if file_sha256 == cache_sha256.encode(
|
|
3597
|
-
"utf8"
|
|
3598
|
-
) and verify_used_files(cached_used_files):
|
|
3599
|
-
cached_parser_data = pickle.load(f)
|
|
3600
|
-
self._load(cached_parser_data, **options)
|
|
3601
|
-
return
|
|
3602
|
-
except FileNotFoundError:
|
|
3603
|
-
##
|
|
3604
|
-
|
|
3605
|
-
pass
|
|
3606
|
-
except (
|
|
3607
|
-
Exception
|
|
3608
|
-
): ##
|
|
3609
|
-
|
|
3610
|
-
logger.exception(
|
|
3611
|
-
"Failed to load Lark from cache: %r. We will try to carry on.",
|
|
3612
|
-
cache_fn,
|
|
3613
|
-
)
|
|
3614
|
-
|
|
3615
|
-
##
|
|
3616
|
-
|
|
3617
|
-
##
|
|
3618
|
-
|
|
3619
|
-
self.options = old_options
|
|
3620
|
-
|
|
3621
|
-
##
|
|
3622
|
-
|
|
3623
|
-
self.grammar, used_files = load_grammar(
|
|
3624
|
-
grammar,
|
|
3625
|
-
self.source_path,
|
|
3626
|
-
self.options.import_paths,
|
|
3627
|
-
self.options.keep_all_tokens,
|
|
3628
|
-
)
|
|
3629
|
-
else:
|
|
3630
|
-
assert isinstance(grammar, Grammar)
|
|
3631
|
-
self.grammar = grammar
|
|
3632
|
-
|
|
3633
|
-
if self.options.lexer == "auto":
|
|
3634
|
-
if self.options.parser == "lalr":
|
|
3635
|
-
self.options.lexer = "contextual"
|
|
3636
|
-
elif self.options.parser == "earley":
|
|
3637
|
-
if self.options.postlex is not None:
|
|
3638
|
-
logger.info(
|
|
3639
|
-
"postlex can't be used with the dynamic lexer, so we use 'basic' instead. "
|
|
3640
|
-
"Consider using lalr with contextual instead of earley"
|
|
3641
|
-
)
|
|
3642
|
-
self.options.lexer = "basic"
|
|
3643
|
-
else:
|
|
3644
|
-
self.options.lexer = "dynamic"
|
|
3645
|
-
elif self.options.parser == "cyk":
|
|
3646
|
-
self.options.lexer = "basic"
|
|
3647
|
-
else:
|
|
3648
|
-
assert False, self.options.parser
|
|
3649
|
-
lexer = self.options.lexer
|
|
3650
|
-
if isinstance(lexer, type):
|
|
3651
|
-
assert issubclass(
|
|
3652
|
-
lexer, Lexer
|
|
3653
|
-
) ##
|
|
3654
|
-
|
|
3655
|
-
else:
|
|
3656
|
-
assert_config(lexer, ("basic", "contextual", "dynamic", "dynamic_complete"))
|
|
3657
|
-
if self.options.postlex is not None and "dynamic" in lexer:
|
|
3658
|
-
raise ConfigurationError(
|
|
3659
|
-
"Can't use postlex with a dynamic lexer. Use basic or contextual instead"
|
|
3660
|
-
)
|
|
3661
|
-
|
|
3662
|
-
if self.options.ambiguity == "auto":
|
|
3663
|
-
if self.options.parser == "earley":
|
|
3664
|
-
self.options.ambiguity = "resolve"
|
|
3665
|
-
else:
|
|
3666
|
-
assert_config(
|
|
3667
|
-
self.options.parser,
|
|
3668
|
-
("earley", "cyk"),
|
|
3669
|
-
"%r doesn't support disambiguation. Use one of these parsers instead: %s",
|
|
3670
|
-
)
|
|
3671
|
-
|
|
3672
|
-
if self.options.priority == "auto":
|
|
3673
|
-
self.options.priority = "normal"
|
|
3674
|
-
|
|
3675
|
-
if self.options.priority not in _VALID_PRIORITY_OPTIONS:
|
|
3676
|
-
raise ConfigurationError(
|
|
3677
|
-
"invalid priority option: %r. Must be one of %r"
|
|
3678
|
-
% (self.options.priority, _VALID_PRIORITY_OPTIONS)
|
|
3679
|
-
)
|
|
3680
|
-
if self.options.ambiguity not in _VALID_AMBIGUITY_OPTIONS:
|
|
3681
|
-
raise ConfigurationError(
|
|
3682
|
-
"invalid ambiguity option: %r. Must be one of %r"
|
|
3683
|
-
% (self.options.ambiguity, _VALID_AMBIGUITY_OPTIONS)
|
|
3684
|
-
)
|
|
3685
|
-
|
|
3686
|
-
if self.options.parser is None:
|
|
3687
|
-
terminals_to_keep = "*"
|
|
3688
|
-
elif self.options.postlex is not None:
|
|
3689
|
-
terminals_to_keep = set(self.options.postlex.always_accept)
|
|
3690
|
-
else:
|
|
3691
|
-
terminals_to_keep = set()
|
|
3692
|
-
|
|
3693
|
-
##
|
|
3694
|
-
|
|
3695
|
-
self.terminals, self.rules, self.ignore_tokens = self.grammar.compile(
|
|
3696
|
-
self.options.start, terminals_to_keep
|
|
3697
|
-
)
|
|
3698
|
-
|
|
3699
|
-
if self.options.edit_terminals:
|
|
3700
|
-
for t in self.terminals:
|
|
3701
|
-
self.options.edit_terminals(t)
|
|
3702
|
-
|
|
3703
|
-
self._terminals_dict = {t.name: t for t in self.terminals}
|
|
3704
|
-
|
|
3705
|
-
##
|
|
3706
|
-
|
|
3707
|
-
if self.options.priority == "invert":
|
|
3708
|
-
for rule in self.rules:
|
|
3709
|
-
if rule.options.priority is not None:
|
|
3710
|
-
rule.options.priority = -rule.options.priority
|
|
3711
|
-
for term in self.terminals:
|
|
3712
|
-
term.priority = -term.priority
|
|
3713
|
-
##
|
|
3714
|
-
|
|
3715
|
-
##
|
|
3716
|
-
|
|
3717
|
-
##
|
|
3718
|
-
|
|
3719
|
-
elif self.options.priority is None:
|
|
3720
|
-
for rule in self.rules:
|
|
3721
|
-
if rule.options.priority is not None:
|
|
3722
|
-
rule.options.priority = None
|
|
3723
|
-
for term in self.terminals:
|
|
3724
|
-
term.priority = 0
|
|
3725
|
-
|
|
3726
|
-
##
|
|
3727
|
-
|
|
3728
|
-
self.lexer_conf = LexerConf(
|
|
3729
|
-
self.terminals,
|
|
3730
|
-
re_module,
|
|
3731
|
-
self.ignore_tokens,
|
|
3732
|
-
self.options.postlex,
|
|
3733
|
-
self.options.lexer_callbacks,
|
|
3734
|
-
self.options.g_regex_flags,
|
|
3735
|
-
use_bytes=self.options.use_bytes,
|
|
3736
|
-
strict=self.options.strict,
|
|
3737
|
-
)
|
|
3738
|
-
|
|
3739
|
-
if self.options.parser:
|
|
3740
|
-
self.parser = self._build_parser()
|
|
3741
|
-
elif lexer:
|
|
3742
|
-
self.lexer = self._build_lexer()
|
|
3743
|
-
|
|
3744
|
-
if cache_fn:
|
|
3745
|
-
logger.debug("Saving grammar to cache: %s", cache_fn)
|
|
3746
|
-
try:
|
|
3747
|
-
with FS.open(cache_fn, "wb") as f:
|
|
3748
|
-
assert cache_sha256 is not None
|
|
3749
|
-
f.write(cache_sha256.encode("utf8") + b"\n")
|
|
3750
|
-
pickle.dump(used_files, f)
|
|
3751
|
-
self.save(f, _LOAD_ALLOWED_OPTIONS)
|
|
3752
|
-
except IOError as e:
|
|
3753
|
-
logger.exception("Failed to save Lark to cache: %r.", cache_fn, e)
|
|
3754
|
-
|
|
3755
|
-
if __doc__:
|
|
3756
|
-
__doc__ += "\n\n" + LarkOptions.OPTIONS_DOC
|
|
3757
|
-
|
|
3758
|
-
__serialize_fields__ = "parser", "rules", "options"
|
|
3759
|
-
|
|
3760
|
-
def _build_lexer(self, dont_ignore: bool = False) -> BasicLexer:
|
|
3761
|
-
lexer_conf = self.lexer_conf
|
|
3762
|
-
if dont_ignore:
|
|
3763
|
-
from copy import copy
|
|
3764
|
-
|
|
3765
|
-
lexer_conf = copy(lexer_conf)
|
|
3766
|
-
lexer_conf.ignore = ()
|
|
3767
|
-
return BasicLexer(lexer_conf)
|
|
3768
|
-
|
|
3769
|
-
def _prepare_callbacks(self) -> None:
|
|
3770
|
-
self._callbacks = {}
|
|
3771
|
-
##
|
|
3772
|
-
|
|
3773
|
-
if self.options.ambiguity != "forest":
|
|
3774
|
-
self._parse_tree_builder = ParseTreeBuilder(
|
|
3775
|
-
self.rules,
|
|
3776
|
-
self.options.tree_class or Tree,
|
|
3777
|
-
self.options.propagate_positions,
|
|
3778
|
-
self.options.parser != "lalr" and self.options.ambiguity == "explicit",
|
|
3779
|
-
self.options.maybe_placeholders,
|
|
3780
|
-
)
|
|
3781
|
-
self._callbacks = self._parse_tree_builder.create_callback(
|
|
3782
|
-
self.options.transformer
|
|
3783
|
-
)
|
|
3784
|
-
self._callbacks.update(
|
|
3785
|
-
_get_lexer_callbacks(self.options.transformer, self.terminals)
|
|
3786
|
-
)
|
|
3787
|
-
|
|
3788
|
-
def _build_parser(self) -> "ParsingFrontend":
|
|
3789
|
-
self._prepare_callbacks()
|
|
3790
|
-
_validate_frontend_args(self.options.parser, self.options.lexer)
|
|
3791
|
-
parser_conf = ParserConf(self.rules, self._callbacks, self.options.start)
|
|
3792
|
-
return _construct_parsing_frontend(
|
|
3793
|
-
self.options.parser,
|
|
3794
|
-
self.options.lexer,
|
|
3795
|
-
self.lexer_conf,
|
|
3796
|
-
parser_conf,
|
|
3797
|
-
options=self.options,
|
|
3798
|
-
)
|
|
3799
|
-
|
|
3800
|
-
def save(self, f, exclude_options: Collection[str] = ()) -> None:
|
|
3801
|
-
#--
|
|
3802
|
-
if self.options.parser != "lalr":
|
|
3803
|
-
raise NotImplementedError(
|
|
3804
|
-
"Lark.save() is only implemented for the LALR(1) parser."
|
|
3805
|
-
)
|
|
3806
|
-
data, m = self.memo_serialize([TerminalDef, Rule])
|
|
3807
|
-
if exclude_options:
|
|
3808
|
-
data["options"] = {
|
|
3809
|
-
n: v for n, v in data["options"].items() if n not in exclude_options
|
|
3810
|
-
}
|
|
3811
|
-
pickle.dump({"data": data, "memo": m}, f, protocol=pickle.HIGHEST_PROTOCOL)
|
|
3812
|
-
|
|
3813
|
-
@classmethod
|
|
3814
|
-
def load(cls: Type[_T], f) -> _T:
|
|
3815
|
-
#--
|
|
3816
|
-
inst = cls.__new__(cls)
|
|
3817
|
-
return inst._load(f)
|
|
3818
|
-
|
|
3819
|
-
def _deserialize_lexer_conf(
|
|
3820
|
-
self,
|
|
3821
|
-
data: Dict[str, Any],
|
|
3822
|
-
memo: Dict[int, Union[TerminalDef, Rule]],
|
|
3823
|
-
options: LarkOptions,
|
|
3824
|
-
) -> LexerConf:
|
|
3825
|
-
lexer_conf = LexerConf.deserialize(data["lexer_conf"], memo)
|
|
3826
|
-
lexer_conf.callbacks = options.lexer_callbacks or {}
|
|
3827
|
-
lexer_conf.re_module = regex if options.regex else re
|
|
3828
|
-
lexer_conf.use_bytes = options.use_bytes
|
|
3829
|
-
lexer_conf.g_regex_flags = options.g_regex_flags
|
|
3830
|
-
lexer_conf.skip_validation = True
|
|
3831
|
-
lexer_conf.postlex = options.postlex
|
|
3832
|
-
return lexer_conf
|
|
3833
|
-
|
|
3834
|
-
def _load(self: _T, f: Any, **kwargs) -> _T:
|
|
3835
|
-
if isinstance(f, dict):
|
|
3836
|
-
d = f
|
|
3837
|
-
else:
|
|
3838
|
-
d = pickle.load(f)
|
|
3839
|
-
memo_json = d["memo"]
|
|
3840
|
-
data = d["data"]
|
|
3841
|
-
|
|
3842
|
-
assert memo_json
|
|
3843
|
-
memo = SerializeMemoizer.deserialize(
|
|
3844
|
-
memo_json, {"Rule": Rule, "TerminalDef": TerminalDef}, {}
|
|
3845
|
-
)
|
|
3846
|
-
options = dict(data["options"])
|
|
3847
|
-
if (set(kwargs) - _LOAD_ALLOWED_OPTIONS) & set(LarkOptions._defaults):
|
|
3848
|
-
raise ConfigurationError(
|
|
3849
|
-
"Some options are not allowed when loading a Parser: {}".format(
|
|
3850
|
-
set(kwargs) - _LOAD_ALLOWED_OPTIONS
|
|
3851
|
-
)
|
|
3852
|
-
)
|
|
3853
|
-
options.update(kwargs)
|
|
3854
|
-
self.options = LarkOptions.deserialize(options, memo)
|
|
3855
|
-
self.rules = [Rule.deserialize(r, memo) for r in data["rules"]]
|
|
3856
|
-
self.source_path = "<deserialized>"
|
|
3857
|
-
_validate_frontend_args(self.options.parser, self.options.lexer)
|
|
3858
|
-
self.lexer_conf = self._deserialize_lexer_conf(
|
|
3859
|
-
data["parser"], memo, self.options
|
|
3860
|
-
)
|
|
3861
|
-
self.terminals = self.lexer_conf.terminals
|
|
3862
|
-
self._prepare_callbacks()
|
|
3863
|
-
self._terminals_dict = {t.name: t for t in self.terminals}
|
|
3864
|
-
self.parser = _deserialize_parsing_frontend(
|
|
3865
|
-
data["parser"],
|
|
3866
|
-
memo,
|
|
3867
|
-
self.lexer_conf,
|
|
3868
|
-
self._callbacks,
|
|
3869
|
-
self.options, ##
|
|
3870
|
-
|
|
3871
|
-
)
|
|
3872
|
-
return self
|
|
3873
|
-
|
|
3874
|
-
@classmethod
|
|
3875
|
-
def _load_from_dict(cls, data, memo, **kwargs):
|
|
3876
|
-
inst = cls.__new__(cls)
|
|
3877
|
-
return inst._load({"data": data, "memo": memo}, **kwargs)
|
|
3878
|
-
|
|
3879
|
-
@classmethod
|
|
3880
|
-
def open(
|
|
3881
|
-
cls: Type[_T], grammar_filename: str, rel_to: Optional[str] = None, **options
|
|
3882
|
-
) -> _T:
|
|
3883
|
-
#--
|
|
3884
|
-
if rel_to:
|
|
3885
|
-
basepath = os.path.dirname(rel_to)
|
|
3886
|
-
grammar_filename = os.path.join(basepath, grammar_filename)
|
|
3887
|
-
with open(grammar_filename, encoding="utf8") as f:
|
|
3888
|
-
return cls(f, **options)
|
|
3889
|
-
|
|
3890
|
-
@classmethod
|
|
3891
|
-
def open_from_package(
|
|
3892
|
-
cls: Type[_T],
|
|
3893
|
-
package: str,
|
|
3894
|
-
grammar_path: str,
|
|
3895
|
-
search_paths: "Sequence[str]" = [""],
|
|
3896
|
-
**options
|
|
3897
|
-
) -> _T:
|
|
3898
|
-
#--
|
|
3899
|
-
package_loader = FromPackageLoader(package, search_paths)
|
|
3900
|
-
full_path, text = package_loader(None, grammar_path)
|
|
3901
|
-
options.setdefault("source_path", full_path)
|
|
3902
|
-
options.setdefault("import_paths", [])
|
|
3903
|
-
options["import_paths"].append(package_loader)
|
|
3904
|
-
return cls(text, **options)
|
|
3905
|
-
|
|
3906
|
-
def __repr__(self):
|
|
3907
|
-
return "Lark(open(%r), parser=%r, lexer=%r, ...)" % (
|
|
3908
|
-
self.source_path,
|
|
3909
|
-
self.options.parser,
|
|
3910
|
-
self.options.lexer,
|
|
3911
|
-
)
|
|
3912
|
-
|
|
3913
|
-
def lex(self, text: str, dont_ignore: bool = False) -> Iterator[Token]:
|
|
3914
|
-
#--
|
|
3915
|
-
lexer: Lexer
|
|
3916
|
-
if not hasattr(self, "lexer") or dont_ignore:
|
|
3917
|
-
lexer = self._build_lexer(dont_ignore)
|
|
3918
|
-
else:
|
|
3919
|
-
lexer = self.lexer
|
|
3920
|
-
lexer_thread = LexerThread.from_text(lexer, text)
|
|
3921
|
-
stream = lexer_thread.lex(None)
|
|
3922
|
-
if self.options.postlex:
|
|
3923
|
-
return self.options.postlex.process(stream)
|
|
3924
|
-
return stream
|
|
3925
|
-
|
|
3926
|
-
def get_terminal(self, name: str) -> TerminalDef:
|
|
3927
|
-
#--
|
|
3928
|
-
return self._terminals_dict[name]
|
|
3929
|
-
|
|
3930
|
-
def parse_interactive(
|
|
3931
|
-
self, text: Optional[str] = None, start: Optional[str] = None
|
|
3932
|
-
) -> "InteractiveParser":
|
|
3933
|
-
#--
|
|
3934
|
-
return self.parser.parse_interactive(text, start=start)
|
|
3935
|
-
|
|
3936
|
-
def parse(
|
|
3937
|
-
self,
|
|
3938
|
-
text: str,
|
|
3939
|
-
start: Optional[str] = None,
|
|
3940
|
-
on_error: "Optional[Callable[[UnexpectedInput], bool]]" = None,
|
|
3941
|
-
) -> "ParseTree":
|
|
3942
|
-
#--
|
|
3943
|
-
return self.parser.parse(text, start=start, on_error=on_error)
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3949
|
-
class DedentError(LarkError):
|
|
3950
|
-
pass
|
|
3951
|
-
|
|
3952
|
-
|
|
3953
|
-
class Indenter(PostLex, ABC):
|
|
3954
|
-
paren_level: int
|
|
3955
|
-
indent_level: List[int]
|
|
3956
|
-
|
|
3957
|
-
def __init__(self) -> None:
|
|
3958
|
-
self.paren_level = 0
|
|
3959
|
-
self.indent_level = [0]
|
|
3960
|
-
assert self.tab_len > 0
|
|
3961
|
-
|
|
3962
|
-
def handle_NL(self, token: Token) -> Iterator[Token]:
|
|
3963
|
-
if self.paren_level > 0:
|
|
3964
|
-
return
|
|
3965
|
-
|
|
3966
|
-
yield token
|
|
3967
|
-
|
|
3968
|
-
indent_str = token.rsplit("\n", 1)[1] ##
|
|
3969
|
-
|
|
3970
|
-
indent = indent_str.count(" ") + indent_str.count("\t") * self.tab_len
|
|
3971
|
-
|
|
3972
|
-
if indent > self.indent_level[-1]:
|
|
3973
|
-
self.indent_level.append(indent)
|
|
3974
|
-
yield Token.new_borrow_pos(self.INDENT_type, indent_str, token)
|
|
3975
|
-
else:
|
|
3976
|
-
while indent < self.indent_level[-1]:
|
|
3977
|
-
self.indent_level.pop()
|
|
3978
|
-
yield Token.new_borrow_pos(self.DEDENT_type, indent_str, token)
|
|
3979
|
-
|
|
3980
|
-
if indent != self.indent_level[-1]:
|
|
3981
|
-
raise DedentError(
|
|
3982
|
-
"Unexpected dedent to column %s. Expected dedent to %s"
|
|
3983
|
-
% (indent, self.indent_level[-1])
|
|
3984
|
-
)
|
|
3985
|
-
|
|
3986
|
-
def _process(self, stream):
|
|
3987
|
-
for token in stream:
|
|
3988
|
-
if token.type == self.NL_type:
|
|
3989
|
-
yield from self.handle_NL(token)
|
|
3990
|
-
else:
|
|
3991
|
-
yield token
|
|
3992
|
-
|
|
3993
|
-
if token.type in self.OPEN_PAREN_types:
|
|
3994
|
-
self.paren_level += 1
|
|
3995
|
-
elif token.type in self.CLOSE_PAREN_types:
|
|
3996
|
-
self.paren_level -= 1
|
|
3997
|
-
assert self.paren_level >= 0
|
|
3998
|
-
|
|
3999
|
-
while len(self.indent_level) > 1:
|
|
4000
|
-
self.indent_level.pop()
|
|
4001
|
-
yield Token(self.DEDENT_type, "")
|
|
4002
|
-
|
|
4003
|
-
assert self.indent_level == [0], self.indent_level
|
|
4004
|
-
|
|
4005
|
-
def process(self, stream):
|
|
4006
|
-
self.paren_level = 0
|
|
4007
|
-
self.indent_level = [0]
|
|
4008
|
-
return self._process(stream)
|
|
4009
|
-
|
|
4010
|
-
##
|
|
4011
|
-
|
|
4012
|
-
@property
|
|
4013
|
-
def always_accept(self):
|
|
4014
|
-
return (self.NL_type,)
|
|
4015
|
-
|
|
4016
|
-
@property
|
|
4017
|
-
@abstractmethod
|
|
4018
|
-
def NL_type(self) -> str:
|
|
4019
|
-
raise NotImplementedError()
|
|
4020
|
-
|
|
4021
|
-
@property
|
|
4022
|
-
@abstractmethod
|
|
4023
|
-
def OPEN_PAREN_types(self) -> List[str]:
|
|
4024
|
-
raise NotImplementedError()
|
|
4025
|
-
|
|
4026
|
-
@property
|
|
4027
|
-
@abstractmethod
|
|
4028
|
-
def CLOSE_PAREN_types(self) -> List[str]:
|
|
4029
|
-
raise NotImplementedError()
|
|
4030
|
-
|
|
4031
|
-
@property
|
|
4032
|
-
@abstractmethod
|
|
4033
|
-
def INDENT_type(self) -> str:
|
|
4034
|
-
raise NotImplementedError()
|
|
4035
|
-
|
|
4036
|
-
@property
|
|
4037
|
-
@abstractmethod
|
|
4038
|
-
def DEDENT_type(self) -> str:
|
|
4039
|
-
raise NotImplementedError()
|
|
4040
|
-
|
|
4041
|
-
@property
|
|
4042
|
-
@abstractmethod
|
|
4043
|
-
def tab_len(self) -> int:
|
|
4044
|
-
raise NotImplementedError()
|
|
4045
|
-
|
|
4046
|
-
|
|
4047
|
-
class PythonIndenter(Indenter):
|
|
4048
|
-
NL_type = "_NEWLINE"
|
|
4049
|
-
OPEN_PAREN_types = ["LPAR", "LSQB", "LBRACE"]
|
|
4050
|
-
CLOSE_PAREN_types = ["RPAR", "RSQB", "RBRACE"]
|
|
4051
|
-
INDENT_type = "_INDENT"
|
|
4052
|
-
DEDENT_type = "_DEDENT"
|
|
4053
|
-
tab_len = 8
|
|
4054
|
-
|
|
4055
|
-
|
|
4056
|
-
|
|
4057
|
-
import pickle, zlib, base64
|
|
4058
|
-
DATA = (
|
|
4059
|
-
b'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kaLCSFFhpKgwUlQYKSqMFBVGigojRYWRosJIUWGkqDBSVBgpKowUFUaKCiNFhZGiwkhRYaSoMFJUGCkqjBQVRooKI8XolWL0SjF6pahFUoxlKSqTFCNbipEtxciWYmRLUdGkGOdSjHMpxrkU41yKcS5FXZSiLkpRF6UYEVNUSSmqpBRVUooqKcVImqJKSlElpRhlU9RMKcbcFGNuijE3xZibotZKMQKnGIFT1GEp6rAUdViKcS7FyJ1i5E4xcqeo31LUbylG9RSjeopRPUWll2KMT1H3paj7UozVKeq+FLVBiiowRRWYom5IUTekqBBTVIgpaooUNUWKmqKig+h9dAh9EKqz7T+FI383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I383I393ZeT/z1GbjQ7g/0F0jrt36MWfV5cr9yD2Ri+iw/r7otPfvxwdDH87+lD0NNkzoxcXDr14J3rx4NCLR6IXFw29+KPos0+LPntSfOjVr0SvqqOLD9HvuRsfj/6jR8KO0ktH6aWj9NJReukovXSUXjpKLx2ll47SS0fppaP00lF66Si9dJReOkovHaWXjtJLR+mlo/TSUXrpKL10lF46Si8dpZeO0ktH6aWj9NJReukovXSUXjpKLx2ll47SS0fppaP00lF66Si9dJReOkovHaWXjtJLR+mlo/TSUXrpKL10lF46Si8dpZeO0lvpKP+la3n7WVFbvjgezfKOnuiX7gW/Q6/9YHX5x//yvZE7I8f/br3/GlbiBSrxApV4gUq8QCVeoBIvUIkXqMQLVOIFKvEClXiBSrxAJV6gEi9QiReoxAtU4gUq8QKVeIFKvEAlXqASL1CJF6jEC1TiBSrxApV4gUq8QH1doKIuUBkXqGkL1LQFatoCVWyBKrZAFVugii1QlRSoYgtUsQXq1gL1Z4Eas0CNWaDGLFArFqgVC1SABWq+AjVfgXqpQM1XoMorUOUVqOQKVHIFKrICs6UCs6UCs6UC86MCM6ICM6ICM6ICM6ICc6ACc6ACc6ACc6ACc6ACM5sCM5QCs5AC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DnVAnVApdAO6Cd2Cbku5E5lU7uKelYyRP4OGQk9Cw6By6CnoaagYGg6NgHRQBVQJjYQc0DPQs1AVNAoaDY2BxkJ50DhoPDQBeg5SoGqoBpoITYImQ89DU6CpUC00DeoNOaFBUB00HZoB1UMN0EzICDVCpZALmgXNhuZAc6F86AVoHvQiNB9aALmhhVATtAiyQYuhQsgD5UAl0EtQM/QypIeWQGWQGWqBlkLLoFegVmgwtBzqB70KeaEV0EpoFbQaWgNlQW3QWqgdWgd1QK9BBZAPel3K7RiGurUK90uqwv2SqnC3nyrcX6sK94qqwr2UqnAvpSrc76oK9/Oqwv2uqnCfpSrcA60Kdwyrwp2jqnD/sCrcZ6kK9/Oqwn2PqnDXpSrc3asK99eqwh2ZqnAHtircga0Kd7iqwr2pqnB3tpQ2QJug7ZAf2gNVQPugN6BR0H7oJnQQOgQdgU5A1dBp6AxUC52HLkCXoIHQbegKVA81QNeg69AtaD00G5oDbYQ2Q1ugrdA2aAG0A9oJ7YJ2Q3uhA9Bh6Ch0DDoOvQmdhE5Bb0FnoXNQKzQY8kIXoTboKtQOdUCd0A3oMuSD3pZyO55CGLWg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/beg/bek2v+nEQDvoI68gzryDurIO6gj76COvIM68g7qyDuoI++gjryDOvIO6sg7qCPvoI68gzryDurIO6gj76COvIM68g7qyDuoI++gjryDOvIO6sg7qCPvoI68gzryDurIO6l8NDx9Q+LZ2hgjS5twjNeJl2sNFmhq0NbWoK2twcJADZYCatBg1GBhoAYtbw0athq0vDVYEKpBM1eDJaAatMM1aPRq0NrVoLWrQWtXg4WkGjRz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'
|
|
4060
|
-
)
|
|
4061
|
-
DATA = pickle.loads(zlib.decompress(base64.b64decode(DATA)))
|
|
4062
|
-
MEMO = (
|
|
4063
|
-
b'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'
|
|
4064
|
-
)
|
|
4065
|
-
MEMO = pickle.loads(zlib.decompress(base64.b64decode(MEMO)))
|
|
4066
|
-
Shift = 0
|
|
4067
|
-
Reduce = 1
|
|
4068
|
-
def Lark_StandAlone(**kwargs):
|
|
4069
|
-
return Lark._load_from_dict(DATA, MEMO, **kwargs)
|