The S-expression parser below works, but I wonder if it can be simplified; it's not as short and straightforward as I would expect given the simplicity of S-expressions. Can you see a simpler non-recursive solution ?
George # usage >>> parseSexpression("(a (b c) (d))") ['a', ['b', 'c'], ['d']] >>> parseSexpression("(a (b c)) (d))") ValueError: Unbalanced right parenthesis: (a (b c)) (d)) >>> parseSexpression("(a ((b c) (d))") ValueError: Unbalanced left parenthesis: (a ((b c) (d)) >>> parseSexpression("(a (b c)) (d)") ValueError: Single s-expression expected (2 given) >>> parseSexpression("(a (b c)) e") ValueError: Unenclosed subexpression (near e) def parseSexpression(expression): subexpressions,stack = [],[] for token in re.split(r'([()])|\s+', expression): if token == '(': new = [] if stack: stack[-1].append(new) else: subexpressions.append(new) stack.append(new) elif token == ')': try: stack.pop() except IndexError: raise ValueError("Unbalanced right parenthesis: %s" % expression) elif token: try: stack[-1].append(token) except IndexError: raise ValueError("Unenclosed subexpression (near %s)" % token) if stack: raise ValueError("Unbalanced left parenthesis: %s" % expression) if len(subexpressions) > 1: raise ValueError("Single s-expression expected (%d given)" % len(subexpressions)) return subexpressions[0] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Haiku of the day: "The Web site you seek / Can not be located but / Countless more exist. " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- http://mail.python.org/mailman/listinfo/python-list