From 115c4c6d21cdd2002a5e764137cc75e235d6ae3a Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Wed, 8 Feb 2017 00:53:22 +0200 Subject: [PATCH] A little order and refactoring --- lark/common.py | 4 ++++ lark/parse_tree_builder.py | 2 +- lark/parser_frontends.py | 6 ++--- lark/parsers/__init__.py | 0 lark/{ => parsers}/earley.py | 5 +++-- .../lalr_analysis.py} | 4 ++-- lark/{parser.py => parsers/lalr_parser.py} | 6 ++--- lark/tests/test_parser.py | 3 +-- lark/tree.py | 22 ++----------------- 9 files changed, 18 insertions(+), 34 deletions(-) create mode 100644 lark/parsers/__init__.py rename lark/{ => parsers}/earley.py (96%) rename lark/{grammar_analysis.py => parsers/lalr_analysis.py} (98%) rename lark/{parser.py => parsers/lalr_parser.py} (96%) diff --git a/lark/common.py b/lark/common.py index 2883a2a..c4fbf6c 100644 --- a/lark/common.py +++ b/lark/common.py @@ -2,6 +2,10 @@ class GrammarError(Exception): pass +class ParseError(Exception): + pass + + def is_terminal(sym): return sym.isupper() or sym[0] == '$' diff --git a/lark/parse_tree_builder.py b/lark/parse_tree_builder.py index 0d3de49..9a7c754 100644 --- a/lark/parse_tree_builder.py +++ b/lark/parse_tree_builder.py @@ -1,4 +1,4 @@ -from .grammar_analysis import is_terminal +from .common import is_terminal class Callback(object): pass diff --git a/lark/parser_frontends.py b/lark/parser_frontends.py index 749e782..9e33aaa 100644 --- a/lark/parser_frontends.py +++ b/lark/parser_frontends.py @@ -1,12 +1,12 @@ -from .grammar_analysis import GrammarAnalyzer +from .parsers.lalr_analysis import GrammarAnalyzer from .common import is_terminal -from . import parser, earley +from .parsers import lalr_parser, earley class LALR: def build_parser(self, rules, callback, start): ga = GrammarAnalyzer(rules, start) ga.analyze() - return parser.Parser(ga, callback) + return lalr_parser.Parser(ga, callback) class Earley: @staticmethod diff --git a/lark/parsers/__init__.py b/lark/parsers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lark/earley.py b/lark/parsers/earley.py similarity index 96% rename from lark/earley.py rename to lark/parsers/earley.py index 3129a22..81cc08e 100644 --- a/lark/earley.py +++ b/lark/parsers/earley.py @@ -1,6 +1,7 @@ "My name is Earley" -from .utils import classify, STRING_TYPE +from ..utils import classify, STRING_TYPE +from ..common import ParseError try: xrange @@ -135,7 +136,7 @@ class Parser(object): self.advance_to(table, pos + 1, set()) if not table[-1]: - raise Exception('Error at line {t.line}:{t.column}'.format(t=stream[pos])) + raise ParseError('Error at line {t.line}:{t.column}'.format(t=stream[pos])) return list(self.finish(table)) diff --git a/lark/grammar_analysis.py b/lark/parsers/lalr_analysis.py similarity index 98% rename from lark/grammar_analysis.py rename to lark/parsers/lalr_analysis.py index 22c60c0..c924937 100644 --- a/lark/grammar_analysis.py +++ b/lark/parsers/lalr_analysis.py @@ -1,7 +1,7 @@ from collections import defaultdict, deque -from .utils import classify, classify_bool, bfs, fzset -from .common import GrammarError, is_terminal +from ..utils import classify, classify_bool, bfs, fzset +from ..common import GrammarError, is_terminal ACTION_SHIFT = 0 diff --git a/lark/parser.py b/lark/parsers/lalr_parser.py similarity index 96% rename from lark/parser.py rename to lark/parsers/lalr_parser.py index 5d5b964..7c2dc7d 100644 --- a/lark/parser.py +++ b/lark/parsers/lalr_parser.py @@ -1,7 +1,5 @@ -from .grammar_analysis import ACTION_SHIFT - -class ParseError(Exception): - pass +from .lalr_analysis import ACTION_SHIFT +from ..common import ParseError class Parser(object): def __init__(self, ga, callback): diff --git a/lark/tests/test_parser.py b/lark/tests/test_parser.py index 1dc874a..30deb5a 100644 --- a/lark/tests/test_parser.py +++ b/lark/tests/test_parser.py @@ -17,8 +17,7 @@ from io import ( logging.basicConfig(level=logging.INFO) from lark.lark import Lark -from lark.grammar_analysis import GrammarError -from lark.parser import ParseError +from lark.common import GrammarError, ParseError __path__ = os.path.dirname(__file__) def _read(n, *args): diff --git a/lark/tree.py b/lark/tree.py index f5f00e5..34f3c76 100644 --- a/lark/tree.py +++ b/lark/tree.py @@ -33,6 +33,8 @@ class Tree(object): def __eq__(self, other): return self.data == other.data and self.children == other.children + def __hash__(self): + return hash((self.data, tuple(self.children))) def find_pred(self, pred): if pred(self): @@ -46,26 +48,6 @@ class Tree(object): def find_data(self, data): return self.find_pred(lambda t: t.data == data) - - # def find_path(self, pred): - # if pred(self): - # yield [] - # else: - # for i, c in enumerate(self.children): - # if isinstance(c, Tree): - # for path in c.find_path(pred): - # yield [i] + path - - # def follow_path(self, path): - # x = self - # for step in path: - # x = x.children[step] - # return x - - # def set_at_path(self, path, value): - # x = self.follow_path(path[:-1]) - # x.children[path[-1]] = value - # def clone(self): # return Tree(self.data, [c.clone() if isinstance(c, Tree) else c for c in self.children])