package java_cup; /** * This class represents one row (corresponding to one machine state) of the * parse action table. */ @SuppressWarnings ( { "all" } ) public class parse_action_row { /*-----------------------------------------------------------*/ /*--- Constructor(s) ----------------------------------------*/ /*-----------------------------------------------------------*/ /** * Simple constructor. Note: this should not be used until the number of * terminals in the grammar has been established. */ public parse_action_row () { /* make sure the size is set */ if ( _size <= 0 ) _size = terminal.number (); /* allocate the array */ under_term = new parse_action [ size () ]; /* set each element to an error action */ for ( int i = 0 ; i < _size ; i++ ) under_term [ i ] = new parse_action (); } /*-----------------------------------------------------------*/ /*--- (Access to) Static (Class) Variables ------------------*/ /*-----------------------------------------------------------*/ /** Number of columns (terminals) in every row. */ protected static int _size = 0; /** Number of columns (terminals) in every row. */ public static int size () { return _size; } // Hm Added clear to clear all static fields public static void clear () { _size = 0; reduction_count = null; } /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /** Table of reduction counts (reused by compute_default()). */ protected static int reduction_count[] = null; /*-----------------------------------------------------------*/ /*--- (Access to) Instance Variables ------------------------*/ /*-----------------------------------------------------------*/ /** Actual action entries for the row. */ public parse_action under_term[]; /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /** * Default (reduce) action for this row. -1 will represent default of error. */ public int default_reduce; /*-----------------------------------------------------------*/ /*--- General Methods ---------------------------------------*/ /*-----------------------------------------------------------*/ /** * Compute the default (reduce) action for this row and store it in * default_reduce. In the case of non-zero default we will have the effect of * replacing all errors by that reduction. This may cause us to do erroneous * reduces, but will never cause us to shift past the point of the error and * never cause an incorrect parse. -1 will be used to encode the fact that no * reduction can be used as a default (in which case error will be used). */ public void compute_default () { int i, prod, max_prod, max_red; /* if we haven't allocated the count table, do so now */ if ( reduction_count == null ) reduction_count = new int [ production.number () ]; /* clear the reduction count table and maximums */ for ( i = 0 ; i < production.number () ; i++ ) reduction_count [ i ] = 0; max_prod = -1; max_red = 0; /* walk down the row and look at the reduces */ for ( i = 0 ; i < size () ; i++ ) if ( under_term [ i ].kind () == parse_action.REDUCE ) { /* * count the reduce in the proper production slot and keep the max up to * date */ prod = ( ( reduce_action ) under_term [ i ] ).reduce_with ().index (); reduction_count [ prod ]++ ; if ( reduction_count [ prod ] > max_red ) { max_red = reduction_count [ prod ]; max_prod = prod; } } /* record the max as the default (or -1 for not found) */ default_reduce = max_prod; } /*-----------------------------------------------------------*/ }