@@ -1,6 +1,6 @@ | |||
from warnings import warn | |||
from .utils import STRING_TYPE, logger, NO_VALUE | |||
from .utils import logger, NO_VALUE | |||
###{standalone | |||
@@ -90,7 +90,7 @@ class UnexpectedInput(LarkError): | |||
candidate = (None, False) | |||
for i, (label, example) in enumerate(examples): | |||
assert not isinstance(example, STRING_TYPE) | |||
assert not isinstance(example, str), "Expecting a list" | |||
for j, malformed in enumerate(example): | |||
try: | |||
@@ -1,14 +1,13 @@ | |||
from __future__ import absolute_import | |||
from lark.exceptions import ConfigurationError, assert_config | |||
from abc import ABC, abstractmethod | |||
import sys, os, pickle, hashlib | |||
from io import open | |||
import tempfile | |||
from warnings import warn | |||
from .utils import STRING_TYPE, Serialize, SerializeMemoizer, FS, isascii, logger, ABC, abstractmethod | |||
from .exceptions import ConfigurationError, assert_config | |||
from .utils import Serialize, SerializeMemoizer, FS, isascii, logger | |||
from .load_grammar import load_grammar, FromPackageLoader, Grammar, verify_used_files | |||
from .tree import Tree | |||
from .common import LexerConf, ParserConf | |||
@@ -153,7 +152,7 @@ class LarkOptions(Serialize): | |||
options[name] = value | |||
if isinstance(options['start'], STRING_TYPE): | |||
if isinstance(options['start'], str): | |||
options['start'] = [options['start']] | |||
self.__dict__['options'] = options | |||
@@ -247,14 +246,11 @@ class Lark(Serialize): | |||
cache_fn = None | |||
cache_md5 = None | |||
if isinstance(grammar, STRING_TYPE): | |||
if isinstance(grammar, str): | |||
self.source_grammar = grammar | |||
if self.options.use_bytes: | |||
if not isascii(grammar): | |||
raise ConfigurationError("Grammar must be ascii only, when use_bytes=True") | |||
if sys.version_info[0] == 2 and self.options.use_bytes != 'force': | |||
raise ConfigurationError("`use_bytes=True` may have issues on python2." | |||
"Use `use_bytes='force'` to use it at your own risk.") | |||
if self.options.cache: | |||
if self.options.parser != 'lalr': | |||
@@ -266,7 +262,7 @@ class Lark(Serialize): | |||
s = grammar + options_str + __version__ + str(sys.version_info[:2]) | |||
cache_md5 = hashlib.md5(s.encode('utf8')).hexdigest() | |||
if isinstance(self.options.cache, STRING_TYPE): | |||
if isinstance(self.options.cache, str): | |||
cache_fn = self.options.cache | |||
else: | |||
if self.options.cache is not True: | |||
@@ -1,8 +1,9 @@ | |||
# Lexer Implementation | |||
import re | |||
from contextlib import suppress | |||
from .utils import Str, classify, get_regexp_width, Py36, Serialize, suppress | |||
from .utils import classify, get_regexp_width, Py36, Serialize | |||
from .exceptions import UnexpectedCharacters, LexError, UnexpectedToken | |||
###{standalone | |||
@@ -110,7 +111,7 @@ class TerminalDef(Serialize): | |||
return self.name | |||
class Token(Str): | |||
class Token(str): | |||
"""A string with meta-information, that is produced by the lexer. | |||
When parsing text, the resulting chunks of the input that haven't been discarded, | |||
@@ -177,9 +178,9 @@ class Token(Str): | |||
if isinstance(other, Token) and self.type != other.type: | |||
return False | |||
return Str.__eq__(self, other) | |||
return str.__eq__(self, other) | |||
__hash__ = Str.__hash__ | |||
__hash__ = str.__hash__ | |||
class LineCounter: | |||
@@ -8,6 +8,7 @@ from io import open | |||
import pkgutil | |||
from ast import literal_eval | |||
from numbers import Integral | |||
from contextlib import suppress | |||
from .utils import bfs, Py36, logger, classify_bool, is_id_continue, is_id_start, bfs_all_unique | |||
from .lexer import Token, TerminalDef, PatternStr, PatternRE | |||
@@ -16,7 +17,7 @@ from .parse_tree_builder import ParseTreeBuilder | |||
from .parser_frontends import ParsingFrontend | |||
from .common import LexerConf, ParserConf | |||
from .grammar import RuleOptions, Rule, Terminal, NonTerminal, Symbol | |||
from .utils import classify, suppress, dedup_list, Str | |||
from .utils import classify, dedup_list | |||
from .exceptions import GrammarError, UnexpectedCharacters, UnexpectedToken, ParseError | |||
from .tree import Tree, SlottedTree as ST | |||
@@ -539,9 +540,9 @@ class PrepareSymbols(Transformer_InPlace): | |||
if isinstance(v, Tree): | |||
return v | |||
elif v.type == 'RULE': | |||
return NonTerminal(Str(v.value)) | |||
return NonTerminal(str(v.value)) | |||
elif v.type == 'TERMINAL': | |||
return Terminal(Str(v.value), filter_out=v.startswith('_')) | |||
return Terminal(str(v.value), filter_out=v.startswith('_')) | |||
assert False | |||
@@ -27,6 +27,7 @@ from __future__ import print_function | |||
# | |||
from io import open | |||
from abc import ABC, abstractmethod | |||
###} | |||
import sys | |||
@@ -1,4 +1,3 @@ | |||
import hashlib | |||
import unicodedata | |||
import os | |||
from functools import reduce | |||
@@ -14,14 +13,6 @@ logger.addHandler(logging.StreamHandler()) | |||
# By default, we should not output any log messages | |||
logger.setLevel(logging.CRITICAL) | |||
if sys.version_info[0]>2: | |||
from abc import ABC, abstractmethod | |||
else: | |||
from abc import ABCMeta, abstractmethod | |||
class ABC(object): # Provide Python27 compatibility | |||
__slots__ = () | |||
__metclass__ = ABCMeta | |||
Py36 = (sys.version_info[:2] >= (3, 6)) | |||
@@ -120,28 +111,16 @@ class SerializeMemoizer(Serialize): | |||
return _deserialize(data, namespace, memo) | |||
try: | |||
STRING_TYPE = basestring | |||
except NameError: # Python 3 | |||
STRING_TYPE = str | |||
import types | |||
from functools import wraps, partial | |||
from contextlib import contextmanager | |||
Str = type(u'') | |||
try: | |||
classtype = types.ClassType # Python2 | |||
except AttributeError: | |||
classtype = type # Python3 | |||
def smart_decorator(f, create_decorator): | |||
if isinstance(f, types.FunctionType): | |||
return wraps(f)(create_decorator(f, True)) | |||
elif isinstance(f, (classtype, type, types.BuiltinFunctionType)): | |||
elif isinstance(f, (type, types.BuiltinFunctionType)): | |||
return wraps(f)(create_decorator(f, False)) | |||
elif isinstance(f, types.MethodType): | |||
@@ -222,34 +201,12 @@ def dedup_list(l): | |||
return [x for x in l if not (x in dedup or dedup.add(x))] | |||
try: | |||
from contextlib import suppress # Python 3 | |||
except ImportError: | |||
@contextmanager | |||
def suppress(*excs): | |||
'''Catch and dismiss the provided exception | |||
>>> x = 'hello' | |||
>>> with suppress(IndexError): | |||
... x = x[10] | |||
>>> x | |||
'hello' | |||
''' | |||
try: | |||
yield | |||
except excs: | |||
pass | |||
try: | |||
compare = cmp | |||
except NameError: | |||
def compare(a, b): | |||
if a == b: | |||
return 0 | |||
elif a > b: | |||
return 1 | |||
return -1 | |||
def compare(a, b): | |||
if a == b: | |||
return 0 | |||
elif a > b: | |||
return 1 | |||
return -1 | |||
class Enumerator(Serialize): | |||