change parsed tokens directly into tuples removing need for a token stack
diff --git a/reclass/utils/refvalue.py b/reclass/utils/refvalue.py
index 1582d96..a6ae7ec 100644
--- a/reclass/utils/refvalue.py
+++ b/reclass/utils/refvalue.py
@@ -19,7 +19,6 @@
UndefinedVariableError
_SENTINELS = [re.escape(s) for s in PARAMETER_INTERPOLATION_SENTINELS]
-_RE = '(.+?)(?={0}|$)'.format(_SENTINELS[0])
_STR = 'STR'
_REF = 'REF'
@@ -69,14 +68,13 @@
def _getParser():
- def _push(description, string, location, tokens):
- RefValue._stack.append((description, tokens))
-
def _string(string, location, tokens):
- _push(_STR, string, location, tokens)
+ token = tokens[0]
+ tokens[0] = (_STR, token)
def _reference(string, location, tokens):
- _push(_REF, string, location, tokens)
+ token = list(tokens[0])
+ tokens[0] = (_REF, token)
string = (pp.Literal('\\\\').setParseAction(pp.replaceWith('\\')) |
pp.Literal('\\$').setParseAction(pp.replaceWith('$')) |
@@ -92,30 +90,20 @@
refItem = pp.Forward()
refItems = pp.OneOrMore(refItem)
- reference = (pp.Literal('${').suppress() + pp.Group(refItems) + pp.Literal('}').suppress()).setParseAction(_reference)
+ reference = (pp.Literal(PARAMETER_INTERPOLATION_SENTINELS[0]).suppress() +
+ pp.Group(refItems) +
+ pp.Literal(PARAMETER_INTERPOLATION_SENTINELS[1]).suppress()).setParseAction(_reference)
refItem << (reference | refString)
item = reference | string
line = pp.OneOrMore(item) + pp.StringEnd()
return line
- _stack = []
_parser = _getParser()
- def _tokenise(self, items, stack):
- result = []
- for n, i in reversed(list(enumerate(items))):
- t = stack.pop()[0]
- if (t == _REF):
- result.insert(0, (_REF, self._tokenise(i, stack) ))
- else:
- result.insert(0, (_STR, i))
- return result
-
def _parse(self, string):
- del RefValue._stack[:]
result = RefValue._parser.leaveWhitespace().parseString(string)
- self._tokens = self._tokenise(result, RefValue._stack)
+ self._tokens = result.asList()
self.assembleRefs()
def _assembleRefs(self, tokens, resolver, first=True):