From 5e546f38a954a1b8032d7d28ea403e50504e6e05 Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Sun, 13 May 2018 00:54:06 +0300 Subject: [PATCH] args decorators actually work now --- lark/__init__.py | 2 +- lark/load_grammar.py | 6 +++--- lark/parsers/earley.py | 2 +- lark/utils.py | 6 +++--- lark/{transformers.py => visitors.py} | 8 +++++--- tests/test_parser.py | 2 +- tests/test_trees.py | 2 +- 7 files changed, 15 insertions(+), 13 deletions(-) rename lark/{transformers.py => visitors.py} (93%) diff --git a/lark/__init__.py b/lark/__init__.py index 5613855..b36b3fc 100644 --- a/lark/__init__.py +++ b/lark/__init__.py @@ -1,5 +1,5 @@ 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 .lexer import UnexpectedInput, LexError from .lark import Lark diff --git a/lark/load_grammar.py b/lark/load_grammar.py index 49b4b8f..6262f62 100644 --- a/lark/load_grammar.py +++ b/lark/load_grammar.py @@ -16,7 +16,7 @@ from .grammar import RuleOptions, Rule, Terminal, NonTerminal, Symbol from .utils import classify, suppress 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__) IMPORT_PATHS = [os.path.join(__path__, 'grammars')] @@ -255,7 +255,6 @@ class CanonizeTree(Transformer): tokenmods, value = args return tokenmods + [value] -@children_args_inline class PrepareAnonTerminals(Transformer): "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 + @children_args_inline def pattern(self, p): value = p.value 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): return v[0] -@children_args class PrepareSymbols(Transformer): + @children_args def value(self, v): v ,= v if isinstance(v, Tree): diff --git a/lark/parsers/earley.py b/lark/parsers/earley.py index 5f92fbb..d58b57c 100644 --- a/lark/parsers/earley.py +++ b/lark/parsers/earley.py @@ -14,7 +14,7 @@ # Email : erezshin@gmail.com from ..tree import Tree -from ..transformers import Transformer_InPlace +from ..visitors import Transformer_InPlace from ..common import ParseError, UnexpectedToken from .grammar_analysis import GrammarAnalyzer from ..grammar import NonTerminal diff --git a/lark/utils.py b/lark/utils.py index a4a63dd..6f603bb 100644 --- a/lark/utils.py +++ b/lark/utils.py @@ -57,13 +57,13 @@ Str = type(u'') def smart_decorator(f, create_decorator): if isinstance(f, types.FunctionType): - return wraps(create_decorator(f, True)) + return wraps(f)(create_decorator(f, True)) elif isinstance(f, (type, types.BuiltinFunctionType)): - return wraps(create_decorator(f, False)) + return wraps(f)(create_decorator(f, False)) elif isinstance(f, types.MethodType): - return wraps(create_decorator(f.__func__, True)) + return wraps(f)(create_decorator(f.__func__, True)) elif isinstance(f, partial): # wraps does not work for partials in 2.7: https://bugs.python.org/issue3445 diff --git a/lark/transformers.py b/lark/visitors.py similarity index 93% rename from lark/transformers.py rename to lark/visitors.py index 41a3980..a1167fa 100644 --- a/lark/transformers.py +++ b/lark/visitors.py @@ -1,4 +1,4 @@ -import inspect +from inspect import isclass from functools import wraps from .utils import smart_decorator @@ -119,6 +119,7 @@ def _children_args__func(f): else: def f(args): return _f(tree.children) + return f return smart_decorator(f, create_decorator) @@ -136,7 +137,7 @@ def _children_args__class(cls): 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) @@ -150,6 +151,7 @@ def _children_args_inline__func(f): else: def f(args): return _f(*tree.children) + return f return smart_decorator(f, create_decorator) @@ -167,5 +169,5 @@ def _children_args_inline__class(cls): return cls 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) diff --git a/tests/test_parser.py b/tests/test_parser.py index 6531cb6..25ce619 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -21,7 +21,7 @@ from lark.lark import Lark from lark.common import GrammarError, ParseError, UnexpectedToken from lark.lexer import LexError, UnexpectedInput from lark.tree import Tree -from lark.transformers import Transformer, children_args +from lark.visitors import Transformer, children_args __path__ = os.path.dirname(__file__) def _read(n, *args): diff --git a/tests/test_trees.py b/tests/test_trees.py index a41d3de..df3b9b6 100644 --- a/tests/test_trees.py +++ b/tests/test_trees.py @@ -6,7 +6,7 @@ import copy import pickle from lark.tree import Tree -from lark.transformers import Interpreter, visit_children_decor +from lark.visitors import Interpreter, visit_children_decor class TestTrees(TestCase):