private void output(ExpressionToken tok) 
    {
        if ( tok.isParensOpen() ) {
            throw new ParseException("No matching closing parens",tok.getTextRegion());
            //                return;
        }

        if ( tok.isValue() ) 
        {
            valueQueue.add( tok );
            return;
        }

        if ( tok.isFunction() ) 
        {
            /* Pop stack into f
             * Pop arg count into a
             * Pop were values into w
             * If w is true, increment a
             * Set the argument count of f to a
             * Push f onto output queue
             */                
            int argCount = argsCountStack.pop();
            if ( argsMarkerStack.pop() ) {
                argCount+=1;
            }

            while ( argCount > 0 ) {
                tok.getToken().insertChild( 0 , valueQueue.pop().getToken() );
                argCount--;
            }

            valueQueue.push( tok );
            return;
        }

        if ( tok.isOperator() ) 
        {
            //              while( ! valueQueue.isEmpty() && ! tok.hasAllOperands() ) {
            while( ! tok.hasAllOperands() ) 
            {
                if ( valueQueue.isEmpty() ) {
                    throw new ParseException("Operator "+tok.getToken()+" lacks operand",tok.getTextRegion());
                }
                tok.getToken().insertChild( 0 , valueQueue.pop().getToken() );
            }
            valueQueue.push( tok );
            return;
        }
        throw new RuntimeException("Unreachable code reached");
    }