Fix for parser reinstantiation bug

In the course of refactoring a bug was introduced
which manifested itself in excessive constructions
of parsers and considerable slowdown of reclass.
This patch limits the number of parsers constructed.
diff --git a/reclass/values/parser.py b/reclass/values/parser.py
index 255e477..27e6d2d 100644
--- a/reclass/values/parser.py
+++ b/reclass/values/parser.py
@@ -21,26 +21,41 @@
 
 class Parser(object):
 
+    def __init__(self):
+        self._ref_parser = None
+        self._simple_parser = None
+        self._old_settings = None
+
+    @property
+    def ref_parser(self):
+        if self._ref_parser is None or self._settings != self._old_settings:
+            self._ref_parser = parsers.get_ref_parser(self._settings)
+            self._old_settings = self._settings
+        return self._ref_parser
+
+    @property
+    def simple_ref_parser(self):
+        if self._simple_parser is None or self._settings != self._old_settings:
+            self._simple_parser = parsers.get_simple_ref_parser(self._settings)
+            self._old_settings = self._settings
+        return self._simple_parser
+
     def parse(self, value, settings):
         def full_parse():
             try:
-                return ref_parser.parseString(value).asList()
+                return self.ref_parser.parseString(value).asList()
             except pp.ParseException as e:
                 raise ParseError(e.msg, e.line, e.col, e.lineno)
 
         self._settings = settings
-        ref_parser = parsers.get_ref_parser(settings)
-        simple_ref_parser = parsers.get_simple_ref_parser(settings)
-
         sentinel_count = (value.count(settings.reference_sentinels[0]) +
                           value.count(settings.export_sentinels[0]))
-
         if sentinel_count == 0:
             # speed up: only use pyparsing if there are sentinels in the value
             return ScaItem(value, self._settings)
         elif sentinel_count == 1:  # speed up: try a simple reference
             try:
-                tokens = simple_ref_parser.parseString(value).asList()
+                tokens = self.simple_ref_parser.parseString(value).asList()
             except pp.ParseException:
                 tokens = full_parse()  # fall back on the full parser
         else: