Browse Source

args decorators actually work now

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.0
Erez Shinan 7 years ago
parent
commit
5e546f38a9
7 changed files with 15 additions and 13 deletions
  1. +1
    -1
      lark/__init__.py
  2. +3
    -3
      lark/load_grammar.py
  3. +1
    -1
      lark/parsers/earley.py
  4. +3
    -3
      lark/utils.py
  5. +5
    -3
      lark/visitors.py
  6. +1
    -1
      tests/test_parser.py
  7. +1
    -1
      tests/test_trees.py

+ 1
- 1
lark/__init__.py View File

@@ -1,5 +1,5 @@
from .tree import Tree from .tree import Tree
from .transformers import Transformer
from .visitors import Transformer, Visitor, children_args, children_args_inline
from .common import ParseError, GrammarError, UnexpectedToken from .common import ParseError, GrammarError, UnexpectedToken
from .lexer import UnexpectedInput, LexError from .lexer import UnexpectedInput, LexError
from .lark import Lark from .lark import Lark


+ 3
- 3
lark/load_grammar.py View File

@@ -16,7 +16,7 @@ from .grammar import RuleOptions, Rule, Terminal, NonTerminal, Symbol
from .utils import classify, suppress from .utils import classify, suppress


from .tree import Tree, SlottedTree as ST from .tree import Tree, SlottedTree as ST
from .transformers import Transformer, Visitor, children_args, children_args_inline
from .visitors import Transformer, Visitor, children_args, children_args_inline


__path__ = os.path.dirname(__file__) __path__ = os.path.dirname(__file__)
IMPORT_PATHS = [os.path.join(__path__, 'grammars')] IMPORT_PATHS = [os.path.join(__path__, 'grammars')]
@@ -255,7 +255,6 @@ class CanonizeTree(Transformer):
tokenmods, value = args tokenmods, value = args
return tokenmods + [value] return tokenmods + [value]


@children_args_inline
class PrepareAnonTerminals(Transformer): class PrepareAnonTerminals(Transformer):
"Create a unique list of anonymous tokens. Attempt to give meaningful names to them when we add them" "Create a unique list of anonymous tokens. Attempt to give meaningful names to them when we add them"


@@ -266,6 +265,7 @@ class PrepareAnonTerminals(Transformer):
self.i = 0 self.i = 0




@children_args_inline
def pattern(self, p): def pattern(self, p):
value = p.value value = p.value
if p in self.token_reverse and p.flags != self.token_reverse[p].pattern.flags: if p in self.token_reverse and p.flags != self.token_reverse[p].pattern.flags:
@@ -409,8 +409,8 @@ class TokenTreeToPattern(Transformer):
def value(self, v): def value(self, v):
return v[0] return v[0]


@children_args
class PrepareSymbols(Transformer): class PrepareSymbols(Transformer):
@children_args
def value(self, v): def value(self, v):
v ,= v v ,= v
if isinstance(v, Tree): if isinstance(v, Tree):


+ 1
- 1
lark/parsers/earley.py View File

@@ -14,7 +14,7 @@
# Email : erezshin@gmail.com # Email : erezshin@gmail.com


from ..tree import Tree from ..tree import Tree
from ..transformers import Transformer_InPlace
from ..visitors import Transformer_InPlace
from ..common import ParseError, UnexpectedToken from ..common import ParseError, UnexpectedToken
from .grammar_analysis import GrammarAnalyzer from .grammar_analysis import GrammarAnalyzer
from ..grammar import NonTerminal from ..grammar import NonTerminal


+ 3
- 3
lark/utils.py View File

@@ -57,13 +57,13 @@ Str = type(u'')


def smart_decorator(f, create_decorator): def smart_decorator(f, create_decorator):
if isinstance(f, types.FunctionType): if isinstance(f, types.FunctionType):
return wraps(create_decorator(f, True))
return wraps(f)(create_decorator(f, True))


elif isinstance(f, (type, types.BuiltinFunctionType)): elif isinstance(f, (type, types.BuiltinFunctionType)):
return wraps(create_decorator(f, False))
return wraps(f)(create_decorator(f, False))


elif isinstance(f, types.MethodType): elif isinstance(f, types.MethodType):
return wraps(create_decorator(f.__func__, True))
return wraps(f)(create_decorator(f.__func__, True))


elif isinstance(f, partial): elif isinstance(f, partial):
# wraps does not work for partials in 2.7: https://bugs.python.org/issue3445 # wraps does not work for partials in 2.7: https://bugs.python.org/issue3445


lark/transformers.py → lark/visitors.py View File

@@ -1,4 +1,4 @@
import inspect
from inspect import isclass
from functools import wraps from functools import wraps


from .utils import smart_decorator from .utils import smart_decorator
@@ -119,6 +119,7 @@ def _children_args__func(f):
else: else:
def f(args): def f(args):
return _f(tree.children) return _f(tree.children)
return f


return smart_decorator(f, create_decorator) return smart_decorator(f, create_decorator)


@@ -136,7 +137,7 @@ def _children_args__class(cls):




def children_args(obj): def children_args(obj):
decorator = _children_args__class if issubclass(obj, Base) else _children_args__func
decorator = _children_args__class if isclass(obj) and issubclass(obj, Base) else _children_args__func
return decorator(obj) return decorator(obj)




@@ -150,6 +151,7 @@ def _children_args_inline__func(f):
else: else:
def f(args): def f(args):
return _f(*tree.children) return _f(*tree.children)
return f


return smart_decorator(f, create_decorator) return smart_decorator(f, create_decorator)


@@ -167,5 +169,5 @@ def _children_args_inline__class(cls):
return cls return cls


def children_args_inline(obj): def children_args_inline(obj):
decorator = _children_args_inline__class if issubclass(obj, Base) else _children_args_inline__func
decorator = _children_args_inline__class if isclass(obj) and issubclass(obj, Base) else _children_args_inline__func
return decorator(obj) return decorator(obj)

+ 1
- 1
tests/test_parser.py View File

@@ -21,7 +21,7 @@ from lark.lark import Lark
from lark.common import GrammarError, ParseError, UnexpectedToken from lark.common import GrammarError, ParseError, UnexpectedToken
from lark.lexer import LexError, UnexpectedInput from lark.lexer import LexError, UnexpectedInput
from lark.tree import Tree from lark.tree import Tree
from lark.transformers import Transformer, children_args
from lark.visitors import Transformer, children_args


__path__ = os.path.dirname(__file__) __path__ = os.path.dirname(__file__)
def _read(n, *args): def _read(n, *args):


+ 1
- 1
tests/test_trees.py View File

@@ -6,7 +6,7 @@ import copy
import pickle import pickle


from lark.tree import Tree from lark.tree import Tree
from lark.transformers import Interpreter, visit_children_decor
from lark.visitors import Interpreter, visit_children_decor




class TestTrees(TestCase): class TestTrees(TestCase):


Loading…
Cancel
Save