1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
17
|
|
18
|
|
19
|
|
20
|
|
21
|
|
22
|
|
23
|
|
24
|
|
25
|
|
26
|
|
27
|
|
28
|
|
29
|
|
30
|
|
31
|
|
32
|
#include "CompleteAstTraversalVisitor.hpp"
|
33
|
#include <ast/identifiers/EnumIdentifier.hpp>
|
34
|
#include <ast/identifiers/AttributeIdentifier.hpp>
|
35
|
#include <ast/identifiers/ExpressionVariableIdentifier.hpp>
|
36
|
#include <ast/identifiers/MethodIdentifier.hpp>
|
37
|
#include <ast/identifiers/ConstantIdentifier.hpp>
|
38
|
#include <ast/identifiers/NamedActionIdentifier.hpp>
|
39
|
#include <ast/identifiers/MainModule.hpp>
|
40
|
#include <ast/identifiers/IdentifierBlock.hpp>
|
41
|
#include <ast/statements/NondetBlock.hpp>
|
42
|
#include <ast/statements/PrioBlock.hpp>
|
43
|
#include <ast/statements/SeqBlock.hpp>
|
44
|
#include <ast/statements/Assignment.hpp>
|
45
|
#include <ast/statements/GuardedCommand.hpp>
|
46
|
#include <ast/statements/Call.hpp>
|
47
|
#include <ast/expressions/IdentifierExpression.hpp>
|
48
|
#include <ast/expressions/TypeExpression.hpp>
|
49
|
#include <ast/expressions/ListConstructor.hpp>
|
50
|
#include <ast/expressions/SetConstructor.hpp>
|
51
|
#include <ast/expressions/TupleConstructor.hpp>
|
52
|
#include <ast/expressions/AccessExpression.hpp>
|
53
|
#include <ast/expressions/BinaryOperator.hpp>
|
54
|
#include <ast/expressions/TernaryOperator.hpp>
|
55
|
#include <ast/expressions/TupleMapAccessExpression.hpp>
|
56
|
#include <ast/expressions/CallExpression.hpp>
|
57
|
#include <ast/expressions/ForallQuantifier.hpp>
|
58
|
#include <ast/expressions/ExistsQuantifier.hpp>
|
59
|
#include <ast/expressions/UnaryOperator.hpp>
|
60
|
#include <ast/types/EnumType.hpp>
|
61
|
#include <ast/types/ListType.hpp>
|
62
|
#include <ast/types/TupleType.hpp>
|
63
|
#include <ast/types/FunctionType.hpp>
|
64
|
#include <ast/types/ActionSystemType.hpp>
|
65
|
#include <ast/expressions/ObjectConstructor.hpp>
|
66
|
|
67
|
|
68
|
namespace Ast {
|
69
|
|
70
|
CompleteAstTraversalVisitor::CompleteAstTraversalVisitor(CallContext* context, bool duplicateVisit):
|
71
|
m_visited(),
|
72
|
m_context(context),
|
73
|
m_DuplicateVisit(duplicateVisit)
|
74
|
{}
|
75
|
|
76
|
CompleteAstTraversalVisitor::~CompleteAstTraversalVisitor()
|
77
|
{}
|
78
|
|
79
|
|
80
|
void CompleteAstTraversalVisitor::visitSub(AstElement* subElement, AstElement* parent) {
|
81
|
if (subElement == nullptr)
|
82
|
return;
|
83
|
if (m_visited.count(subElement) > 0)
|
84
|
return;
|
85
|
if (!m_DuplicateVisit)
|
86
|
m_visited[subElement] = true;
|
87
|
visitAstElement(subElement, parent);
|
88
|
}
|
89
|
|
90
|
void CompleteAstTraversalVisitor::visitAstElement(AstElement* element, AstElement* parent){
|
91
|
switch (element->nodeType()) {
|
92
|
case AstNodeTypeEnum::type:
|
93
|
visitType(static_cast<Type*>(element), parent);
|
94
|
break;
|
95
|
case AstNodeTypeEnum::identifier:
|
96
|
visitIdentifier((Identifier*)element, parent);
|
97
|
break;
|
98
|
case AstNodeTypeEnum::expression:
|
99
|
visitExpression((Expression*)element, parent);
|
100
|
break;
|
101
|
case AstNodeTypeEnum::statement:
|
102
|
visitStatement((Statement*)element, parent);
|
103
|
break;
|
104
|
default:
|
105
|
m_context->logError("Internal error. Unknown AST type.");
|
106
|
abort();
|
107
|
}
|
108
|
}
|
109
|
|
110
|
|
111
|
void CompleteAstTraversalVisitor::visitType(Type* element, AstElement* ) {
|
112
|
element->accept(*this);
|
113
|
}
|
114
|
|
115
|
void CompleteAstTraversalVisitor::visitIdentifier(Identifier* element, AstElement* ) {
|
116
|
element->accept(*this);
|
117
|
}
|
118
|
|
119
|
void CompleteAstTraversalVisitor::visitExpression(Expression* element, AstElement* ) {
|
120
|
element->accept(*this);
|
121
|
}
|
122
|
|
123
|
void CompleteAstTraversalVisitor::visitStatement(Statement* element, AstElement* ) {
|
124
|
element->accept(*this);
|
125
|
}
|
126
|
|
127
|
void CompleteAstTraversalVisitor::visit(TypeIdentifier* typeIdentifier) {
|
128
|
visitSub(typeIdentifier->type(), typeIdentifier);
|
129
|
};
|
130
|
|
131
|
void CompleteAstTraversalVisitor::visit(EnumIdentifier* enumIdentifier) {
|
132
|
visitSub(enumIdentifier->type(), enumIdentifier);
|
133
|
};
|
134
|
|
135
|
|
136
|
|
137
|
void CompleteAstTraversalVisitor::visit(AttributeIdentifier* attributeIdentifier) {
|
138
|
visitSub(attributeIdentifier->type(), attributeIdentifier);
|
139
|
visitSub(attributeIdentifier->initializer(), attributeIdentifier);
|
140
|
};
|
141
|
|
142
|
void CompleteAstTraversalVisitor::visit(LocalVariableIdentifier* localVariableIdentifier) {
|
143
|
visitSub(localVariableIdentifier->type(), localVariableIdentifier);
|
144
|
};
|
145
|
|
146
|
void CompleteAstTraversalVisitor::visit(ParameterIdentifier* parameterIdentifier) {
|
147
|
visitSub(parameterIdentifier->type(), parameterIdentifier);
|
148
|
};
|
149
|
|
150
|
void CompleteAstTraversalVisitor::visit(ExpressionVariableIdentifier* expressionVariableIdentifier) {
|
151
|
visitSub(expressionVariableIdentifier->type(), expressionVariableIdentifier);
|
152
|
};
|
153
|
|
154
|
void CompleteAstTraversalVisitor::visit(MethodIdentifier* methodIdentifier) {
|
155
|
visitSub(methodIdentifier->type(), methodIdentifier);
|
156
|
for (auto& sym: *(methodIdentifier->symbolTable()))
|
157
|
visitSub(sym.second, methodIdentifier);
|
158
|
for (auto& par: methodIdentifier->parameter())
|
159
|
visitSub(par, methodIdentifier);
|
160
|
visitSub(methodIdentifier->body(), methodIdentifier);
|
161
|
};
|
162
|
|
163
|
void CompleteAstTraversalVisitor::visit(NamedActionIdentifier* namedActionIdentifier) {
|
164
|
visitSub(namedActionIdentifier->type(), namedActionIdentifier);
|
165
|
for (auto& sym : *namedActionIdentifier->symbolTable())
|
166
|
visitSub(sym.second, namedActionIdentifier);
|
167
|
for (auto& par: namedActionIdentifier->parameter())
|
168
|
visitSub(par, namedActionIdentifier);
|
169
|
visitSub(namedActionIdentifier->body(), namedActionIdentifier);
|
170
|
};
|
171
|
|
172
|
void CompleteAstTraversalVisitor::visit(Module* module) {
|
173
|
for (auto& sym: *module->symbolTable())
|
174
|
visitSub(sym.second, module);
|
175
|
};
|
176
|
|
177
|
void CompleteAstTraversalVisitor::visit(ConstantIdentifier* constantIdentifier) {
|
178
|
visitSub(constantIdentifier->type(), constantIdentifier);
|
179
|
visitSub(constantIdentifier->value(), constantIdentifier);
|
180
|
};
|
181
|
|
182
|
void CompleteAstTraversalVisitor::visit(UnspecIdentifierBlock* unspecIdentifierList) {
|
183
|
for (auto& id: unspecIdentifierList->identifiers())
|
184
|
visitSub(id, unspecIdentifierList);
|
185
|
};
|
186
|
|
187
|
void CompleteAstTraversalVisitor::visit(SeqIdentifierBlock* seqIdentifierList) {
|
188
|
for (auto& id: seqIdentifierList->identifiers())
|
189
|
visitSub(id, seqIdentifierList);
|
190
|
};
|
191
|
|
192
|
void CompleteAstTraversalVisitor::visit(NondetIdentifierBlock* nondetIdentifierList) {
|
193
|
for (auto& id: nondetIdentifierList->identifiers())
|
194
|
visitSub(id, nondetIdentifierList);
|
195
|
};
|
196
|
|
197
|
void CompleteAstTraversalVisitor::visit(PrioIdentifierBlock* prioIdentifierList) {
|
198
|
for (auto& id: prioIdentifierList->identifiers())
|
199
|
visitSub(id, prioIdentifierList);
|
200
|
};
|
201
|
|
202
|
void CompleteAstTraversalVisitor::visit(MainModule* mainModule) {
|
203
|
for (auto& sym: *mainModule->symbolTable())
|
204
|
visitSub(sym.second, mainModule);
|
205
|
visitSub(mainModule->systemDescription(), mainModule);
|
206
|
};
|
207
|
|
208
|
void CompleteAstTraversalVisitor::visit(IntType* ) {};
|
209
|
void CompleteAstTraversalVisitor::visit(BoolType* ) {};
|
210
|
|
211
|
void CompleteAstTraversalVisitor::visit(EnumType* enumType) {
|
212
|
for (auto& sym: enumType->listOfEnumSymbols())
|
213
|
visitSub(sym, enumType);
|
214
|
};
|
215
|
|
216
|
void CompleteAstTraversalVisitor::visit(ListType* listType) {
|
217
|
visitSub(listType->innerType(), listType);
|
218
|
};
|
219
|
|
220
|
void CompleteAstTraversalVisitor::visit(TupleType* tupleType) {
|
221
|
for (auto& t: tupleType->innerTypes())
|
222
|
visitSub(t, tupleType);
|
223
|
};
|
224
|
|
225
|
void CompleteAstTraversalVisitor::visit(NullType* ) {};
|
226
|
|
227
|
void CompleteAstTraversalVisitor::visit(FunctionType* functionType) {
|
228
|
for (auto& a: functionType->parameter())
|
229
|
visitSub(a, functionType);
|
230
|
visitSub(functionType->returnType(), functionType);
|
231
|
};
|
232
|
|
233
|
void CompleteAstTraversalVisitor::visit(ActionSystemType* actionSystemType) {
|
234
|
for (auto& s: *actionSystemType->symbols())
|
235
|
visitSub(s.second, actionSystemType);
|
236
|
|
237
|
visitSub(actionSystemType->doodBlock(), actionSystemType);
|
238
|
};
|
239
|
|
240
|
void CompleteAstTraversalVisitor::visit(GuardedCommand* guardedCommand) {
|
241
|
visitSub(guardedCommand->guard(), guardedCommand);
|
242
|
visitSub(guardedCommand->body(), guardedCommand);
|
243
|
};
|
244
|
|
245
|
void CompleteAstTraversalVisitor::visit(Call* call) {
|
246
|
visitSub(call->callExpression(), call);
|
247
|
};
|
248
|
|
249
|
void CompleteAstTraversalVisitor::visit(Assignment* assignment) {
|
250
|
for (auto& vexp: assignment->places())
|
251
|
visitSub(vexp, assignment);
|
252
|
for (auto& expr: assignment->values())
|
253
|
visitSub(expr, assignment);
|
254
|
|
255
|
visitSub(assignment->nondetExpression(), assignment);
|
256
|
};
|
257
|
|
258
|
void CompleteAstTraversalVisitor::visit(SeqBlock* seqBlock) {
|
259
|
for (auto& id: *seqBlock->symbols())
|
260
|
visitSub(id.second, seqBlock);
|
261
|
|
262
|
if (seqBlock->filter() != nullptr)
|
263
|
visitSub(seqBlock->filter(), seqBlock);
|
264
|
|
265
|
for (auto& stmnt: seqBlock->statements())
|
266
|
visitSub(stmnt, seqBlock);
|
267
|
};
|
268
|
|
269
|
void CompleteAstTraversalVisitor::visit(NondetBlock* nondetBlock) {
|
270
|
for (auto& id: *nondetBlock->symbols())
|
271
|
visitSub(id.second, nondetBlock);
|
272
|
|
273
|
for (auto& stmnt: nondetBlock->statements())
|
274
|
visitSub(stmnt, nondetBlock);
|
275
|
};
|
276
|
|
277
|
void CompleteAstTraversalVisitor::visit(PrioBlock* prioBlock) {
|
278
|
for (auto& id: *prioBlock->symbols())
|
279
|
visitSub(id.second, prioBlock);
|
280
|
|
281
|
for (auto& stmnt: prioBlock->statements())
|
282
|
visitSub(stmnt, prioBlock);
|
283
|
};
|
284
|
|
285
|
void CompleteAstTraversalVisitor::visit(Skip* ) {};
|
286
|
void CompleteAstTraversalVisitor::visit(Break* ) {};
|
287
|
void CompleteAstTraversalVisitor::visit(Abort* ) {};
|
288
|
|
289
|
void CompleteAstTraversalVisitor::visit(TernaryOperator* ternaryOperator) {
|
290
|
visitSub(ternaryOperator->left(), ternaryOperator);
|
291
|
visitSub(ternaryOperator->mid(), ternaryOperator);
|
292
|
visitSub(ternaryOperator->right(), ternaryOperator);
|
293
|
};
|
294
|
|
295
|
void CompleteAstTraversalVisitor::visit(BinaryOperator* binaryOperator) {
|
296
|
visitSub(binaryOperator->left(), binaryOperator);
|
297
|
visitSub(binaryOperator->right(), binaryOperator);
|
298
|
};
|
299
|
|
300
|
void CompleteAstTraversalVisitor::visit(UnaryOperator* unaryOperator) {
|
301
|
visitSub(unaryOperator->child(), unaryOperator);
|
302
|
if (unaryOperator->kind() == ExpressionKind::Cast)
|
303
|
visitSub(unaryOperator->type(), unaryOperator);
|
304
|
};
|
305
|
|
306
|
void CompleteAstTraversalVisitor::visit(ExistsQuantifier* quantifier) {
|
307
|
for (auto& lvar: *quantifier->symbols())
|
308
|
visitSub(lvar.second, quantifier);
|
309
|
|
310
|
visitSub(quantifier->child(), quantifier);
|
311
|
};
|
312
|
|
313
|
void CompleteAstTraversalVisitor::visit(ForallQuantifier* quantifier) {
|
314
|
for (auto& lvar: *quantifier->symbols())
|
315
|
visitSub(lvar.second, quantifier);
|
316
|
|
317
|
visitSub(quantifier->child(), quantifier);
|
318
|
};
|
319
|
|
320
|
void CompleteAstTraversalVisitor::visit(ListConstructor* listConstructor) {
|
321
|
for (auto& lvar: *listConstructor->comprehensionVariables())
|
322
|
visitSub(lvar.second, listConstructor);
|
323
|
|
324
|
for (auto& elems: listConstructor->elements())
|
325
|
visitSub(elems, listConstructor);
|
326
|
|
327
|
visitSub(listConstructor->comprehension(), listConstructor);
|
328
|
};
|
329
|
|
330
|
void CompleteAstTraversalVisitor::visit(SetConstructor* setConstructor) {
|
331
|
for (auto& svar: *setConstructor->comprehensionVariables())
|
332
|
visitSub(svar.second, setConstructor);
|
333
|
|
334
|
for (auto& elems: setConstructor->items())
|
335
|
visitSub(elems, setConstructor);
|
336
|
|
337
|
visitSub(setConstructor->comprehension(), setConstructor);
|
338
|
};
|
339
|
|
340
|
void CompleteAstTraversalVisitor::visit(TupleConstructor* tupleConstructor) {
|
341
|
for (auto& elem: tupleConstructor->values())
|
342
|
visitSub(elem, tupleConstructor);
|
343
|
};
|
344
|
|
345
|
void CompleteAstTraversalVisitor::visit(ObjectConstructor* objectConstructor) {
|
346
|
visitSub(objectConstructor->type(), objectConstructor);
|
347
|
};
|
348
|
|
349
|
void CompleteAstTraversalVisitor::visit(BoolValueExpression* ) {};
|
350
|
void CompleteAstTraversalVisitor::visit(IntValueExpression* ) {};
|
351
|
void CompleteAstTraversalVisitor::visit(RefValueExpression* ) {};
|
352
|
|
353
|
void CompleteAstTraversalVisitor::visit(IdentifierExpression* identifierExpression) {
|
354
|
visitSub(identifierExpression->type(), identifierExpression);
|
355
|
visitSub(identifierExpression->identifier(), identifierExpression);
|
356
|
};
|
357
|
|
358
|
void CompleteAstTraversalVisitor::visit(TypeExpression* typeExpression) {
|
359
|
visitSub(typeExpression->type(), typeExpression);
|
360
|
};
|
361
|
|
362
|
void CompleteAstTraversalVisitor::visit(TupleMapAccessExpression* tupleMapAccessExpression) {
|
363
|
visitSub(tupleMapAccessExpression->argument(), tupleMapAccessExpression);
|
364
|
visitSub(tupleMapAccessExpression->child(), tupleMapAccessExpression);
|
365
|
};
|
366
|
|
367
|
void CompleteAstTraversalVisitor::visit(CallExpression* callExpression) {
|
368
|
for (auto& arg: callExpression->arguments())
|
369
|
visitSub(arg, callExpression);
|
370
|
visitSub(callExpression->child(), callExpression);
|
371
|
};
|
372
|
|
373
|
void CompleteAstTraversalVisitor::visit(AccessExpression* accessExpression) {
|
374
|
visitSub(accessExpression->left(), accessExpression);
|
375
|
visitSub(accessExpression->right(), accessExpression);
|
376
|
};
|
377
|
|
378
|
void CompleteAstTraversalVisitor::visit(PointerType* ) {
|
379
|
|
380
|
}
|
381
|
|
382
|
}
|