source: default/trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/visitor/EbnfVisitor.java @ 12

Last change on this file since 12 was 12, checked in by zeiss, 14 years ago
  • Property svn:mime-type set to text/plain
File size: 7.1 KB
Line 
1package de.ugoe.cs.swe.bnftools.visitor;
2
3import java.util.Stack;
4
5import org.eclipse.emf.ecore.EObject;
6
7import de.ugoe.cs.swe.bnftools.ebnf.Atom;
8import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList;
9import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf;
10import de.ugoe.cs.swe.bnftools.ebnf.ExtRule;
11import de.ugoe.cs.swe.bnftools.ebnf.GlobalCombinator;
12import de.ugoe.cs.swe.bnftools.ebnf.GroupedSequence;
13import de.ugoe.cs.swe.bnftools.ebnf.HookCombinator;
14import de.ugoe.cs.swe.bnftools.ebnf.Import;
15import de.ugoe.cs.swe.bnftools.ebnf.MergeRule;
16import de.ugoe.cs.swe.bnftools.ebnf.OptionalSequence;
17import de.ugoe.cs.swe.bnftools.ebnf.RepeatedSequence;
18import de.ugoe.cs.swe.bnftools.ebnf.Rule;
19import de.ugoe.cs.swe.bnftools.ebnf.RuleCombinator;
20import de.ugoe.cs.swe.bnftools.ebnf.RuleReference;
21import de.ugoe.cs.swe.bnftools.ebnf.SectionHeading;
22import de.ugoe.cs.swe.bnftools.ebnf.SingleDefinition;
23import de.ugoe.cs.swe.bnftools.ebnf.StringRule;
24import de.ugoe.cs.swe.bnftools.ebnf.Term;
25
26public abstract class EbnfVisitor {
27       
28        protected EObject rootNode = null;
29        protected Stack<Boolean> lastElementStack = new Stack<Boolean>();
30       
31        public EbnfVisitor() {
32        }
33
34        public EbnfVisitor(EObject rootNode) {
35                this.rootNode = rootNode;
36        }
37
38        public void accept() {
39                if (rootNode != null)
40                        accept(rootNode);
41        }
42
43        public void accept(EObject node) {
44                dispatcherBefore(node);
45                acceptInner(node);
46                dispatcherAfter(node);
47        }
48
49        private void acceptInner(EObject node) {
50                Boolean lastElement = false;
51                if (node.eContents().size() == 0)
52                        lastElement = true;
53                lastElementStack.push(lastElement);             
54                for (int i=0; i < node.eContents().size(); i++) {
55                        EObject currentNode = (EObject) node.eContents().get(i);
56                        if (i == node.eContents().size()-1) {
57                                lastElement = true;
58                                lastElementStack.pop();
59                                lastElementStack.push(lastElement);
60                        }
61                        dispatcherBefore(currentNode);
62                        acceptInner(currentNode);
63                        dispatcherAfter(currentNode);
64                }
65                lastElementStack.pop();
66        }
67       
68        protected boolean isLastElement() {
69                return lastElementStack.peek();
70        }
71       
72        protected void dispatcherBefore(EObject node) {
73                // ugly, but no time to find a prettier solution
74                if (node instanceof EtsiBnf) {
75                        visitBefore((EtsiBnf) node);
76                } else if (node instanceof Atom) {
77                        visitBefore((Atom) node);
78                } else if (node instanceof DefinitionList) {
79                        visitBefore((DefinitionList) node);
80                } else if (node instanceof ExtRule) {
81                        visitBefore((ExtRule) node);
82                } else if (node instanceof GlobalCombinator) {
83                        visitBefore((GlobalCombinator) node);
84                } else if (node instanceof GroupedSequence) {
85                        visitBefore((GroupedSequence) node);
86                } else if (node instanceof HookCombinator) {
87                        visitBefore((HookCombinator) node);
88                } else if (node instanceof Import) {
89                        visitBefore((Import) node);
90                } else if (node instanceof MergeRule) {
91                        visitBefore((MergeRule) node);
92                } else if (node instanceof OptionalSequence) {
93                        visitBefore((OptionalSequence) node);
94                } else if (node instanceof RepeatedSequence) {
95                        visitBefore((RepeatedSequence) node);
96                } else if (node instanceof Rule) {
97                        visitBefore((Rule) node);
98                } else if (node instanceof RuleCombinator) {
99                        visitBefore((RuleCombinator) node);
100                } else if (node instanceof RuleReference) {
101                        visitBefore((RuleReference) node);
102                } else if (node instanceof SectionHeading) {
103                        visitBefore((SectionHeading) node);
104                } else if (node instanceof SingleDefinition) {
105                        visitBefore((SingleDefinition) node);
106                } else if (node instanceof StringRule) {
107                        visitBefore((StringRule) node);
108                } else if (node instanceof Term) {
109                        visitBefore((Term) node);
110                }
111        }
112       
113        protected void dispatcherAfter(EObject node) {
114                // ugly, but no time to find a prettier solution
115                if (node instanceof EtsiBnf) {
116                        visitAfter((EtsiBnf) node);
117                } else if (node instanceof Atom) {
118                        visitAfter((Atom) node);
119                } else if (node instanceof DefinitionList) {
120                        visitAfter((DefinitionList) node);
121                } else if (node instanceof ExtRule) {
122                        visitAfter((ExtRule) node);
123                } else if (node instanceof GlobalCombinator) {
124                        visitAfter((GlobalCombinator) node);
125                } else if (node instanceof GroupedSequence) {
126                        visitAfter((GroupedSequence) node);
127                } else if (node instanceof HookCombinator) {
128                        visitAfter((HookCombinator) node);
129                } else if (node instanceof Import) {
130                        visitAfter((Import) node);
131                } else if (node instanceof MergeRule) {
132                        visitAfter((MergeRule) node);
133                } else if (node instanceof OptionalSequence) {
134                        visitAfter((OptionalSequence) node);
135                } else if (node instanceof RepeatedSequence) {
136                        visitAfter((RepeatedSequence) node);
137                } else if (node instanceof Rule) {
138                        visitAfter((Rule) node);
139                } else if (node instanceof RuleCombinator) {
140                        visitAfter((RuleCombinator) node);
141                } else if (node instanceof RuleReference) {
142                        visitAfter((RuleReference) node);
143                } else if (node instanceof SectionHeading) {
144                        visitAfter((SectionHeading) node);
145                } else if (node instanceof SingleDefinition) {
146                        visitAfter((SingleDefinition) node);
147                } else if (node instanceof StringRule) {
148                        visitAfter((StringRule) node);
149                } else if (node instanceof Term) {
150                        visitAfter((Term) node);
151                }
152        }
153
154        protected void visitBefore(EtsiBnf node) {
155        }
156
157        protected void visitAfter(EtsiBnf node) {
158        }
159
160        protected void visitBefore(Atom node) {
161        }
162
163        protected void visitAfter(Atom node) {
164        }
165
166        protected void visitBefore(Term node) {
167        }
168
169        protected void visitAfter(Term node) {
170        }
171
172        protected void visitBefore(DefinitionList node) {
173        }
174
175        protected void visitAfter(DefinitionList node) {
176        }
177
178        protected void visitBefore(ExtRule node) {
179        }
180
181        protected void visitAfter(ExtRule node) {
182        }
183
184        protected void visitBefore(GlobalCombinator node) {
185        }
186
187        protected void visitAfter(GlobalCombinator node) {
188        }
189
190        protected void visitBefore(GroupedSequence node) {
191        }
192
193        protected void visitAfter(GroupedSequence node) {
194        }
195
196        protected void visitBefore(HookCombinator node) {
197        }
198
199        protected void visitAfter(HookCombinator node) {
200        }
201
202        protected void visitBefore(Import node) {
203        }
204
205        protected void visitAfter(Import node) {
206        }
207
208        protected void visitBefore(MergeRule node) {
209        }
210
211        protected void visitAfter(MergeRule node) {
212        }
213
214        protected void visitBefore(OptionalSequence node) {
215        }
216
217        protected void visitAfter(OptionalSequence node) {
218        }
219
220        protected void visitBefore(RepeatedSequence node) {
221        }
222
223        protected void visitAfter(RepeatedSequence node) {
224        }
225
226        protected void visitBefore(Rule node) {
227        }
228
229        protected void visitAfter(Rule node) {
230        }
231
232        protected void visitBefore(RuleCombinator node) {
233        }
234
235        protected void visitAfter(RuleCombinator node) {
236        }
237
238        protected void visitBefore(RuleReference node) {
239        }
240
241        protected void visitAfter(RuleReference node) {
242        }
243
244        protected void visitBefore(SectionHeading node) {
245        }
246
247        protected void visitAfter(SectionHeading node) {
248        }
249
250        protected void visitBefore(SingleDefinition node) {
251        }
252
253        protected void visitAfter(SingleDefinition node) {
254        }
255
256        protected void visitBefore(StringRule node) {
257        }
258
259        protected void visitAfter(StringRule node) {
260        }
261       
262}
Note: See TracBrowser for help on using the repository browser.