1 2 package java_cup; 3 4 /** This class represents one row (corresponding to one machine state) of the 5 * parse action table. 6 */ 7 public class parse_action_row { 8 9 /*-----------------------------------------------------------*/ 10 /*--- Constructor(s) ----------------------------------------*/ 11 /*-----------------------------------------------------------*/ 12 13 /** Simple constructor. Note: this should not be used until the number of 14 * terminals in the grammar has been established. 15 */ parse_action_row()16 public parse_action_row() 17 { 18 /* make sure the size is set */ 19 if (_size <= 0 ) _size = terminal.number(); 20 21 /* allocate the array */ 22 under_term = new parse_action[size()]; 23 24 /* set each element to an error action */ 25 for (int i=0; i<_size; i++) 26 under_term[i] = new parse_action(); 27 } 28 29 /*-----------------------------------------------------------*/ 30 /*--- (Access to) Static (Class) Variables ------------------*/ 31 /*-----------------------------------------------------------*/ 32 33 /** Number of columns (terminals) in every row. */ 34 protected static int _size = 0; 35 36 /** Number of columns (terminals) in every row. */ size()37 public static int size() {return _size;} 38 39 /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ 40 41 /** Table of reduction counts (reused by compute_default()). */ 42 protected static int reduction_count[] = null; 43 44 /*-----------------------------------------------------------*/ 45 /*--- (Access to) Instance Variables ------------------------*/ 46 /*-----------------------------------------------------------*/ 47 48 /** Actual action entries for the row. */ 49 public parse_action under_term[]; 50 51 /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ 52 53 /** Default (reduce) action for this row. -1 will represent default 54 * of error. 55 */ 56 public int default_reduce; 57 58 /*-----------------------------------------------------------*/ 59 /*--- General Methods ---------------------------------------*/ 60 /*-----------------------------------------------------------*/ 61 62 /** Compute the default (reduce) action for this row and store it in 63 * default_reduce. In the case of non-zero default we will have the 64 * effect of replacing all errors by that reduction. This may cause 65 * us to do erroneous reduces, but will never cause us to shift past 66 * the point of the error and never cause an incorrect parse. -1 will 67 * be used to encode the fact that no reduction can be used as a 68 * default (in which case error will be used). 69 */ compute_default()70 public void compute_default() 71 { 72 int i, prod, max_prod, max_red; 73 74 /* if we haven't allocated the count table, do so now */ 75 if (reduction_count == null) 76 reduction_count = new int[production.number()]; 77 78 /* clear the reduction count table and maximums */ 79 for (i = 0; i < production.number(); i++) 80 reduction_count[i] = 0; 81 max_prod = -1; 82 max_red = 0; 83 84 /* walk down the row and look at the reduces */ 85 for (i = 0; i < size(); i++) 86 if (under_term[i].kind() == parse_action.REDUCE) 87 { 88 /* count the reduce in the proper production slot and keep the 89 max up to date */ 90 prod = ((reduce_action)under_term[i]).reduce_with().index(); 91 reduction_count[prod]++; 92 if (reduction_count[prod] > max_red) 93 { 94 max_red = reduction_count[prod]; 95 max_prod = prod; 96 } 97 } 98 99 /* record the max as the default (or -1 for not found) */ 100 default_reduce = max_prod; 101 } 102 103 /*-----------------------------------------------------------*/ 104 105 }; 106 107