def parse_token_list_rec(self): """ Parses a tokenized arithmetic expression into a parse tree. It calls itself recursively to handle bracketed subexpressions. @return: Returns a token string. @rtype: lems.parser.expr.ExprNode @attention: Does not handle unary minuses at the moment. Needs to be fixed. """ op_stack = Stack() val_stack = Stack() node_stack = Stack() op_stack.push('$') val_stack.push('$') exit_loop = False while self.token_list and not exit_loop: token = self.token_list[0] self.token_list = self.token_list[1:] #print '###> ', token,op_stack,node_stack,val_stack if token == '(': node_stack.push(self.parse_token_list_rec()) val_stack.push('$') elif self.is_func(token): op_stack.push(token) elif self.is_op(token): if self.op_priority[op_stack.top()] >= \ self.op_priority[token]: op = op_stack.pop() if self.is_func(op): rval = val_stack.pop() if rval == '$': right = node_stack.pop() else: right = ValueNode(rval) node_stack.push(Func1Node(op, right)) val_stack.push('$') elif op == '~': rval = val_stack.pop() if rval == '$': right = node_stack.pop() else: right = ValueNode(rval) node_stack.push(OpNode('-', ValueNode('0'), right)) val_stack.push('$') else: rval = val_stack.pop() lval = val_stack.pop() if lval == '$': left = node_stack.pop() else: left = ValueNode(lval) if rval == '$': right = node_stack.pop() else: right = ValueNode(rval) node_stack.push(OpNode(op, left, right)) val_stack.push('$') op_stack.push(token) elif token == ')': exit_loop = True else: val_stack.push(token) rval = val_stack.pop() if rval == '$': right = node_stack.pop() else: right = ValueNode(rval) while op_stack.top() != '$': op = op_stack.pop() if self.is_func(op): right = Func1Node(op, right) elif op == '~': lval = val_stack.pop() right = OpNode('-', ValueNode('0'), right) else: lval = val_stack.pop() if lval == '$': if node_stack.is_empty(): left = ValueNode('0') else: left = node_stack.pop() else: left = ValueNode(lval) right = OpNode(op, left, right) return right