| @@ -37,4 +37,3 @@ class ParserConf: | |||
| self.rules = rules | |||
| self.callback = callback | |||
| self.start = start | |||
| @@ -1,10 +1,12 @@ | |||
| from __future__ import absolute_import | |||
| import os | |||
| import time | |||
| from collections import defaultdict | |||
| from .utils import STRING_TYPE, inline_args | |||
| from .utils import STRING_TYPE | |||
| from .load_grammar import load_grammar | |||
| from .tree import Tree, Transformer | |||
| from .tree import Tree | |||
| from .common import GrammarError, LexerConf, ParserConf | |||
| from .lexer import Lexer | |||
| @@ -44,7 +46,8 @@ class LarkOptions(object): | |||
| assert self.parser in ENGINE_DICT | |||
| if self.parser == 'earley' and self.transformer: | |||
| raise ValueError('Cannot specify an auto-transformer when using the Earley algorithm. Please use your transformer on the resulting parse tree, or use a different algorithm (i.e. lalr)') | |||
| raise ValueError('Cannot specify an auto-transformer when using the Earley algorithm.' | |||
| 'Please use your transformer on the resulting parse tree, or use a different algorithm (i.e. lalr)') | |||
| if self.keep_all_tokens: | |||
| raise NotImplementedError("Not implemented yet!") | |||
| @@ -52,8 +55,6 @@ class LarkOptions(object): | |||
| raise ValueError("Unknown options: %s" % o.keys()) | |||
| import time | |||
| from collections import defaultdict | |||
| class Profiler: | |||
| def __init__(self): | |||
| self.total_time = defaultdict(float) | |||
| @@ -67,7 +68,7 @@ class Profiler: | |||
| self.cur_section = name | |||
| def make_wrapper(self, name, f): | |||
| def _f(*args, **kwargs): | |||
| def wrapper(*args, **kwargs): | |||
| last_section = self.cur_section | |||
| self.enter_section(name) | |||
| try: | |||
| @@ -75,7 +76,7 @@ class Profiler: | |||
| finally: | |||
| self.enter_section(last_section) | |||
| return _f | |||
| return wrapper | |||
| class Lark: | |||
| @@ -13,7 +13,7 @@ class TokenDef(object): | |||
| self.value = value | |||
| def __repr__(self): | |||
| return ('%s(%r, %r)' % (type(self).__name__, self.name, self.value)) | |||
| return '%s(%r, %r)' % (type(self).__name__, self.name, self.value) | |||
| class TokenDef__Str(TokenDef): | |||
| def to_regexp(self): | |||
| @@ -40,16 +40,16 @@ class UnexpectedInput(LexError): | |||
| self.context = context | |||
| class Token(Str): | |||
| def __new__(cls, type, value, pos_in_stream=None): | |||
| def __new__(cls, type_, value, pos_in_stream=None): | |||
| inst = Str.__new__(cls, value) | |||
| inst.type = type | |||
| inst.type = type_ | |||
| inst.pos_in_stream = pos_in_stream | |||
| inst.value = value | |||
| return inst | |||
| @classmethod | |||
| def new_borrow_pos(cls, type, value, borrow_t): | |||
| inst = cls(type, value, borrow_t.pos_in_stream) | |||
| def new_borrow_pos(cls, type_, value, borrow_t): | |||
| inst = cls(type_, value, borrow_t.pos_in_stream) | |||
| inst.line = borrow_t.line | |||
| inst.column = borrow_t.column | |||
| return inst | |||
| @@ -66,11 +66,11 @@ def _regexp_has_newline(r): | |||
| return '\n' in r or '\\n' in r or ('(?s)' in r and '.' in r) | |||
| def _create_unless_callback(strs): | |||
| def f(t): | |||
| def unless_callback(t): | |||
| if t in strs: | |||
| t.type = strs[t] | |||
| return t | |||
| return f | |||
| return unless_callback | |||
| def _create_unless(tokens): | |||
| tokens_by_type = classify(tokens, type) | |||
| @@ -169,4 +169,3 @@ class Lexer(object): | |||
| if lex_pos < len(stream): | |||
| raise UnexpectedInput(stream, lex_pos, line, lex_pos - col_start_pos) | |||
| break | |||
| @@ -53,14 +53,14 @@ _TOKEN_NAMES = { | |||
| # Grammar Parser | |||
| TOKENS = { | |||
| '_LPAR': '\(', | |||
| '_RPAR': '\)', | |||
| '_LBRA': '\[', | |||
| '_RBRA': '\]', | |||
| '_LPAR': r'\(', | |||
| '_RPAR': r'\)', | |||
| '_LBRA': r'\[', | |||
| '_RBRA': r'\]', | |||
| 'OP': '[+*?](?![a-z])', | |||
| '_COLON': ':', | |||
| '_OR': '\|', | |||
| '_DOT': '\.', | |||
| '_OR': r'\|', | |||
| '_DOT': r'\.', | |||
| 'RULE': '[_?*]?[a-z][_a-z0-9]*', | |||
| 'TOKEN': '_?[A-Z][_A-Z0-9]*', | |||
| 'STRING': r'".*?[^\\]"', | |||
| @@ -99,7 +99,7 @@ RULES = { | |||
| 'maybe': ['_LBRA expansions _RBRA'], | |||
| 'token': ['TOKEN _COLON tokenvalue _NL', | |||
| 'token': ['TOKEN _COLON tokenvalue _NL', | |||
| 'TOKEN tokenmods _COLON tokenvalue _NL'], | |||
| '?tokenvalue': ['REGEXP', 'STRING'], | |||
| @@ -264,7 +264,7 @@ class ExtractAnonTokens(InlineTransformer): | |||
| value = token.value | |||
| self.i += 1 | |||
| else: | |||
| assert False, x | |||
| assert False, token | |||
| if token_name not in self.token_set: | |||
| self.token_set.add(token_name) | |||
| @@ -373,41 +373,3 @@ class GrammarLoader: | |||
| return tokendefs, rules | |||
| load_grammar = GrammarLoader().load_grammar | |||
| def test(): | |||
| g = """ | |||
| start: add | |||
| // Rules | |||
| add: mul | |||
| | add _add_sym mul | |||
| mul: [mul _add_mul] _atom | |||
| _atom: "-" _atom -> neg | |||
| | NUMBER | |||
| | "(" add ")" | |||
| // Tokens | |||
| NUMBER: /[\d.]+/ | |||
| _add_sym: "+" | "-" | |||
| _add_mul: "*" | "/" | |||
| WS.ignore.newline: /\s+/ | |||
| """ | |||
| g2 = """ | |||
| start: a | |||
| a: "a" (b*|(c d)+) "b"? | |||
| b: "b" | |||
| c: "c" | |||
| d: "+" | "-" | |||
| """ | |||
| # print load_grammar(g) | |||
| print(GrammarLoader().load_grammar2(g)) | |||
| if __name__ == '__main__': | |||
| test() | |||
| @@ -5,12 +5,12 @@ class Callback(object): | |||
| def create_expand1_tree_builder_function(tree_builder): | |||
| def f(children): | |||
| def expand1(children): | |||
| if len(children) == 1: | |||
| return children[0] | |||
| else: | |||
| return tree_builder(children) | |||
| return f | |||
| return expand1 | |||
| def create_rule_handler(expansion, usermethod): | |||
| to_include = [(i, sym.startswith('_')) for i, sym in enumerate(expansion) | |||
| @@ -38,9 +38,10 @@ class ParseTreeBuilder: | |||
| def _create_tree_builder_function(self, name): | |||
| tree_class = self.tree_class | |||
| def f(children): | |||
| def tree_builder_f(children): | |||
| return tree_class(name, children) | |||
| return f | |||
| return tree_builder_f | |||
| def create_tree_builder(self, rules, transformer): | |||
| @@ -77,5 +78,3 @@ class ParseTreeBuilder: | |||
| new_rules.append(( _origin, expansion, _alias )) | |||
| return new_rules, callback | |||
| @@ -52,4 +52,3 @@ class Earley(WithLexer): | |||
| ENGINE_DICT = { 'lalr': LALR, 'earley': Earley } | |||
| @@ -89,7 +89,6 @@ class State(object): | |||
| new_copy = self.consume_nonterminal(r.name) | |||
| if r.postprocess: | |||
| new_copy.data[-1] = r.postprocess([]) | |||
| # new_copy.data[-1] = r.postprocess([], self.reference) | |||
| else: | |||
| new_copy.data[-1] = [] | |||
| @@ -154,4 +153,3 @@ class Parser(object): | |||
| and t.reference == 0 | |||
| and t.data is not MatchFailed): | |||
| yield t.data | |||
| @@ -192,7 +192,8 @@ class GrammarAnalyzer(object): | |||
| self.states[state] = {k:v[0] for k, v in lookahead.items()} | |||
| x = list(bfs([self.init_state], step)) | |||
| for _ in bfs([self.init_state], step): | |||
| pass | |||
| # -- | |||
| self.enum = list(self.states) | |||
| @@ -207,4 +208,3 @@ class GrammarAnalyzer(object): | |||
| self.init_state_idx = self.enum_rev[self.init_state] | |||
| @@ -40,7 +40,7 @@ class Tree(object): | |||
| if pred(self): | |||
| yield self | |||
| else: | |||
| for i, c in enumerate(self.children): | |||
| for c in self.children: | |||
| if isinstance(c, Tree): | |||
| for t in c.find_pred(pred): | |||
| yield t | |||
| @@ -48,9 +48,6 @@ class Tree(object): | |||
| def find_data(self, data): | |||
| return self.find_pred(lambda t: t.data == data) | |||
| # def clone(self): | |||
| # return Tree(self.data, [c.clone() if isinstance(c, Tree) else c for c in self.children]) | |||
| def __deepcopy__(self, memo): | |||
| return type(self)(self.data, deepcopy(self.children, memo)) | |||
| @@ -69,7 +66,6 @@ class Transformer(object): | |||
| else: | |||
| return f(items) | |||
| def __default__(self, data, children): | |||
| return Tree(data, children) | |||
| @@ -79,7 +75,6 @@ class InlineTransformer(Transformer): | |||
| return inline_args(getattr(self, name)).__get__(self) | |||
| class Visitor(object): | |||
| def visit(self, tree): | |||
| for child in tree.children: | |||
| @@ -92,5 +87,3 @@ class Visitor(object): | |||
| def __default__(self, tree): | |||
| pass | |||
| @@ -1,3 +1,5 @@ | |||
| import functools | |||
| import types | |||
| from collections import deque | |||
| class fzset(frozenset): | |||
| @@ -49,8 +51,6 @@ except NameError: # Python 3 | |||
| Str = type(u'') | |||
| import functools | |||
| import types | |||
| def inline_args(f): | |||
| # print '@@', f.__name__, type(f), isinstance(f, types.FunctionType), isinstance(f, types.TypeType), isinstance(f, types.BuiltinFunctionType) | |||
| if isinstance(f, types.FunctionType): | |||