1f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 2f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Projectpackage java_cup; 3f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 4f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Projectimport java.util.Enumeration; 5f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 6f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project/** This class represents the complete "action" table of the parser. 7f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * It has one row for each state in the parse machine, and a column for 8f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * each terminal symbol. Each entry in the table represents a shift, 9f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * reduce, or an error. 10f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * 11f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * @see java_cup.parse_action 12f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * @see java_cup.parse_action_row 13f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * @version last updated: 11/25/95 14f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * @author Scott Hudson 15f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project */ 16f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Projectpublic class parse_action_table { 17f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 18f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*-----------------------------------------------------------*/ 19f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*--- Constructor(s) ----------------------------------------*/ 20f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*-----------------------------------------------------------*/ 21f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 22f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /** Simple constructor. All terminals, non-terminals, and productions must 23f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * already have been entered, and the viable prefix recognizer should 24f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * have been constructed before this is called. 25f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project */ 26f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project public parse_action_table() 27f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 28f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* determine how many states we are working with */ 29f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project _num_states = lalr_state.number(); 30f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 31f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* allocate the array and fill it in with empty rows */ 32f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project under_state = new parse_action_row[_num_states]; 33f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project for (int i=0; i<_num_states; i++) 34f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project under_state[i] = new parse_action_row(); 35f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 36f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 37f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*-----------------------------------------------------------*/ 38f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*--- (Access to) Instance Variables ------------------------*/ 39f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*-----------------------------------------------------------*/ 40f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 41f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /** How many rows/states are in the machine/table. */ 42f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project protected int _num_states; 43f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 44f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /** How many rows/states are in the machine/table. */ 45f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project public int num_states() {return _num_states;} 46f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 47f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ 48f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 49f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /** Actual array of rows, one per state. */ 50f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project public parse_action_row[] under_state; 51f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 52f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*-----------------------------------------------------------*/ 53f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*--- General Methods ---------------------------------------*/ 54f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*-----------------------------------------------------------*/ 55f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 56f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /** Check the table to ensure that all productions have been reduced. 57f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * Issue a warning message (to System.err) for each production that 58f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project * is never reduced. 59f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project */ 60f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project public void check_reductions() 61f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project throws internal_error 62f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 63f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project parse_action act; 64f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project production prod; 65f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 66f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* tabulate reductions -- look at every table entry */ 67f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project for (int row = 0; row < num_states(); row++) 68f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 69f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project for (int col = 0; col < under_state[row].size(); col++) 70f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 71f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* look at the action entry to see if its a reduce */ 72f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project act = under_state[row].under_term[col]; 73f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project if (act != null && act.kind() == parse_action.REDUCE) 74f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 75f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* tell production that we used it */ 76f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project ((reduce_action)act).reduce_with().note_reduction_use(); 77f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 78f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 79f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 80f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 81f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* now go across every production and make sure we hit it */ 82f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project for (Enumeration p = production.all(); p.hasMoreElements(); ) 83f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 84f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project prod = (production)p.nextElement(); 85f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 86f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* if we didn't hit it give a warning */ 87f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project if (prod.num_reductions() == 0) 88f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 89f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* count it * 90f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project emit.not_reduced++; 91f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 92f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* give a warning if they haven't been turned off */ 93f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project if (!emit.nowarn) 94f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 95f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project System.err.println("*** Production \"" + 96f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project prod.to_simple_string() + "\" never reduced"); 97f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project lexer.warning_count++; 98f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 99f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 100f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 101f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 102f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 103f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* 104f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 105f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /** Convert to a string. */ 106f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project public String toString() 107f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 108f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project String result; 109f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project int cnt; 110f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 111f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project result = "-------- ACTION_TABLE --------\n"; 112f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project for (int row = 0; row < num_states(); row++) 113f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 114f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project result += "From state #" + row + "\n"; 115f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project cnt = 0; 116f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project for (int col = 0; col < under_state[row].size(); col++) 117f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 118f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* if the action is not an error print it */ 119f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project if (under_state[row].under_term[col].kind() != parse_action.ERROR) 120f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 121f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project result += col + ":" + under_state[row].under_term[col] + " "; 122f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 123f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* end the line after the 3rd one */ 124f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project cnt++; 125f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project if (cnt == 3) 126f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project { 127f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project result += "\n"; 128f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project cnt = 0; 129f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 130f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 131f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 132f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /* finish the line if we haven't just done that */ 133f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project if (cnt != 0) result += "\n"; 134f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 135f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project result += "------------------------------"; 136f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 137f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project return result; 138f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project } 139f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 140f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project /*-----------------------------------------------------------*/ 141f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 142f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project}; 143f8057104af9cae031b544e971a52adafa7c0d9eThe Android Open Source Project 144