@@ -6,7 +6,7 @@ jobs: | |||||
runs-on: ubuntu-latest | runs-on: ubuntu-latest | ||||
strategy: | strategy: | ||||
matrix: | matrix: | ||||
python-version: [3.5, 3.6, 3.7, 3.8, 3.9.0-rc - 3.9, pypy3] | |||||
python-version: [3.6, 3.7, 3.8, 3.9.0-rc - 3.9, pypy3] | |||||
steps: | steps: | ||||
- uses: actions/checkout@v2 | - uses: actions/checkout@v2 | ||||
@@ -3,7 +3,7 @@ | |||||
import re | import re | ||||
from contextlib import suppress | from contextlib import suppress | ||||
from .utils import classify, get_regexp_width, Py36, Serialize | |||||
from .utils import classify, get_regexp_width, Serialize | |||||
from .exceptions import UnexpectedCharacters, LexError, UnexpectedToken | from .exceptions import UnexpectedCharacters, LexError, UnexpectedToken | ||||
###{standalone | ###{standalone | ||||
@@ -38,19 +38,10 @@ class Pattern(Serialize): | |||||
def max_width(self): | def max_width(self): | ||||
raise NotImplementedError() | raise NotImplementedError() | ||||
if Py36: | |||||
# Python 3.6 changed syntax for flags in regular expression | |||||
def _get_flags(self, value): | |||||
for f in self.flags: | |||||
value = ('(?%s:%s)' % (f, value)) | |||||
return value | |||||
else: | |||||
def _get_flags(self, value): | |||||
for f in self.flags: | |||||
value = ('(?%s)' % f) + value | |||||
return value | |||||
def _get_flags(self, value): | |||||
for f in self.flags: | |||||
value = ('(?%s:%s)' % (f, value)) | |||||
return value | |||||
class PatternStr(Pattern): | class PatternStr(Pattern): | ||||
@@ -9,7 +9,7 @@ from ast import literal_eval | |||||
from numbers import Integral | from numbers import Integral | ||||
from contextlib import suppress | from contextlib import suppress | ||||
from .utils import bfs, Py36, logger, classify_bool, is_id_continue, is_id_start, bfs_all_unique | |||||
from .utils import bfs, logger, classify_bool, is_id_continue, is_id_start, bfs_all_unique | |||||
from .lexer import Token, TerminalDef, PatternStr, PatternRE | from .lexer import Token, TerminalDef, PatternStr, PatternRE | ||||
from .parse_tree_builder import ParseTreeBuilder | from .parse_tree_builder import ParseTreeBuilder | ||||
@@ -475,18 +475,7 @@ class PrepareLiterals(Transformer_InPlace): | |||||
def _make_joined_pattern(regexp, flags_set): | def _make_joined_pattern(regexp, flags_set): | ||||
# In Python 3.6, a new syntax for flags was introduced, that allows us to restrict the scope | |||||
# of flags to a specific regexp group. We are already using it in `lexer.Pattern._get_flags` | |||||
# However, for prior Python versions, we still need to use global flags, so we have to make sure | |||||
# that there are no flag collisions when we merge several terminals. | |||||
flags = () | |||||
if not Py36: | |||||
if len(flags_set) > 1: | |||||
raise GrammarError("Lark doesn't support joining terminals with conflicting flags in python <3.6!") | |||||
elif len(flags_set) == 1: | |||||
flags ,= flags_set | |||||
return PatternRE(regexp, flags) | |||||
return PatternRE(regexp, ()) | |||||
class TerminalTreeToPattern(Transformer): | class TerminalTreeToPattern(Transformer): | ||||
@@ -13,8 +13,6 @@ logger.addHandler(logging.StreamHandler()) | |||||
logger.setLevel(logging.CRITICAL) | logger.setLevel(logging.CRITICAL) | ||||
Py36 = (sys.version_info[:2] >= (3, 6)) | |||||
NO_VALUE = object() | NO_VALUE = object() | ||||
@@ -8,7 +8,7 @@ import os | |||||
import sys | import sys | ||||
from copy import copy, deepcopy | from copy import copy, deepcopy | ||||
from lark.utils import Py36, isascii | |||||
from lark.utils import isascii | |||||
from lark import Token, Transformer_NonRecursive, LexError | from lark import Token, Transformer_NonRecursive, LexError | ||||
@@ -1545,7 +1545,6 @@ def _make_parser_test(LEXER, PARSER): | |||||
self.assertEqual( g.parse('"hello"').children, ['"hello"']) | self.assertEqual( g.parse('"hello"').children, ['"hello"']) | ||||
self.assertEqual( g.parse("'hello'").children, ["'hello'"]) | self.assertEqual( g.parse("'hello'").children, ["'hello'"]) | ||||
@unittest.skipIf(not Py36, "Required re syntax only exists in python3.6+") | |||||
def test_join_regex_flags(self): | def test_join_regex_flags(self): | ||||
g = r""" | g = r""" | ||||
start: A | start: A | ||||
@@ -1,16 +1,12 @@ | |||||
[tox] | [tox] | ||||
envlist = py27, py34, py35, py36, py37, py38, py39, pypy, pypy3 | |||||
envlist = py36, py37, py38, py39, pypy, pypy3 | |||||
skip_missing_interpreters=true | skip_missing_interpreters=true | ||||
[travis] | [travis] | ||||
2.7 = py27 | |||||
3.4 = py34 | |||||
3.5 = py35 | |||||
3.6 = py36 | 3.6 = py36 | ||||
3.7 = py37 | 3.7 = py37 | ||||
3.8 = py38 | 3.8 = py38 | ||||
3.9 = py39 | 3.9 = py39 | ||||
pypy = pypy | |||||
pypy3 = pypy3 | pypy3 = pypy3 | ||||
[testenv] | [testenv] | ||||