Project

General

Profile

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

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.QValConstructor;
46
import org.momut.ooas.ast.expressions.SetConstructor;
47
import org.momut.ooas.ast.expressions.TernaryOperator;
48
import org.momut.ooas.ast.expressions.TupleConstructor;
49
import org.momut.ooas.ast.expressions.TupleMapAccessExpression;
50
import org.momut.ooas.ast.expressions.TypeExpression;
51
import org.momut.ooas.ast.expressions.UnaryOperator;
52
import org.momut.ooas.ast.expressions.UnresolvedIdentifierExpression;
53
import org.momut.ooas.ast.expressions.ValueExpression;
54
import org.momut.ooas.ast.expressions.MapConstructor.MapItem;
55
import org.momut.ooas.ast.identifiers.AttributeIdentifier;
56
import org.momut.ooas.ast.identifiers.ConstantIdentifier;
57
import org.momut.ooas.ast.identifiers.EnumIdentifier;
58
import org.momut.ooas.ast.identifiers.ExpressionVariableIdentifier;
59
import org.momut.ooas.ast.identifiers.Identifier;
60
import org.momut.ooas.ast.identifiers.LandmarkIdentifier;
61
import org.momut.ooas.ast.identifiers.LocalVariableIdentifier;
62
import org.momut.ooas.ast.identifiers.MainModule;
63
import org.momut.ooas.ast.identifiers.MethodIdentifier;
64
import org.momut.ooas.ast.identifiers.Module;
65
import org.momut.ooas.ast.identifiers.NamedActionIdentifier;
66
import org.momut.ooas.ast.identifiers.NondetIdentifierList;
67
import org.momut.ooas.ast.identifiers.ParameterIdentifier;
68
import org.momut.ooas.ast.identifiers.PrioIdentifierList;
69
import org.momut.ooas.ast.identifiers.SelfTypeIdentifier;
70
import org.momut.ooas.ast.identifiers.SeqIdentifierList;
71
import org.momut.ooas.ast.identifiers.TypeIdentifier;
72
import org.momut.ooas.ast.identifiers.UnspecIdentifierList;
73
import org.momut.ooas.ast.statements.AbortStatement;
74
import org.momut.ooas.ast.statements.Assignment;
75
import org.momut.ooas.ast.statements.BreakStatement;
76
import org.momut.ooas.ast.statements.Call;
77
import org.momut.ooas.ast.statements.GuardedCommand;
78
import org.momut.ooas.ast.statements.KillStatement;
79
import org.momut.ooas.ast.statements.NondetBlock;
80
import org.momut.ooas.ast.statements.PrioBlock;
81
import org.momut.ooas.ast.statements.QualitativeConstraintStatement;
82
import org.momut.ooas.ast.statements.SeqBlock;
83
import org.momut.ooas.ast.statements.SkipStatement;
84
import org.momut.ooas.ast.statements.Statement;
85
import org.momut.ooas.ast.types.AnyType;
86
import org.momut.ooas.ast.types.BoolType;
87
import org.momut.ooas.ast.types.CharType;
88
import org.momut.ooas.ast.types.EnumType;
89
import org.momut.ooas.ast.types.FloatType;
90
import org.momut.ooas.ast.types.FunctionType;
91
import org.momut.ooas.ast.types.IntType;
92
import org.momut.ooas.ast.types.ListType;
93
import org.momut.ooas.ast.types.MapType;
94
import org.momut.ooas.ast.types.NullType;
95
import org.momut.ooas.ast.types.OoActionSystemType;
96
import org.momut.ooas.ast.types.OpaqueType;
97
import org.momut.ooas.ast.types.QrType;
98
import org.momut.ooas.ast.types.TupleType;
99
import org.momut.ooas.ast.types.UlyssesType;
100
import org.momut.ooas.parser.ParserState;
101

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

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

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

    
130
        public OoaCompleteAstTraversalVisitor(ParserState aState)
131
        {
132
                m_ParserState = aState;
133
        }
134

    
135
        public OoaCompleteAstTraversalVisitor(ParserState aState, boolean completeTraversal)
136
        {
137
                this(aState);
138
                m_DuplicateVisit = completeTraversal;
139
        }
140

    
141
        @Override
142
        public String returnVisitorName()
143
        {
144
                return this.getClass().getSimpleName();
145
        }
146

    
147
        @Override
148
        public void done() {
149
        }
150

    
151
        @Override
152
        public /*override*/ String toString()
153
        {
154
                return returnVisitorName();
155
        }
156

    
157
        @Override
158
        public /*virtual*/ void visit(EnumIdentifier enumIdentifier)
159
        {
160
                VisitSub(enumIdentifier.type(), enumIdentifier);
161
        }
162

    
163
        @Override
164
        public /*virtual*/ void visit(ConstantIdentifier constantIdentifier)
165
        {
166
                if (constantIdentifier.type() != null)
167
                        VisitSub(constantIdentifier.type(), constantIdentifier);
168
                VisitSub(constantIdentifier.Value(), constantIdentifier);
169
        }
170

    
171

    
172
        @Override
173
        public /*virtual*/ void visit(LandmarkIdentifier landmarkIdentifier)
174
        {
175
                VisitSub(landmarkIdentifier.type(), landmarkIdentifier);
176
        }
177

    
178
        @Override
179
        public /*virtual*/ void visit(AttributeIdentifier attributeIdentifier)
180
        {
181
                VisitSub(attributeIdentifier.type(), attributeIdentifier);
182
                VisitSub(attributeIdentifier.initializer(), attributeIdentifier);
183
        }
184

    
185
        @Override
186
        public /*virtual*/ void visit(ExpressionVariableIdentifier expressionVariableIdentifier)
187
        {
188
                VisitSub(expressionVariableIdentifier.type(), expressionVariableIdentifier);
189
        }
190

    
191
        @Override
192
        public /*virtual*/ void visit(ParameterIdentifier parameterIdentifier)
193
        {
194
                VisitSub(parameterIdentifier.type(), parameterIdentifier);
195
        }
196

    
197
        @Override
198
        public /*virtual*/ void visit(LocalVariableIdentifier localVariableIdentifier)
199
        {
200
                VisitSub(localVariableIdentifier.type(), localVariableIdentifier);
201
        }
202

    
203
        @Override
204
        public /*virtual*/ void visit(TypeIdentifier typeIdentifier)
205
        {
206
                VisitSub(typeIdentifier.type(), typeIdentifier);
207
        }
208

    
209
        @Override
210
        public /*virtual*/ void visit(SelfTypeIdentifier aself)
211
        {
212
                visit((TypeIdentifier)aself);
213
        }
214

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

    
226
        @Override
227
        public /*virtual*/ void visit(NamedActionIdentifier namedActionIdentifier)
228
        {
229
                VisitSub(namedActionIdentifier.type(), namedActionIdentifier);
230
                for (final Identifier sym : namedActionIdentifier.symbolTable().symbolList())
231
                        VisitSub(sym, namedActionIdentifier);
232
                for (final ParameterIdentifier par: namedActionIdentifier.parameter())
233
                        VisitSub(par, namedActionIdentifier);
234
                VisitSub(namedActionIdentifier.body(), namedActionIdentifier);
235
        }
236

    
237
        @Override
238
        public /*virtual*/ void visit(MainModule mainModule)
239
        {
240
                for (final Identifier sym: mainModule.symbolTable().symbolList())
241
                        VisitSub(sym, mainModule);
242
                final boolean haveInstance = mainModule.instance() != null;
243
                if (haveInstance)
244
                        VisitSub(mainModule.instance(), mainModule);
245
                else
246
                        VisitSub(mainModule.systemDescription(), mainModule);
247
        }
248

    
249
        @Override
250
        public /*virtual*/ void visit(Module module)
251
        {
252
                for (final Identifier sym: module.symbolTable().symbolList())
253
                        VisitSub(sym, module);
254
        }
255

    
256
        @Override
257
        public /*virtual*/ void visit(NondetIdentifierList nondetIdentifierList)
258
        {
259
                for (final Identifier id: nondetIdentifierList.identifiers())
260
                        VisitSub(id, nondetIdentifierList);
261
        }
262

    
263
        @Override
264
        public /*virtual*/ void visit(SeqIdentifierList seqIdentifierList)
265
        {
266
                for (final Identifier id: seqIdentifierList.identifiers())
267
                        VisitSub(id, seqIdentifierList);
268
        }
269

    
270
        @Override
271
        public /*virtual*/ void visit(PrioIdentifierList prioIdentifierList)
272
        {
273
                for (final Identifier id: prioIdentifierList.identifiers())
274
                        VisitSub(id, prioIdentifierList);
275
        }
276

    
277
        @Override
278
        public /*virtual*/ void visit(UnspecIdentifierList unspecIdentifierList)
279
        {
280
                for (final Identifier id: unspecIdentifierList.identifiers())
281
                        VisitSub(id, unspecIdentifierList);
282
        }
283

    
284
        @Override
285
        public /*virtual*/ void visit(NondetBlock nondetBlock)
286
        {
287
                for (final Identifier id: nondetBlock.symbols().symbolList())
288
                        VisitSub(id, nondetBlock);
289

    
290
                for (final Statement stmnt: nondetBlock.statements())
291
                        VisitSub(stmnt, nondetBlock);
292
        }
293

    
294
        @Override
295
        public /*virtual*/ void visit(SeqBlock seqBlock)
296
        {
297
                for (final Identifier id: seqBlock.symbols().symbolList())
298
                        VisitSub(id, seqBlock);
299

    
300
                if (seqBlock.filter() != null)
301
                        VisitSub(seqBlock.filter(), seqBlock);
302

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

    
307
        @Override
308
        public /*virtual*/ void visit(PrioBlock prioBlock)
309
        {
310
                for (final Identifier id: prioBlock.symbols().symbolList())
311
                        VisitSub(id, prioBlock);
312

    
313
                for (final Statement stmnt: prioBlock.statements())
314
                        VisitSub(stmnt, prioBlock);
315
        }
316

    
317
        @Override
318
        public /*virtual*/ void visit(GuardedCommand guardedCommand)
319
        {
320
                VisitSub(guardedCommand.guard(), guardedCommand);
321
                VisitSub(guardedCommand.body(), guardedCommand);
322
        }
323

    
324
        @Override
325
        public /*virtual*/ void visit(Assignment assignment)
326
        {
327
                for (final Expression vexp: assignment.places())
328
                        VisitSub(vexp, assignment);
329
                for (final Expression expr: assignment.values())
330
                        VisitSub(expr, assignment);
331

    
332
                VisitSub(assignment.nondetExpression(), assignment);
333
        }
334

    
335
        @Override
336
        public /*virtual*/ void visit(Call call)
337
        {
338
                VisitSub(call.callExpression(), call);
339
        }
340

    
341
        @Override
342
        public /*virtual*/ void visit(SkipStatement skipStatement)
343
        { }
344

    
345
        @Override
346
        public void visit(BreakStatement breakStatement)
347
        { }
348

    
349
        @Override
350
        public /*virtual*/ void visit(AbortStatement abortStatement)
351
        { }
352

    
353
        @Override
354
        public /*virtual*/ void visit(KillStatement killStatement)
355
        {
356
                VisitSub(killStatement.someOne, killStatement);
357
        }
358

    
359
        @Override
360
        public /*virtual*/ <T>void visit(ValueExpression<T> valueExpression)
361
        { }
362

    
363
        @Override
364
        public /*virtual*/ void visit(UnresolvedIdentifierExpression unresolvedIdentifierExpression)
365
        {
366
                VisitSub(unresolvedIdentifierExpression.type(), unresolvedIdentifierExpression);
367
        }
368

    
369
        @Override
370
        public /*virtual*/ void visit(IdentifierExpression identifierExpression)
371
        {
372
                VisitSub(identifierExpression.type(), identifierExpression);
373
                VisitSub(identifierExpression.identifier(), identifierExpression);
374
        }
375

    
376
        @Override
377
        public /*virtual*/ void visit(TypeExpression typeExpression)
378
        {
379
                VisitSub(typeExpression.type(), typeExpression);
380
        }
381

    
382
        @Override
383
        public /*virtual*/ void visit(ListConstructor listConstructor)
384
        {
385
                for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList())
386
                        VisitSub(lvar, listConstructor);
387

    
388
                for (final Expression elems: listConstructor.elements())
389
                        VisitSub(elems, listConstructor);
390

    
391
                if (listConstructor.comprehension() != null)
392
                        VisitSub(listConstructor.comprehension(), listConstructor);
393
        }
394

    
395
        @Override
396
        public /*virtual*/ void visit(SetConstructor setConstructor)
397
        {
398
                for (final Identifier svar: setConstructor.comprehensionVariables().symbolList())
399
                        VisitSub(svar, setConstructor);
400

    
401
                for (final Expression elems: setConstructor.items())
402
                        VisitSub(elems, setConstructor);
403

    
404
                VisitSub(setConstructor.comprehension(), setConstructor);
405
        }
406

    
407
        @Override
408
        public /*virtual*/ void visit(MapConstructor mapConstructor)
409
        {
410
                /*foreach (var lvar in mapConstructor.localVariables.symbolList)
411
                        VisitSub(lvar, mapConstructor);*/
412

    
413
                for (final MapItem elem: mapConstructor.items())
414
                {
415
                        VisitSub(elem.key, mapConstructor);
416
                        VisitSub(elem.value, mapConstructor);
417
                }
418
        }
419

    
420
        @Override
421
        public /*virtual*/ void visit(TupleConstructor tupleConstructor)
422
        {
423
                /*foreach (var lvar in tupleConstructor.localVariables.symbolList)
424
                        VisitSub(lvar, tupleConstructor);*/
425

    
426
                for (final Expression elem: tupleConstructor.values())
427
                        VisitSub(elem, tupleConstructor);
428
        }
429

    
430
        @Override
431
        public /*virtual*/ void visit(AccessExpression accessExpression)
432
        {
433
                VisitSub(accessExpression.left(), accessExpression);
434
                VisitSub(accessExpression.right(), accessExpression);
435
        }
436

    
437
        @Override
438
        public /*virtual*/ void visit(BinaryOperator binaryOperator)
439
        {
440
                VisitSub(binaryOperator.left(), binaryOperator);
441
                VisitSub(binaryOperator.right(), binaryOperator);
442
        }
443

    
444
        @Override
445
        public /*virtual*/ void visit(TernaryOperator ternaryOperator)
446
        {
447
                VisitSub(ternaryOperator.left(), ternaryOperator);
448
                VisitSub(ternaryOperator.mid(), ternaryOperator);
449
                VisitSub(ternaryOperator.right(), ternaryOperator);
450
        }
451

    
452
        @Override
453
        public /*virtual*/ void visit(TupleMapAccessExpression tupleMapAccessExpression)
454
        {
455
                VisitSub(tupleMapAccessExpression.argument(), tupleMapAccessExpression);
456
                VisitSub(tupleMapAccessExpression.child(), tupleMapAccessExpression);
457
        }
458

    
459
        @Override
460
        public /*virtual*/ void visit(CallExpression callExpression)
461
        {
462
                if (callExpression.arguments() != null)
463
                        for (final Expression arg: callExpression.arguments())
464
                                VisitSub(arg, callExpression);
465
                VisitSub(callExpression.child(), callExpression);
466
        }
467

    
468
        @Override
469
        public /*virtual*/ void visit(ForallQuantifier 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 /*virtual*/ void visit(ExistsQuantifier quantifier)
479
        {
480
                for (final Identifier lvar: quantifier.symbols().symbolList())
481
                        VisitSub(lvar, quantifier);
482

    
483
                VisitSub(quantifier.child(), quantifier);
484
        }
485

    
486
        @Override
487
        public /*virtual*/ void visit(UnaryOperator unaryOperator)
488
        {
489
                VisitSub(unaryOperator.child(), unaryOperator);
490
                if (unaryOperator.kind() == ExpressionKind.Cast)
491
                        VisitSub(unaryOperator.type(), unaryOperator);
492
        }
493

    
494

    
495

    
496
        @Override
497
        public /*virtual*/ void visit(CharType charType)
498
        {
499
        }
500

    
501
        @Override
502
        public /*virtual*/ void visit(IntType intType)
503
        {
504
        }
505

    
506
        @Override
507
        public /*virtual*/ void visit(BoolType boolType)
508
        {
509
        }
510

    
511
        @Override
512
        public /*virtual*/ void visit(FloatType floatType)
513
        {
514
        }
515

    
516
        @Override
517
        public /*virtual*/ void visit(EnumType enumType)
518
        {
519
                for (final Identifier sym: enumType.listOfEnumSymbols())
520
                        VisitSub(sym, enumType);
521
        }
522

    
523
        @Override
524
        public /*virtual*/ void visit(ListType listType)
525
        {
526
                VisitSub(listType.innerType(), listType);
527
        }
528

    
529
        @Override
530
        public /*virtual*/ void visit(MapType mapType)
531
        {
532
                VisitSub(mapType.fromType(), mapType);
533
                VisitSub(mapType.toType(), mapType);
534
        }
535

    
536
        @Override
537
        public /*virtual*/ void visit(QrType qrType)
538
        {
539
                for (final Identifier m: qrType.landmarks())
540
                        VisitSub(m, qrType);
541
        }
542

    
543
        @Override
544
        public /*virtual*/ void visit(TupleType tupleType)
545
        {
546
                for (final UlyssesType t: tupleType.innerTypes())
547
                        VisitSub(t, tupleType);
548
        }
549

    
550
        @Override
551
        public /*virtual*/ void visit(FunctionType functionType)
552
        {
553
                for (final UlyssesType a: functionType.parameter())
554
                        VisitSub(a, functionType);
555
                VisitSub(functionType.returnType(), functionType);
556
        }
557

    
558
        @Override
559
        public /*virtual*/ void visit(OoActionSystemType ooActionSystemType)
560
        {
561
                for (final Identifier s: ooActionSystemType.symbols().symbolList())
562
                        VisitSub(s, ooActionSystemType);
563

    
564
                VisitSub(ooActionSystemType.doOdBlock(), ooActionSystemType);
565
        }
566

    
567
        public /*virtual*/ @Override
568
        void visit(OpaqueType opaqueType)
569
        {
570
                VisitSub(opaqueType.resolvedType(), opaqueType);
571
        }
572

    
573
        @Override
574
        public /*virtual*/ void visit(NullType nullType)
575
        { }
576

    
577
        @Override
578
        public /*virtual*/ void visit(AnyType anyType)
579
        { }
580

    
581
        @Override
582
        public /*virtual*/ void visit(ObjectConstructor objectConstructor)
583
        {
584
                VisitSub(objectConstructor.type(), objectConstructor);
585
        }
586

    
587
        @Override
588
        public /*virtual*/ void visit(QValConstructor qValConstructor)
589
        {
590
        }
591

    
592
        @Override
593
        public /*virtual*/ void visit(QualitativeConstraintStatement qalitativeConstraintStatement)
594
        {
595
                VisitSub(qalitativeConstraintStatement.variable0(), qalitativeConstraintStatement);
596
                VisitSub(qalitativeConstraintStatement.variable1(), qalitativeConstraintStatement);
597
                if (qalitativeConstraintStatement.variable2() != null)
598
                        VisitSub(qalitativeConstraintStatement.variable2(), qalitativeConstraintStatement);
599
        }
600
}
601