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