| |
| package java_cup; |
| |
| |
| /** This class represents the complete "reduce-goto" table of the parser. |
| * It has one row for each state in the parse machines, and a column for |
| * each terminal symbol. Each entry contains a state number to shift to |
| * as the last step of a reduce. |
| * |
| * @see java_cup.parse_reduce_row |
| * @version last updated: 11/25/95 |
| * @author Scott Hudson |
| */ |
| public class parse_reduce_table { |
| |
| /*-----------------------------------------------------------*/ |
| /*--- Constructor(s) ----------------------------------------*/ |
| /*-----------------------------------------------------------*/ |
| |
| /** Simple constructor. Note: all terminals, non-terminals, and productions |
| * must already have been entered, and the viable prefix recognizer should |
| * have been constructed before this is called. |
| */ |
| public parse_reduce_table() |
| { |
| /* determine how many states we are working with */ |
| _num_states = lalr_state.number(); |
| |
| /* allocate the array and fill it in with empty rows */ |
| under_state = new parse_reduce_row[_num_states]; |
| for (int i=0; i<_num_states; i++) |
| under_state[i] = new parse_reduce_row(); |
| } |
| |
| |
| /*-----------------------------------------------------------*/ |
| /*--- (Access to) Instance Variables ------------------------*/ |
| /*-----------------------------------------------------------*/ |
| |
| /** How many rows/states in the machine/table. */ |
| protected int _num_states; |
| |
| /** How many rows/states in the machine/table. */ |
| public int num_states() {return _num_states;} |
| |
| /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ |
| |
| /** Actual array of rows, one per state */ |
| public parse_reduce_row[] under_state; |
| |
| /*-----------------------------------------------------------*/ |
| /*--- General Methods ---------------------------------------*/ |
| /*-----------------------------------------------------------*/ |
| |
| /** Convert to a string. */ |
| public String toString() |
| { |
| String result; |
| lalr_state goto_st; |
| int cnt; |
| |
| result = "-------- REDUCE_TABLE --------\n"; |
| for (int row = 0; row < num_states(); row++) |
| { |
| result += "From state #" + row + "\n"; |
| cnt = 0; |
| for (int col = 0; col < under_state[row].size(); col++) |
| { |
| /* pull out the table entry */ |
| goto_st = under_state[row].under_non_term[col]; |
| |
| /* if it has action in it, print it */ |
| if (goto_st != null) |
| { |
| result += col + ":"; |
| result += goto_st.index(); |
| |
| /* end the line after the 3rd one */ |
| cnt++; |
| if (cnt == 3) |
| { |
| result += "\n"; |
| cnt = 0; |
| } |
| } |
| } |
| /* finish the line if we haven't just done that */ |
| if (cnt != 0) result += "\n"; |
| } |
| result += "-----------------------------"; |
| |
| return result; |
| } |
| |
| /*-----------------------------------------------------------*/ |
| |
| }; |
| |