code: def Reduce(self):
      
      # Check for sanity
      if self.state != 'INITIAL' and self.state != 'BINARY':
        self.Error('Premature end of expression')
  
      length = len(self.stack)
      while length > 1:
        # Precedence order
        self._CombineParenthesis()
        self._CombineBinaryExpressions('and')
        self._CombineBinaryExpressions('or')
        self._CombineContext()
  
        # No change
        if len(self.stack) == length:
          break
        length = len(self.stack)
  
      if length != 1:
        self.Error('Illegal query expression')
  
      return self.stack[0]
docs: Reduce the token stack into an AST.