Project

General

Profile

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

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.NullType;
92
import org.momut.ooas.ast.types.OoActionSystemType;
93
import org.momut.ooas.ast.types.OpaqueType;
94
import org.momut.ooas.ast.types.TupleType;
95
import org.momut.ooas.ast.types.Type;
96
import org.momut.ooas.parser.ParserState;
97

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
377
                for (final Expression elems: listConstructor.elements())
378
                        VisitSub(elems, listConstructor);
379

    
380
                if (listConstructor.comprehension() != null)
381
                        VisitSub(listConstructor.comprehension(), listConstructor);
382
        }
383

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

    
390
                for (final Expression elems: setConstructor.items())
391
                        VisitSub(elems, setConstructor);
392

    
393
                VisitSub(setConstructor.comprehension(), setConstructor);
394
        }
395

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

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

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

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

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

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

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

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

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

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

    
463
                VisitSub(quantifier.child(), quantifier);
464
        }
465

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

    
472
                VisitSub(quantifier.child(), quantifier);
473
        }
474

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

    
483

    
484

    
485
        @Override
486
        public void visit(CharType charType)
487
        {
488
        }
489

    
490
        @Override
491
        public void visit(IntType intType)
492
        {
493
        }
494

    
495
        @Override
496
        public void visit(BoolType boolType)
497
        {
498
        }
499

    
500
        @Override
501
        public void visit(FloatType floatType)
502
        {
503
        }
504

    
505
        @Override
506
        public void visit(EnumType enumType)
507
        {
508
                for (final Identifier sym: enumType.listOfEnumSymbols())
509
                        VisitSub(sym, enumType);
510
        }
511

    
512
        @Override
513
        public void visit(ListType listType)
514
        {
515
                VisitSub(listType.innerType(), listType);
516
        }
517

    
518
        @Override
519
        public void visit(MapType mapType)
520
        {
521
                VisitSub(mapType.fromType(), mapType);
522
                VisitSub(mapType.toType(), mapType);
523
        }
524

    
525
        @Override
526
        public void visit(TupleType tupleType)
527
        {
528
                for (final Type t: tupleType.innerTypes())
529
                        VisitSub(t, tupleType);
530
        }
531

    
532
        @Override
533
        public void visit(FunctionType functionType)
534
        {
535
                for (final Type a: functionType.parameter())
536
                        VisitSub(a, functionType);
537
                VisitSub(functionType.returnType(), functionType);
538
        }
539

    
540
        @Override
541
        public void visit(OoActionSystemType ooActionSystemType)
542
        {
543
                for (final Identifier s: ooActionSystemType.symbols().symbolList())
544
                        VisitSub(s, ooActionSystemType);
545

    
546
                VisitSub(ooActionSystemType.doOdBlock(), ooActionSystemType);
547
        }
548

    
549
        public @Override
550
        void visit(OpaqueType opaqueType)
551
        {
552
                VisitSub(opaqueType.resolvedType(), opaqueType);
553
        }
554

    
555
        @Override
556
        public void visit(NullType nullType)
557
        { }
558

    
559
        @Override
560
        public void visit(AnyType anyType)
561
        { }
562

    
563
        @Override
564
        public void visit(ObjectConstructor objectConstructor)
565
        {
566
                VisitSub(objectConstructor.type(), objectConstructor);
567
        }
568
}
569