From 47462026259fbc39bb9ff1797a0b850073add5c9 Mon Sep 17 00:00:00 2001 From: Yaniv Mordekhay Date: Wed, 7 Jun 2017 09:29:26 +0300 Subject: [PATCH] Performance improvements in mismatch handling --- src/ruler/base_rules.py | 8 +++++++- src/ruler/rules.py | 11 +++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/ruler/base_rules.py b/src/ruler/base_rules.py index 733dd19..53bf523 100644 --- a/src/ruler/base_rules.py +++ b/src/ruler/base_rules.py @@ -10,6 +10,7 @@ def __init__(self): self._name = '' self.matched = None self.error = None + self._mismatch = Mismatch() def match(self, text): raise NotImplementedError @@ -120,7 +121,12 @@ def __repr__(self): class Mismatch(object): - def __init__(self, text, position, description): + def __init__(self): + self.text = '' + self.position = -1 + self.description = '' + + def set(self, text, position, description): self.text = text self.position = position self.description = description diff --git a/src/ruler/rules.py b/src/ruler/rules.py index ba8c561..14bceaf 100644 --- a/src/ruler/rules.py +++ b/src/ruler/rules.py @@ -8,7 +8,7 @@ import re -from .base_rules import BaseRule, BaseCompoundRule, Mismatch +from .base_rules import BaseRule, BaseCompoundRule class Grammar(object): @@ -57,7 +57,8 @@ def match(self, text): text_to_match = text_to_match[len(sub_rule.matched):] else: mismatch_position = len(text) - len(text_to_match) + sub_rule.error.position - self.error = Mismatch(text, mismatch_position, sub_rule.error.description) + self._mismatch.set(text, mismatch_position, sub_rule.error.description) + self.error = self._mismatch self.matched = None return False @@ -87,7 +88,8 @@ def match(self, text): error_text = '"{}" does not match "{}"'.format(text, self._regex.pattern) else: error_text = 'reached end of line but expected "{}"'.format(self._regex.pattern) - self.error = Mismatch(text, 0, error_text) + self._mismatch.set(text, 0, error_text) + self.error = self._mismatch self.matched = None return False @@ -135,7 +137,8 @@ def match(self, text): if r.error.position == furthest_mismatch_position )) ) - self.error = Mismatch(text, furthest_mismatch_position, description) + self._mismatch.set(text, furthest_mismatch_position, description) + self.error = self._mismatch return False