

import java.io.PrintWriter;

// this is a major simplification of the original ast layer
// most actions for code constructors is the same.  These methods
// are placed in JakartaSST

//**************************************************
// JakartaSST
//**************************************************
    
public class JakartaSST {
    private int stackMarker;
 
    public void reduce2java( AstProperties props ) {
        boolean order[];
        int i, t, n;
        PrintWriter ps;
        Environment env;
        AstNode a0 = arg[0];

        ps = ( PrintWriter ) props.getProperty( "output" );

             // conditional test -- this is the only difference
             // between differnt code constructors.

        // return null if the lone code constructor is an AstOptNode
                  // and it has a null argument -- this is the translation for empty
                  // AST constructors.

        if ( a0 instanceof  AstOptNode ) {
            a0 = a0.arg[0];
            if ( a0 == null ) {
                ps.print( " null" );
                return;
            }
        }

        env = ( Environment ) props.getProperty( "env" );
        if ( env != null )
            env.setActive( true );

        // Start passing a level count marker for AST's

        Integer oldLevel = ( Integer ) props.getProperty( "AstLevel" );
        if ( oldLevel == null )
            props.setProperty( "AstLevel", new Integer( 1 ) );
        else
            props.setProperty( "AstLevel", new Integer( oldLevel.intValue()+1 ) );

        // now reduce to AST the lone argument.  Remember the aliasStacksize

        String qual =  kernelConstants.LangName;
        String name = className();
        String nam = name.substring( 0, name.length()-1 );
        ps.print( "(" + nam + ") " + qual + 
                                                                "AstNode.markStack(" + qual + 
                                                                "AstNode.aliasStack.size(), " );
        a0.reduce2ast( props );

        // finish off with a call to patch

        ps.println( ").patch()" );
        if ( env != null )
            env.setActive( false );

        // Reduce or remove AstLevel
        if ( oldLevel == null )
            props.removeProperty( "AstLevel" );
        else
            props.setProperty( "AstLevel", new Integer( oldLevel.intValue()-1 ) );
    }

    public void reduce2ast( AstProperties props ) {
        Integer oldLevel;

        // Increment AstLevel
        oldLevel = ( Integer ) props.getProperty( "AstLevel" );
        props.setProperty( "AstLevel", new Integer( oldLevel.intValue()+1 ) );

        super.reduce2ast( props );

        // Restore old level (decrement)
        props.setProperty( "AstLevel", oldLevel );
    }

    public void buildSymbolTable1() {}

    public void buildSymbolTable2() {}
}
