From e8810e3b80a28820c9bdee0f7167fd25415e6d1a Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Mon, 30 Oct 2017 11:14:42 +0200 Subject: [PATCH] Fixed some deprecation warnings due to changes in Py3.6 regexps --- lark/common.py | 28 ++++++++++++++++++++-------- tests/test_parser.py | 8 ++++---- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lark/common.py b/lark/common.py index 8335919..45aa0cd 100644 --- a/lark/common.py +++ b/lark/common.py @@ -1,5 +1,8 @@ import re import sre_parse +import sys + +Py36 = (sys.version_info[:2] >= (3, 6)) class GrammarError(Exception): pass @@ -54,7 +57,7 @@ class Pattern(object): self.flags = flags def __repr__(self): - return repr(self._get_flags() + self.value) + return repr(self.to_regexp()) # Pattern Hashing assumes all subclasses have a different priority! def __hash__(self): @@ -62,15 +65,24 @@ class Pattern(object): def __eq__(self, other): return type(self) == type(other) and self.value == other.value - def _get_flags(self): - if self.flags: - assert len(self.flags) == 1 - return '(?%s)' % self.flags - return '' + if Py36: + # Python 3.6 changed syntax for flags in regular expression + def _get_flags(self, value): + if self.flags: + assert len(self.flags) == 1 + return ('(?%s:%s)' % (self.flags[0], value)) + return value + + else: + def _get_flags(self, value): + if self.flags: + assert len(self.flags) == 1 + return ('(?%s)' % self.flags) + value + return value class PatternStr(Pattern): def to_regexp(self): - return self._get_flags() + re.escape(self.value) + return self._get_flags(re.escape(self.value)) @property def min_width(self): @@ -79,7 +91,7 @@ class PatternStr(Pattern): class PatternRE(Pattern): def to_regexp(self): - return self._get_flags() + self.value + return self._get_flags(self.value) @property def min_width(self): diff --git a/tests/test_parser.py b/tests/test_parser.py index 8a43a91..86fae56 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -30,12 +30,12 @@ def _read(n, *args): class TestParsers(unittest.TestCase): def test_same_ast(self): "Tests that Earley and LALR parsers produce equal trees" - g = Lark("""start: "(" name_list ("," "*" NAME)? ")" + g = Lark(r"""start: "(" name_list ("," "*" NAME)? ")" name_list: NAME | name_list "," NAME NAME: /\w+/ """, parser='lalr') l = g.parse('(a,b,c,*x)') - g = Lark("""start: "(" name_list ("," "*" NAME)? ")" + g = Lark(r"""start: "(" name_list ("," "*" NAME)? ")" name_list: NAME | name_list "," NAME NAME: /\w/+ """) l2 = g.parse('(a,b,c,*x)') @@ -507,7 +507,7 @@ def _make_parser_test(LEXER, PARSER): g.parse("a" * (sys.getrecursionlimit() // 4)) def test_token_collision(self): - g = _Lark("""start: "Hello" NAME + g = _Lark(r"""start: "Hello" NAME NAME: /\w/+ %ignore " " """) @@ -517,7 +517,7 @@ def _make_parser_test(LEXER, PARSER): self.assertSequenceEqual(x.children, ['HelloWorld']) def test_token_collision_WS(self): - g = _Lark("""start: "Hello" NAME + g = _Lark(r"""start: "Hello" NAME NAME: /\w/+ %import common.WS %ignore WS