

import Jakarta.util.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URI;
import java.util.Hashtable;
import java.util.List;
import java.util.Stack;
import java.util.EmptyStackException;
import java.util.Vector;

//**************************************************
// Class AstOptNode
//**************************************************
    
public class AstOptNode extends  AstNode {
    public AstOptNode() {
        setParms( null );
    }

    public  AstOptNode setParms( AstNode child ) {
        arg = new  AstNode[1];
        arg[0]  = child;
        InitChildren();
        return ( ( AstOptNode ) this );
    }

    public boolean[] printorder() {
        FatalError error = new FatalError();
        error.printStackTrace();
        fatalError( "shouldn't call AstOptNode::printorder()" );
        return null;
    }

    // Delete() deletes the AST argument of AstOptNode

    public void Delete() {
        // Step 1: just set arg[0] to null

        if ( arg[0] != null )
            arg[0].up = null;

        arg[0] = null;
    }

    // Replace(w) does one of two things: if w is an instanceof AstOptNode
    // then replace the current node (which is an instance of AstOptNode)
    // with w using the generic Replace() method.  Otherwise, just replace
    // the argument of the current node with w.  The replaced node is
    // returned as a result

    public  AstNode Replace( AstNode withnode ) {
        if ( withnode instanceof  AstOptNode )
            return ( super.Replace( withnode ) );
        if ( arg[0] != null )
            arg[0].up   = null;
        arg[0]         = withnode;
        if ( withnode != null ) {
            withnode.left  = null;
            withnode.right = null;
            withnode.up    = this;
        }
        return ( withnode );
    }

    // print() and reduce2java() print/reduce optional nodes

    public void print() {
        if ( arg[0] != null ) {
            arg[0].print();
        }
    }

    public void print( AstProperties props ) {
        if ( arg[0] != null ) {
            arg[0].print( props );
        }
    }

    public void reduce2java( AstProperties props ) {
        if ( arg[0] != null ) {
            arg[0].reduce2java( props );
        }
    }

    public  AstNode addComment( String comment ) {
        return ( addComment( comment, false ) );
    }

    public  AstNode addComment( String comment, boolean replace ) {
        if ( arg[0] != null )
            return ( arg[0].addComment( comment, replace ) );
        return ( null );
    }
}
