memoizatio on user defined parsers

This commit is contained in:
2017-02-27 18:10:13 +01:00
parent 980188d90c
commit cf198ad907

View File

@@ -5,7 +5,7 @@ from gll.result import Success, Failure
class Parser: class Parser:
def __init__(self, fun, tag=None): def __init__(self, fun, tag=None):
self.fun = fun self.fun = memoize(fun)
self.tag = tag self.tag = tag
def __call__(self, string): def __call__(self, string):
@@ -36,7 +36,6 @@ class Parser:
def string(match, tag="string"): def string(match, tag="string"):
@memoize
@rename("string_{}".format(match)) @rename("string_{}".format(match))
def internal(string): def internal(string):
ln = len(match) ln = len(match)
@@ -56,7 +55,6 @@ def regex(match, tag="regex", reopts=None):
reopts = [] reopts = []
rx = re.compile(match, *reopts) rx = re.compile(match, *reopts)
@memoize
@rename("regex_{}".format(match)) @rename("regex_{}".format(match))
def internal(string): def internal(string):
res = rx.match(string) res = rx.match(string)
@@ -68,7 +66,6 @@ def regex(match, tag="regex", reopts=None):
def digit(tag="digit"): def digit(tag="digit"):
@memoize
@rename("digit") @rename("digit")
def internal(string): def internal(string):
if not string: if not string:
@@ -82,7 +79,6 @@ def digit(tag="digit"):
def many(parser, tag="many"): def many(parser, tag="many"):
@memoize
@rename("many_{}".format(parser.name)) @rename("many_{}".format(parser.name))
def internal(string): def internal(string):
res = parser(string) res = parser(string)
@@ -100,7 +96,6 @@ def many(parser, tag="many"):
def many1(parser, tag="many1"): def many1(parser, tag="many1"):
@memoize
@rename("many1_{}".format(parser.name)) @rename("many1_{}".format(parser.name))
def internal(string): def internal(string):
res = parser(string) res = parser(string)
@@ -118,7 +113,6 @@ def many1(parser, tag="many1"):
def whitespace(tag="whitespace"): def whitespace(tag="whitespace"):
@memoize
@rename("whitespace") @rename("whitespace")
def internal(string): def internal(string):
if not string: if not string:
@@ -132,7 +126,6 @@ def whitespace(tag="whitespace"):
def skip(parser, tag="skip"): def skip(parser, tag="skip"):
@memoize
@rename("skip_{}".format(parser.name)) @rename("skip_{}".format(parser.name))
def internal(string): def internal(string):
res = parser(string) res = parser(string)
@@ -148,7 +141,6 @@ def skipmany(parser, tag="skipmany"):
def sep_by(separator, parser, tag="sep_by"): def sep_by(separator, parser, tag="sep_by"):
@memoize
@rename("{}_sep_by_{}".format(parser.name, separator.name)) @rename("{}_sep_by_{}".format(parser.name, separator.name))
def internal(string): def internal(string):
if not string: if not string:
@@ -172,7 +164,6 @@ def sep_by(separator, parser, tag="sep_by"):
def opt(parser, tag="opt"): def opt(parser, tag="opt"):
@memoize
@rename("opt_{}".format(parser.name)) @rename("opt_{}".format(parser.name))
def internal(string): def internal(string):
res = parser(string) res = parser(string)
@@ -183,7 +174,6 @@ def opt(parser, tag="opt"):
def seq(*parsers, tag="seq"): def seq(*parsers, tag="seq"):
@memoize
@rename("seq_{}".format("_".join(str(parser.name) for parser in parsers))) @rename("seq_{}".format("_".join(str(parser.name) for parser in parsers)))
def internal(string): def internal(string):
resl = [] resl = []
@@ -199,7 +189,6 @@ def seq(*parsers, tag="seq"):
def all(parser, tag="all"): def all(parser, tag="all"):
@memoize
@rename("all_{}".format(parser.name)) @rename("all_{}".format(parser.name))
def internal(string): def internal(string):
res = parser(string) res = parser(string)