Source code: org/sablecc/sablecc/AltTransformAdapter.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 java.util.*;
11 import org.sablecc.sablecc.analysis.*;
12 import org.sablecc.sablecc.node.*;
13 import java.io.*;
14
15 public class AltTransformAdapter extends DepthFirstAdapter
16 {
17 ResolveAltIds altIds;
18 String currentNewAltName;
19
20 private Map isElementIsAlist;
21
22 private LinkedList listSimpleTermTransform;
23 private Map simpleTermTransform;
24 private Map simpleTermOrsimpleListTermTypes;
25
26 AltTransformAdapter(Map simpleTermTransform,
27 LinkedList listSimpleTermTransform,
28 String currentNewAltName,
29 ResolveAltIds altIds, Map isElementIsAlist,
30 Map simpleTermOrsimpleListTermTypes)
31 {
32 this.currentNewAltName = currentNewAltName;
33 this.altIds = altIds;
34 this.isElementIsAlist = isElementIsAlist;
35 this.listSimpleTermTransform = listSimpleTermTransform;
36 this.simpleTermTransform = simpleTermTransform;
37 this.simpleTermOrsimpleListTermTypes = simpleTermOrsimpleListTermTypes;
38 }
39
40 public void inASimpleTerm(ASimpleTerm node)
41 {
42 String name = node.getId().getText();
43
44 if( !((LinkedList)altIds.alts_elems.get(currentNewAltName)).contains(name) &&
45 !((LinkedList)altIds.alts_elems.get(currentNewAltName)).contains("$"+name) )
46 {
47 node.replaceBy( new ANullTerm() );
48 }
49
50 if( isElementIsAlist.get(currentNewAltName+name) != null )
51 {
52 TId simpleTermTail;
53 if(node.getSimpleTermTail() != null)
54 {
55 simpleTermTail = node.getSimpleTermTail();
56 }
57 else
58 {
59 simpleTermTail = new TId( (String)isElementIsAlist.get(currentNewAltName+name) );
60 }
61
62 ASimpleTerm asimpleTerm = new ASimpleTerm( node.getSpecifier(), node.getId(), simpleTermTail);
63
64 if(simpleTermOrsimpleListTermTypes.get(node) != null)
65 {
66 simpleTermOrsimpleListTermTypes.put(asimpleTerm, (String)simpleTermOrsimpleListTermTypes.get(node));
67 }
68
69 node.replaceBy(asimpleTerm);
70 simpleTermTransform.put(asimpleTerm, "L"+ResolveIds.name((String)isElementIsAlist.get(currentNewAltName+name)) );
71
72 //Terms are added here only if they were implicitely transformed
73 listSimpleTermTransform.add( asimpleTerm );
74 }
75 }
76
77 public void inASimpleListTerm(ASimpleListTerm node)
78 {
79 String name = node.getId().getText();
80
81 if( !((LinkedList)altIds.alts_elems.get(currentNewAltName)).contains(name) &&
82 !((LinkedList)altIds.alts_elems.get(currentNewAltName)).contains("$"+name) )
83 {
84 node.replaceBy( null );
85 }
86
87 if( isElementIsAlist.get(currentNewAltName+name) != null)
88 {
89 TId simpleTermTail;
90 if(node.getSimpleTermTail() != null)
91 {
92 simpleTermTail = node.getSimpleTermTail();
93 }
94 else
95 {
96 simpleTermTail = new TId((String)isElementIsAlist.get(currentNewAltName+name));
97 }
98
99 TId tid;
100 tid = ( ((LinkedList)altIds.alts_elems_list_elemName.get(currentNewAltName)).contains(name) ?
101 node.getId() : new TId( "$" + node.getId().getText() ) );
102
103 ASimpleListTerm asimpleListTerm = new ASimpleListTerm( node.getSpecifier(), tid, simpleTermTail);
104
105 if(simpleTermOrsimpleListTermTypes.get(node) != null)
106 {
107 simpleTermOrsimpleListTermTypes.put(asimpleListTerm, (String)simpleTermOrsimpleListTermTypes.get(node));
108 }
109
110 node.replaceBy(asimpleListTerm);
111 simpleTermTransform.put(asimpleListTerm, "L"+ResolveIds.name((String)isElementIsAlist.get(currentNewAltName+name) ));
112
113 //Terms are added here only if they were implicitely transformed
114 listSimpleTermTransform.add( asimpleListTerm );
115 }
116 }
117
118 public void outAListTerm(AListTerm node)
119 {
120 if( (node.getListTerms() != null) && (node.getListTerms().size() > 0) )
121 {
122 Object[] temp = node.getListTerms().toArray();
123
124 if(simpleTermTransform.get(temp[0]) != null)
125 {
126 String firstTermType = (String)simpleTermTransform.get(temp[0]);
127
128 if(firstTermType != null)
129 {
130 if(!firstTermType.startsWith("L"))
131 {
132 simpleTermTransform.put(node, "L" + firstTermType);
133 }
134 else
135 {
136 simpleTermTransform.put(node, firstTermType);
137 }
138 }
139 }
140 }
141 }
142
143 }