TODO: change to OPERATION only
NOTE: Formula may contain additional/extra parentheses
-EXPRESSION = '"' ( ECHAR | '{' VARNAME '}' )* '"' | re"'[^'\\n]*'"
+EXPRESSION = '"' ( ECHAR | '{' VARNAME '}' )* '"' | re"'[^'\\n]*'" | VARNAME
ECHAR = re('([^\\{}]|\\\\|\\{|\\}|\\n)*')
VARNAME = re('[a-zA-Z0-9-_]+(\.[a-zA-Z0-9-_]+)*')
"""
`fname` is an optional name of the file, for debugging and syntax errors.
`level` indicates the precedence the operations should have in the ConfigTree
"""
- self.s = s # Unicode, string or an open file
+ self.s = s # Unicode, ascii string or an open file
self.buf = u"" # Read-buffer for s file, whole unicode string for s string/unicode
if isinstance(self.s, types.StringTypes):
self.buf = unicode(self.s)
def p_VARNAME(self):
self.dbg() # Debug
vnl = []
- while self.peek().isalnum() or self.peek() in u'-_.':
+ while self.preread(1) and (self.peek().isalnum() or self.peek() in u'-_.'):
vnl.append(self.next())
vn = u''.join(vnl)
if not conf.re_VARNAME.match(vn):
def p_EXPRESSION(self):
self.dbg() # Debug
+ if self.peek() not in '\'"':
+ # Expect a variable name
+ varname = self.p_VARNAME()
+ return conf.ConfigExpression((self.tree.lookup(varname),), varname)
op = self.next()
- if op not in '\'"':
- self.syntax_error('Invalid start of expression')
# Parse literal expression
if op == u'\'':
exl = []
expr2[-1] = expr2[-1] + i
else:
expr2.append(i)
- return conf.ConfigExpression(tuple(expr2), exs)
+ return conf.ConfigExpression(expr2, exs)
def p_FORMULA(self):
self.dbg() # Debug