소스 검색

Allows the standalone parser to take more options.

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.11.0
MegaIng1 4 년 전
부모
커밋
e1b572c3a9
3개의 변경된 파일22개의 추가작업 그리고 17개의 파일을 삭제
  1. +13
    -10
      lark/lark.py
  2. +7
    -5
      lark/parser_frontends.py
  3. +2
    -2
      lark/tools/standalone.py

+ 13
- 10
lark/lark.py 파일 보기

@@ -163,6 +163,11 @@ class LarkOptions(Serialize):
return cls(data)


_LOAD_ALLOWED_OPTIONS = {'postlex', 'transformer', 'use_bytes', 'debug', 'g_regex_flags', 'regex', 'propagate_positions', 'keep_all_tokens',
'tree_class'}
_LOAD_BLOCKED_OPTIONS = set(LarkOptions._defaults.keys()) - _LOAD_ALLOWED_OPTIONS


class Lark(Serialize):
"""Main interface for the library.

@@ -347,7 +352,7 @@ class Lark(Serialize):
inst = cls.__new__(cls)
return inst._load(f)

def _load(self, f, transformer=None, postlex=None):
def _load(self, f, **kwargs):
if isinstance(f, dict):
d = f
else:
@@ -358,10 +363,10 @@ class Lark(Serialize):
assert memo
memo = SerializeMemoizer.deserialize(memo, {'Rule': Rule, 'TerminalDef': TerminalDef}, {})
options = dict(data['options'])
if transformer is not None:
options['transformer'] = transformer
if postlex is not None:
options['postlex'] = postlex
if _LOAD_BLOCKED_OPTIONS.intersection(kwargs.keys()):
raise ValueError("Some options are not allowed when loading a Parser: {}"
.format(_LOAD_BLOCKED_OPTIONS.intersection(kwargs.keys())))
options.update(kwargs)
self.options = LarkOptions.deserialize(options, memo)
re_module = regex if self.options.regex else re
self.rules = [Rule.deserialize(r, memo) for r in data['rules']]
@@ -371,19 +376,17 @@ class Lark(Serialize):
data['parser'],
memo,
self._callbacks,
self.options.postlex,
self.options.transformer,
re_module,
self.options.debug
self.options, # Not all, but multiple attributes are used
)
self.terminals = self.parser.lexer_conf.tokens
self._terminals_dict = {t.name: t for t in self.terminals}
return self

@classmethod
def _load_from_dict(cls, data, memo, transformer=None, postlex=None):
def _load_from_dict(cls, data, memo, **kwargs):
inst = cls.__new__(cls)
return inst._load({'data': data, 'memo': memo}, transformer, postlex)
return inst._load({'data': data, 'memo': memo}, **kwargs)

@classmethod
def open(cls, grammar_filename, rel_to=None, **options):


+ 7
- 5
lark/parser_frontends.py 파일 보기

@@ -82,16 +82,18 @@ class WithLexer(_ParserFrontend):
self.postlex = lexer_conf.postlex

@classmethod
def deserialize(cls, data, memo, callbacks, postlex, transformer, re_module, debug):
def deserialize(cls, data, memo, callbacks, re_module, options):
inst = super(WithLexer, cls).deserialize(data, memo)

inst.postlex = postlex
inst.parser = LALR_Parser.deserialize(inst.parser, memo, callbacks, debug)
inst.postlex = options.postlex
inst.parser = LALR_Parser.deserialize(inst.parser, memo, callbacks, options.debug)

terminals = [item for item in memo.values() if isinstance(item, TerminalDef)]
inst.lexer_conf.callbacks = _get_lexer_callbacks(transformer, terminals)
inst.lexer_conf.callbacks = _get_lexer_callbacks(options.transformer, terminals)
inst.lexer_conf.re_module = re_module
inst.lexer_conf.skip_validation=True
inst.lexer_conf.skip_validation = True
inst.lexer_conf.use_bytes = options.use_bytes
inst.lexer_conf.g_regex_flags = options.g_regex_flags
inst.init_lexer()

return inst


+ 2
- 2
lark/tools/standalone.py 파일 보기

@@ -145,8 +145,8 @@ def main(fobj, start, print=print):

print('Shift = 0')
print('Reduce = 1')
print("def Lark_StandAlone(transformer=None, postlex=None):")
print(" return Lark._load_from_dict(DATA, MEMO, transformer=transformer, postlex=postlex)")
print("def Lark_StandAlone(**kwargs):")
print(" return Lark._load_from_dict(DATA, MEMO, **kwargs)")





불러오는 중...
취소
저장