Source code: org/sablecc/sablecc/ComputeCGNomenclature.java
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * This file is part of SableCC. *
3 * See the file "LICENSE" for copyright information and the *
4 * terms and conditions for copying, distribution and *
5 * modification of SableCC. *
6 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
7
8 package org.sablecc.sablecc;
9
10 import org.sablecc.sablecc.analysis.*;
11 import org.sablecc.sablecc.node.*;
12 import java.util.*;
13 import java.io.*;
14
15 public class ComputeCGNomenclature extends DepthFirstAdapter
16 {
17 private String currentProd;
18 private String currentAlt;
19 private int counter;
20 private ResolveIds ids;
21 private ResolveProdTransformIds prodTransformIds;
22
23 private final Map altTransformElemTypes = new TypedHashMap(
24 NodeCast.instance,
25 StringCast.instance);
26
27 private final Map termNumbers = new TypedHashMap(NodeCast.instance,
28 IntegerCast.instance);
29
30 public ComputeCGNomenclature(ResolveIds ids, ResolveProdTransformIds prodTransformIds)
31 {
32 this.ids = ids;
33 this.prodTransformIds = prodTransformIds;
34 }
35
36 public Map getAltTransformElemTypes()
37 {
38 return altTransformElemTypes;
39 }
40
41 public Map getTermNumbers()
42 {
43 return termNumbers;
44 }
45
46 public void caseAProd(final AProd production)
47 {
48 currentProd = "P" + ids.name(production.getId().getText());
49 Object []temp = production.getAlts().toArray();
50 for(int i = 0; i<temp.length; i++)
51 {
52 ((PAlt)temp[i]).apply(this);
53 }
54 }
55
56 public void inAParsedAlt(AParsedAlt nodeAlt)
57 {
58 counter = 0;
59
60 if(nodeAlt.getAltName() != null)
61 {
62 currentAlt = "A"+
63 ids.name( nodeAlt.getAltName().getText() )+
64 currentProd.substring(1);
65 }
66 else
67 {
68 currentAlt = "A" + currentProd.substring(1);
69 }
70
71 counter = 0;
72 }
73
74 boolean processingProdTransform = false;
75 boolean processingAst = false;
76
77 public void inAAst(AAst node)
78 {
79 processingAst = true;
80 }
81
82 public void outAAst(AAst node)
83 {
84 processingAst = false;
85 }
86
87 public void inAElem(AElem node)
88 {
89 if(!processingAst)
90 {
91 String elemType = (String)ids.elemTypes.get(node);
92
93 if(node.getElemName() != null)
94 {
95 ids.altsElemNameTypes.put(currentAlt+"."+node.getElemName().getText(), elemType );
96 }
97 }
98 }
99
100 public void inANewTerm(ANewTerm node)
101 {
102 AProdName aProdName = (AProdName)node.getProdName();
103 String type = "P" + ids.name(aProdName.getId().getText());
104
105 altTransformElemTypes.put(node, type);
106 termNumbers.put(node, new Integer(++counter));
107 }
108
109 public void inANewListTerm(ANewListTerm node)
110 {
111 AProdName aProdName = (AProdName)node.getProdName();
112 String type = "P" + ids.name(aProdName.getId().getText());
113
114 altTransformElemTypes.put(node, type);
115 termNumbers.put(node, new Integer(++counter));
116 }
117
118 public void outAListTerm(AListTerm node)
119 {
120 if( node.getListTerms().size() > 0 )
121 {
122 Object[] temp = node.getListTerms().toArray();
123
124 String firstTermType = (String)altTransformElemTypes.get(temp[0]);
125
126 if(firstTermType != null)
127 {
128 if(!firstTermType.startsWith("L"))
129 {
130 altTransformElemTypes.put(node, "L" + firstTermType);
131 }
132 else
133 {
134 altTransformElemTypes.put(node, firstTermType);
135 }
136 }
137 }
138 else
139 {
140 altTransformElemTypes.put(node, "Lnull");
141 }
142 termNumbers.put(node, new Integer(++counter));
143 }
144
145 public void caseASimpleTerm(ASimpleTerm node)
146 {
147 String name;
148 String elemType = (String)ids.altsElemNameTypes.get( currentAlt+"."+node.getId().getText() );
149 boolean okTermtail = false;
150
151 if(node.getSpecifier() != null)
152 {
153 if(node.getSpecifier() instanceof ATokenSpecifier)
154 {
155 name = "T" + ids.name(node.getId().getText());
156 }
157 else
158 {
159 if(node.getSimpleTermTail() == null)
160 {
161 name = "P" + ids.name(node.getId().getText());
162 }
163 else
164 {
165 String termTail = node.getSimpleTermTail().getText();
166 String localcurrentProd = "P" + ids.name(node.getId().getText());
167 name = (String)prodTransformIds.prodTransformElemTypesString.get(localcurrentProd+"."+termTail);
168 }
169 }
170 }
171 else
172 {
173 String type;
174 if( ( (elemType != null) && elemType.startsWith("T") ) ||
175 ( (elemType == null) && ids.tokens.get("T" + ids.name(node.getId().getText())) != null ) )
176 {
177 if(elemType != null)
178 {
179 name = elemType;
180 }
181 else
182 {
183 name = "T" + ids.name(node.getId().getText());
184 }
185 }
186 else
187 {
188 if(node.getSimpleTermTail() == null)
189 {
190 if(elemType != null)
191 {
192 name = elemType;
193 }
194 else
195 {
196 name = "P" + ids.name(node.getId().getText());
197 }
198 }
199 else
200 {
201 String prodType;
202 if(elemType != null)
203 {
204 prodType = elemType;
205 }
206 else
207 {
208 prodType = "P" + ids.name(node.getId().getText());
209 }
210
211 String termTail = node.getSimpleTermTail().getText();
212 name = (String)prodTransformIds.prodTransformElemTypesString.get(prodType+"."+termTail);
213 }
214 }
215 }
216 termNumbers.put(node, new Integer(++counter));
217 altTransformElemTypes.put(node, name);
218 }
219
220 public void caseANullTerm(ANullTerm node)
221 {
222 altTransformElemTypes.put(node, "null");
223 termNumbers.put(node, new Integer(++counter));
224 }
225
226 public void caseASimpleListTerm(ASimpleListTerm node)
227 {
228 String name;
229 String strTermTail;
230
231 if(node.getSpecifier() != null)
232 {
233 if(node.getSpecifier() instanceof ATokenSpecifier)
234 {
235 name = "T" + ids.name(node.getId().getText());
236 }
237 else
238 {
239 if(node.getSimpleTermTail() == null)
240 {
241 name = "P" + ids.name(node.getId().getText());
242 }
243 else
244 {
245 String termTail = node.getSimpleTermTail().getText();
246
247 String localcurrentProd = "P" + ids.name(node.getId().getText());
248 name = (String)prodTransformIds.prodTransformElemTypesString.get(localcurrentProd+"."+termTail);
249 }
250
251 }
252 }
253
254 //the element has no specifier
255 else
256 {
257 String elemType = (String)ids.altsElemNameTypes.get( currentAlt+"."+node.getId().getText() );
258 String type;
259 if( ( (elemType != null) && elemType.startsWith("T") ) ||
260 ( (elemType == null) && ids.tokens.get("T" + ids.name(node.getId().getText())) != null ) )
261 {
262 if(elemType != null)
263 {
264 name = elemType;
265 }
266 else
267 {
268 name = "T" + ids.name(node.getId().getText());
269 }
270 }
271 //it seems to be a production without a specifier
272 else
273 {
274 if(node.getSimpleTermTail() == null)
275 {
276 if(elemType != null)
277 {
278 name = elemType;
279 }
280 else
281 {
282 name = "P" + ids.name(node.getId().getText());
283 }
284 }
285 else
286 {
287 String prodType;
288 if(elemType != null)
289 {
290 prodType = elemType;
291 }
292 else
293 {
294 prodType = "P" + ids.name(node.getId().getText());
295 }
296
297 String termTail = node.getSimpleTermTail().getText();
298 name = (String)prodTransformIds.prodTransformElemTypesString.get(prodType+"."+termTail);
299
300 }
301 }
302 }
303 altTransformElemTypes.put(node, name);
304 termNumbers.put(node, new Integer(++counter));
305 }
306 }