package java_cup ;
/**
* This class represents one row (corresponding to one machine state) of the
* parse action table.
*/
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 ;
}
/*-----------------------------------------------------------*/
}