Project

General

Profile

root / trunk / compiler / ooasCompiler / src / org / momut / ooas / visitors / OoaCompleteAstTraversalVisitor.java @ 12

1
/**
2
  *
3
  *                      OOAS Compiler
4
  *
5
  *       Copyright 2015, AIT Austrian Institute of Technology.
6
  * This code is based on the C# Version of the OOAS Compiler, which is
7
  * copyright 2015 by the Institute of Software Technology, Graz University
8
  * of Technology with portions copyright by the AIT Austrian Institute of
9
  * Technology. All rights reserved.
10
  *
11
  * SEE THE "LICENSE" FILE FOR THE TERMS UNDER WHICH THIS FILE IS PROVIDED.
12
  *
13
  * If you modify the file please update the list of contributors below to in-
14
  * clude your name. Please also stick to the coding convention of using TABs
15
  * to do the basic (block-level) indentation and spaces for anything after
16
  * that. (Enable the display of special chars and it should be pretty obvious
17
  * what this means.) Also, remove all trailing whitespace.
18
  *
19
  * Contributors:
20
  *               Willibald Krenn (AIT)
21
  *               Stephan Zimmerer (AIT)
22
  *               Markus Demetz (AIT)
23
  *               Christoph Czurda (AIT)
24
  *
25
  */
26

    
27

    
28
package org.momut.ooas.visitors;
29

    
30
import java.util.HashSet;
31

    
32
import org.momut.ooas.ast.IAst;
33
import org.momut.ooas.ast.IAstVisitor;
34
import org.momut.ooas.ast.expressions.AccessExpression;
35
import org.momut.ooas.ast.expressions.BinaryOperator;
36
import org.momut.ooas.ast.expressions.CallExpression;
37
import org.momut.ooas.ast.expressions.ExistsQuantifier;
38
import org.momut.ooas.ast.expressions.Expression;
39
import org.momut.ooas.ast.expressions.ExpressionKind;
40
import org.momut.ooas.ast.expressions.ForallQuantifier;
41
import org.momut.ooas.ast.expressions.IdentifierExpression;
42
import org.momut.ooas.ast.expressions.ListConstructor;
43
import org.momut.ooas.ast.expressions.MapConstructor;
44
import org.momut.ooas.ast.expressions.ObjectConstructor;
45
import org.momut.ooas.ast.expressions.SetConstructor;
46
import org.momut.ooas.ast.expressions.TernaryOperator;
47
import org.momut.ooas.ast.expressions.TupleConstructor;
48
import org.momut.ooas.ast.expressions.TupleMapAccessExpression;
49
import org.momut.ooas.ast.expressions.TypeExpression;
50
import org.momut.ooas.ast.expressions.UnaryOperator;
51
import org.momut.ooas.ast.expressions.UnresolvedIdentifierExpression;
52
import org.momut.ooas.ast.expressions.ValueExpression;
53
import org.momut.ooas.ast.expressions.MapConstructor.MapItem;
54
import org.momut.ooas.ast.identifiers.AttributeIdentifier;
55
import org.momut.ooas.ast.identifiers.ConstantIdentifier;
56
import org.momut.ooas.ast.identifiers.EnumIdentifier;
57
import org.momut.ooas.ast.identifiers.ExpressionVariableIdentifier;
58
import org.momut.ooas.ast.identifiers.Identifier;
59
import org.momut.ooas.ast.identifiers.LocalVariableIdentifier;
60
import org.momut.ooas.ast.identifiers.MainModule;
61
import org.momut.ooas.ast.identifiers.MethodIdentifier;
62
import org.momut.ooas.ast.identifiers.Module;
63
import org.momut.ooas.ast.identifiers.NamedActionIdentifier;
64
import org.momut.ooas.ast.identifiers.NondetIdentifierList;
65
import org.momut.ooas.ast.identifiers.ParameterIdentifier;
66
import org.momut.ooas.ast.identifiers.PrioIdentifierList;
67
import org.momut.ooas.ast.identifiers.SelfTypeIdentifier;
68
import org.momut.ooas.ast.identifiers.SeqIdentifierList;
69
import org.momut.ooas.ast.identifiers.TypeIdentifier;
70
import org.momut.ooas.ast.identifiers.UnspecIdentifierList;
71
import org.momut.ooas.ast.statements.AbortStatement;
72
import org.momut.ooas.ast.statements.Assignment;
73
import org.momut.ooas.ast.statements.BreakStatement;
74
import org.momut.ooas.ast.statements.Call;
75
import org.momut.ooas.ast.statements.GuardedCommand;
76
import org.momut.ooas.ast.statements.KillStatement;
77
import org.momut.ooas.ast.statements.NondetBlock;
78
import org.momut.ooas.ast.statements.PrioBlock;
79
import org.momut.ooas.ast.statements.SeqBlock;
80
import org.momut.ooas.ast.statements.SkipStatement;
81
import org.momut.ooas.ast.statements.Statement;
82
import org.momut.ooas.ast.types.AnyType;
83
import org.momut.ooas.ast.types.BoolType;
84
import org.momut.ooas.ast.types.CharType;
85
import org.momut.ooas.ast.types.EnumType;
86
import org.momut.ooas.ast.types.FloatType;
87
import org.momut.ooas.ast.types.FunctionType;
88
import org.momut.ooas.ast.types.IntType;
89
import org.momut.ooas.ast.types.ListType;
90
import org.momut.ooas.ast.types.MapType;
91
import org.momut.ooas.ast.types.MetaType;
92
import org.momut.ooas.ast.types.NullType;
93
import org.momut.ooas.ast.types.OoActionSystemType;
94
import org.momut.ooas.ast.types.OpaqueType;
95
import org.momut.ooas.ast.types.TupleType;
96
import org.momut.ooas.ast.types.Type;
97
import org.momut.ooas.parser.ParserState;
98

    
99
public abstract class OoaCompleteAstTraversalVisitor implements IAstVisitor
100
{
101
        protected HashSet<Object> m_visited = new HashSet<Object>();
102
        protected ParserState m_ParserState;
103
        protected boolean m_DuplicateVisit;
104

    
105
        protected void VisitSub(IAst subElement, IAst parent)
106
        {
107
                if (subElement == null)
108
                        return;
109
                if (m_visited.contains(subElement))
110
                        return;
111
                if (!(subElement instanceof OpaqueType) && !m_DuplicateVisit)
112
                        m_visited.add(subElement);
113
                VisitAstElement(subElement, parent);
114
        }
115

    
116
        /// <summary>
117
        ///  Is called once per Ast element. Makes sense to override it in a
118
        ///  subclass..
119
        /// </summary>
120
        /// <param name="element">to be visited</param>
121
        /// <param name="parent">parent of the element in the ast</param>
122
        protected void VisitAstElement(IAst element, IAst parent)
123
        {
124
                element.Accept(this);
125
        }
126

    
127
        public OoaCompleteAstTraversalVisitor(ParserState aState)
128
        {
129
                m_ParserState = aState;
130
        }
131

    
132
        public OoaCompleteAstTraversalVisitor(ParserState aState, boolean completeTraversal)
133
        {
134
                this(aState);
135
                m_DuplicateVisit = completeTraversal;
136
        }
137

    
138
        @Override
139
        public String returnVisitorName()
140
        {
141
                return this.getClass().getSimpleName();
142
        }
143

    
144
        @Override
145
        public void done() {
146
        }
147

    
148
        @Override
149
        public /*override*/ String toString()
150
        {
151
                return returnVisitorName();
152
        }
153

    
154
        @Override
155
        public void visit(EnumIdentifier enumIdentifier)
156
        {
157
                VisitSub(enumIdentifier.type(), enumIdentifier);
158
        }
159

    
160
        @Override
161
        public void visit(ConstantIdentifier constantIdentifier)
162
        {
163
                if (constantIdentifier.type() != null)
164
                        VisitSub(constantIdentifier.type(), constantIdentifier);
165
                VisitSub(constantIdentifier.Value(), constantIdentifier);
166
        }
167

    
168
        @Override
169
        public void visit(AttributeIdentifier attributeIdentifier)
170
        {
171
                VisitSub(attributeIdentifier.type(), attributeIdentifier);
172
                VisitSub(attributeIdentifier.initializer(), attributeIdentifier);
173
        }
174

    
175
        @Override
176
        public void visit(ExpressionVariableIdentifier expressionVariableIdentifier)
177
        {
178
                VisitSub(expressionVariableIdentifier.type(), expressionVariableIdentifier);
179
        }
180

    
181
        @Override
182
        public void visit(ParameterIdentifier parameterIdentifier)
183
        {
184
                VisitSub(parameterIdentifier.type(), parameterIdentifier);
185
        }
186

    
187
        @Override
188
        public void visit(LocalVariableIdentifier localVariableIdentifier)
189
        {
190
                VisitSub(localVariableIdentifier.type(), localVariableIdentifier);
191
        }
192

    
193
        @Override
194
        public void visit(TypeIdentifier typeIdentifier)
195
        {
196
                VisitSub(typeIdentifier.type(), typeIdentifier);
197
        }
198

    
199
        @Override
200
        public void visit(SelfTypeIdentifier aself)
201
        {
202
                visit((TypeIdentifier)aself);
203
        }
204

    
205
        @Override
206
        public void visit(MethodIdentifier methodIdentifier)
207
        {
208
                VisitSub(methodIdentifier.type(), methodIdentifier);
209
                for (final Identifier sym: methodIdentifier.symbolTable().symbolList())
210
                        VisitSub(sym, methodIdentifier);
211
                for (final ParameterIdentifier par: methodIdentifier.parameter())
212
                        VisitSub(par, methodIdentifier);
213
                VisitSub(methodIdentifier.body(), methodIdentifier);
214
        }
215

    
216
        @Override
217
        public void visit(NamedActionIdentifier namedActionIdentifier)
218
        {
219
                VisitSub(namedActionIdentifier.type(), namedActionIdentifier);
220
                for (final Identifier sym : namedActionIdentifier.symbolTable().symbolList())
221
                        VisitSub(sym, namedActionIdentifier);
222
                for (final ParameterIdentifier par: namedActionIdentifier.parameter())
223
                        VisitSub(par, namedActionIdentifier);
224
                VisitSub(namedActionIdentifier.body(), namedActionIdentifier);
225
        }
226

    
227
        @Override
228
        public void visit(MainModule mainModule)
229
        {
230
                for (final Identifier sym: mainModule.symbolTable().symbolList())
231
                        VisitSub(sym, mainModule);
232
                final boolean haveInstance = mainModule.instance() != null;
233
                if (haveInstance)
234
                        VisitSub(mainModule.instance(), mainModule);
235
                else
236
                        VisitSub(mainModule.systemDescription(), mainModule);
237
        }
238

    
239
        @Override
240
        public void visit(Module module)
241
        {
242
                for (final Identifier sym: module.symbolTable().symbolList())
243
                        VisitSub(sym, module);
244
        }
245

    
246
        @Override
247
        public void visit(NondetIdentifierList nondetIdentifierList)
248
        {
249
                for (final Identifier id: nondetIdentifierList.identifiers())
250
                        VisitSub(id, nondetIdentifierList);
251
        }
252

    
253
        @Override
254
        public void visit(SeqIdentifierList seqIdentifierList)
255
        {
256
                for (final Identifier id: seqIdentifierList.identifiers())
257
                        VisitSub(id, seqIdentifierList);
258
        }
259

    
260
        @Override
261
        public void visit(PrioIdentifierList prioIdentifierList)
262
        {
263
                for (final Identifier id: prioIdentifierList.identifiers())
264
                        VisitSub(id, prioIdentifierList);
265
        }
266

    
267
        @Override
268
        public void visit(UnspecIdentifierList unspecIdentifierList)
269
        {
270
                for (final Identifier id: unspecIdentifierList.identifiers())
271
                        VisitSub(id, unspecIdentifierList);
272
        }
273

    
274
        @Override
275
        public void visit(NondetBlock nondetBlock)
276
        {
277
                for (final Identifier id: nondetBlock.symbols().symbolList())
278
                        VisitSub(id, nondetBlock);
279

    
280
                for (final Statement stmnt: nondetBlock.statements())
281
                        VisitSub(stmnt, nondetBlock);
282
        }
283

    
284
        @Override
285
        public void visit(SeqBlock seqBlock)
286
        {
287
                for (final Identifier id: seqBlock.symbols().symbolList())
288
                        VisitSub(id, seqBlock);
289

    
290
                if (seqBlock.filter() != null)
291
                        VisitSub(seqBlock.filter(), seqBlock);
292

    
293
                for (final Statement stmnt: seqBlock.statements())
294
                        VisitSub(stmnt, seqBlock);
295
        }
296

    
297
        @Override
298
        public void visit(PrioBlock prioBlock)
299
        {
300
                for (final Identifier id: prioBlock.symbols().symbolList())
301
                        VisitSub(id, prioBlock);
302

    
303
                for (final Statement stmnt: prioBlock.statements())
304
                        VisitSub(stmnt, prioBlock);
305
        }
306

    
307
        @Override
308
        public void visit(GuardedCommand guardedCommand)
309
        {
310
                VisitSub(guardedCommand.guard(), guardedCommand);
311
                VisitSub(guardedCommand.body(), guardedCommand);
312
        }
313

    
314
        @Override
315
        public void visit(Assignment assignment)
316
        {
317
                for (final Expression vexp: assignment.places())
318
                        VisitSub(vexp, assignment);
319
                for (final Expression expr: assignment.values())
320
                        VisitSub(expr, assignment);
321

    
322
                VisitSub(assignment.nondetExpression(), assignment);
323
        }
324

    
325
        @Override
326
        public void visit(Call call)
327
        {
328
                VisitSub(call.callExpression(), call);
329
        }
330

    
331
        @Override
332
        public void visit(SkipStatement skipStatement)
333
        { }
334

    
335
        @Override
336
        public void visit(BreakStatement breakStatement)
337
        { }
338

    
339
        @Override
340
        public void visit(AbortStatement abortStatement)
341
        { }
342

    
343
        @Override
344
        public void visit(KillStatement killStatement)
345
        {
346
                VisitSub(killStatement.someOne, killStatement);
347
        }
348

    
349
        @Override
350
        public <T>void visit(ValueExpression<T> valueExpression)
351
        { }
352

    
353
        @Override
354
        public void visit(UnresolvedIdentifierExpression unresolvedIdentifierExpression)
355
        {
356
                VisitSub(unresolvedIdentifierExpression.type(), unresolvedIdentifierExpression);
357
        }
358

    
359
        @Override
360
        public void visit(IdentifierExpression identifierExpression)
361
        {
362
                VisitSub(identifierExpression.type(), identifierExpression);
363
                VisitSub(identifierExpression.identifier(), identifierExpression);
364
        }
365

    
366
        @Override
367
        public void visit(TypeExpression typeExpression)
368
        {
369
                VisitSub(typeExpression.referredType(), typeExpression);
370
                VisitSub(typeExpression.type(), typeExpression);
371
        }
372

    
373
        @Override
374
        public void visit(ListConstructor listConstructor)
375
        {
376
                for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList())
377
                        VisitSub(lvar, listConstructor);
378

    
379
                for (final Expression elems: listConstructor.elements())
380
                        VisitSub(elems, listConstructor);
381

    
382
                if (listConstructor.comprehension() != null)
383
                        VisitSub(listConstructor.comprehension(), listConstructor);
384
        }
385

    
386
        @Override
387
        public void visit(SetConstructor setConstructor)
388
        {
389
                for (final Identifier svar: setConstructor.comprehensionVariables().symbolList())
390
                        VisitSub(svar, setConstructor);
391

    
392
                for (final Expression elems: setConstructor.items())
393
                        VisitSub(elems, setConstructor);
394

    
395
                VisitSub(setConstructor.comprehension(), setConstructor);
396
        }
397

    
398
        @Override
399
        public void visit(MapConstructor mapConstructor)
400
        {
401
                /*foreach (var lvar in mapConstructor.localVariables.symbolList)
402
                        VisitSub(lvar, mapConstructor);*/
403

    
404
                for (final MapItem elem: mapConstructor.items())
405
                {
406
                        VisitSub(elem.key, mapConstructor);
407
                        VisitSub(elem.value, mapConstructor);
408
                }
409
        }
410

    
411
        @Override
412
        public void visit(TupleConstructor tupleConstructor)
413
        {
414
                /*foreach (var lvar in tupleConstructor.localVariables.symbolList)
415
                        VisitSub(lvar, tupleConstructor);*/
416

    
417
                for (final Expression elem: tupleConstructor.values())
418
                        VisitSub(elem, tupleConstructor);
419
        }
420

    
421
        @Override
422
        public void visit(AccessExpression accessExpression)
423
        {
424
                VisitSub(accessExpression.left(), accessExpression);
425
                VisitSub(accessExpression.right(), accessExpression);
426
        }
427

    
428
        @Override
429
        public void visit(BinaryOperator binaryOperator)
430
        {
431
                VisitSub(binaryOperator.left(), binaryOperator);
432
                VisitSub(binaryOperator.right(), binaryOperator);
433
        }
434

    
435
        @Override
436
        public void visit(TernaryOperator ternaryOperator)
437
        {
438
                VisitSub(ternaryOperator.left(), ternaryOperator);
439
                VisitSub(ternaryOperator.mid(), ternaryOperator);
440
                VisitSub(ternaryOperator.right(), ternaryOperator);
441
        }
442

    
443
        @Override
444
        public void visit(TupleMapAccessExpression tupleMapAccessExpression)
445
        {
446
                VisitSub(tupleMapAccessExpression.argument(), tupleMapAccessExpression);
447
                VisitSub(tupleMapAccessExpression.child(), tupleMapAccessExpression);
448
        }
449

    
450
        @Override
451
        public void visit(CallExpression callExpression)
452
        {
453
                if (callExpression.arguments() != null)
454
                        for (final Expression arg: callExpression.arguments())
455
                                VisitSub(arg, callExpression);
456
                VisitSub(callExpression.child(), callExpression);
457
        }
458

    
459
        @Override
460
        public void visit(ForallQuantifier quantifier)
461
        {
462
                for (final Identifier lvar: quantifier.symbols().symbolList())
463
                        VisitSub(lvar, quantifier);
464

    
465
                VisitSub(quantifier.child(), quantifier);
466
        }
467

    
468
        @Override
469
        public void visit(ExistsQuantifier quantifier)
470
        {
471
                for (final Identifier lvar: quantifier.symbols().symbolList())
472
                        VisitSub(lvar, quantifier);
473

    
474
                VisitSub(quantifier.child(), quantifier);
475
        }
476

    
477
        @Override
478
        public void visit(UnaryOperator unaryOperator)
479
        {
480
                VisitSub(unaryOperator.child(), unaryOperator);
481
                if (unaryOperator.kind() == ExpressionKind.Cast)
482
                        VisitSub(unaryOperator.type(), unaryOperator);
483
        }
484

    
485

    
486

    
487
        @Override
488
        public void visit(CharType charType)
489
        {
490
        }
491

    
492
        @Override
493
        public void visit(IntType intType)
494
        {
495
        }
496

    
497
        @Override
498
        public void visit(BoolType boolType)
499
        {
500
        }
501

    
502
        @Override
503
        public void visit(FloatType floatType)
504
        {
505
        }
506

    
507
        @Override
508
        public void visit(MetaType metaType) {
509
                VisitSub(metaType.Type(), metaType);
510
        }
511

    
512
        @Override
513
        public void visit(EnumType enumType)
514
        {
515
                for (final Identifier sym: enumType.listOfEnumSymbols())
516
                        VisitSub(sym, enumType);
517
        }
518

    
519
        @Override
520
        public void visit(ListType listType)
521
        {
522
                VisitSub(listType.innerType(), listType);
523
        }
524

    
525
        @Override
526
        public void visit(MapType mapType)
527
        {
528
                VisitSub(mapType.fromType(), mapType);
529
                VisitSub(mapType.toType(), mapType);
530
        }
531

    
532
        @Override
533
        public void visit(TupleType tupleType)
534
        {
535
                for (final Type t: tupleType.innerTypes())
536
                        VisitSub(t, tupleType);
537
        }
538

    
539
        @Override
540
        public void visit(FunctionType functionType)
541
        {
542
                for (final Type a: functionType.parameter())
543
                        VisitSub(a, functionType);
544
                VisitSub(functionType.returnType(), functionType);
545
        }
546

    
547
        @Override
548
        public void visit(OoActionSystemType ooActionSystemType)
549
        {
550
                for (final Identifier s: ooActionSystemType.symbols().symbolList())
551
                        VisitSub(s, ooActionSystemType);
552

    
553
                VisitSub(ooActionSystemType.doOdBlock(), ooActionSystemType);
554
        }
555

    
556
        public @Override
557
        void visit(OpaqueType opaqueType)
558
        {
559
                VisitSub(opaqueType.resolvedType(), opaqueType);
560
        }
561

    
562
        @Override
563
        public void visit(NullType nullType)
564
        { }
565

    
566
        @Override
567
        public void visit(AnyType anyType)
568
        { }
569

    
570
        @Override
571
        public void visit(ObjectConstructor objectConstructor)
572
        {
573
                VisitSub(objectConstructor.type(), objectConstructor);
574
        }
575
}
576