Пример #1
0
    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
Пример #2
0
    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