Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }