Project

General

Profile

root / trunk / compiler / ooasCompiler / src / org / momut / ooas / codegen / ast / OoaAstEmitter.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.codegen.ast;
29

    
30
import java.util.HashSet;
31
import java.util.IdentityHashMap;
32

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

    
108
public class OoaAstEmitter<T> implements IAstVisitor {
109

    
110

    
111
        final IAstDuplicator<T> m_copier;
112
        final ParserState m_state;
113
        protected HashSet<Object> m_visited = new HashSet<Object>();
114
        final IdentityHashMap<Identifier,T> m_convertedIdentifiers;
115
        final IdentityHashMap<Type,T> m_convertedTypes;
116
        final IdentityHashMap<Expression,T> m_convertedExpressions;
117
        final IdentityHashMap<Statement,T> m_convertedStatements;
118
        final IdentityHashMap<IScope,T> m_convertedScopes;
119
        final IdentityHashMap<OoActionSystemInstance, T> m_convertedInstances;
120

    
121
        public OoaAstEmitter(ParserState aState, IAstDuplicator<T> copier) {
122
                m_copier = copier;
123
                m_state = aState;
124
                m_convertedIdentifiers = new IdentityHashMap<>();
125
                m_convertedTypes = new IdentityHashMap<>();
126
                m_convertedExpressions = new IdentityHashMap<>();
127
                m_convertedStatements = new IdentityHashMap<>();
128
                m_convertedScopes = new IdentityHashMap<>();
129
                m_convertedInstances = new IdentityHashMap<>();
130
        }
131

    
132
        @Override
133
        public String returnVisitorName() {
134
                return this.getClass().getName();
135
        }
136

    
137
        @Override
138
        public void done() {
139
        }
140

    
141
        protected final void VisitSub(IAst subElement, IAst parent)
142
        {
143
                if (subElement == null || m_visited.contains(subElement))
144
                        return;
145
                m_visited.add(subElement);
146
                subElement.Accept(this);
147
        }
148

    
149
        /**
150
         * Tells the underlying IAstDuplicator to create an
151
         * identifier T. Also checks for duplicate instantiations
152
         * @param id Identifier to map
153
         * @return some opaque T
154
         */
155
        private final T createIdentifier(Identifier id) {
156
                IdentifierKind kind = id.kind();
157
                if (id instanceof MainModule)
158
                        kind = IdentifierKind.MainModule;
159
                final int subOrd =  (id instanceof IdentifierList)
160
                                ? ((IdentifierList)id).listType().integerValue
161
                                : 0;
162
                final T result = m_copier.createIdentifier(kind, subOrd);
163
                if (m_convertedIdentifiers.put(id, result) != null)
164
                        throw new OoasCompilerRuntimeException("Identifier %s already has been copied.", id.toString());
165
                if (id instanceof IScope) {
166
                        if (m_convertedScopes.put((IScope)id, m_copier.castToIScope(result)) != null)
167
                                throw new OoasCompilerRuntimeException("Scope %s already has been copied.", id.toString());
168
                }
169
                return result;
170
        }
171

    
172
        private final T createType(Type type) {
173
                TypeKind kind = type.kind();
174
                if (type instanceof ValuedEnumType)
175
                        kind = TypeKind.ValuedEnumeratedType;
176
                final T result = m_copier.createType(kind);
177
                if (m_convertedTypes.put(type, result) != null)
178
                        throw new OoasCompilerRuntimeException("Type %s already has been copied.", type.toString());
179
                if (type instanceof IScope) {
180
                        if (m_convertedScopes.put((IScope)type, m_copier.castToIScope(result)) != null)
181
                                throw new OoasCompilerRuntimeException("Scope %s already has been copied.", type.toString());
182
                }
183
                return result;
184
        }
185

    
186
        private final T createExpression(Expression expression) {
187
                final int subOrd =  (expression instanceof LeafExpression)
188
                                ? ((LeafExpression)expression).valueType().integerValue
189
                                : 0;
190
                final T result = m_copier.createExpression(expression.kind(), subOrd);
191
                if (m_convertedExpressions.put(expression, result) != null)
192
                        throw new OoasCompilerRuntimeException("Expression %s already has been copied.", expression.toString());
193
                if (expression instanceof IScope) {
194
                        if (m_convertedScopes.put((IScope)expression, m_copier.castToIScope(result)) != null)
195
                                throw new OoasCompilerRuntimeException("Scope %s already has been copied.", expression.toString());
196
                }
197
                return result;
198
        }
199

    
200
        private final T createStatement(Statement statement) {
201
                final T result = m_copier.createStatement(statement.kind());
202
                if (m_convertedStatements.put(statement, result) != null)
203
                        throw new OoasCompilerRuntimeException("Statement %s already has been copied.", statement.toString());
204
                if (statement instanceof IScope) {
205
                        if (m_convertedScopes.put((IScope)statement, m_copier.castToIScope(result)) != null)
206
                                throw new OoasCompilerRuntimeException("Scope %s already has been copied.", statement.toString());
207
                }
208
                return result;
209
        }
210

    
211
        @Override
212
        public void visit(EnumIdentifier enumIdentifier)
213
        {
214
                final T id = createIdentifier(enumIdentifier);
215

    
216
                // create all referenced subs
217
                VisitSub(enumIdentifier.definingScope(), enumIdentifier);
218
                VisitSub(enumIdentifier.type(), enumIdentifier);
219

    
220
                // create the identifier and initialize it.
221
                m_copier.initEnumIdentifier(
222
                                id,
223
                                enumIdentifier.line(),
224
                                enumIdentifier.column(),
225
                                enumIdentifier.tokenText(),
226
                                m_convertedScopes.get(enumIdentifier.definingScope()),
227
                                m_convertedTypes.get(enumIdentifier.type()),
228
                                enumIdentifier.HaveValue(),
229
                                enumIdentifier.Value());
230
        }
231

    
232

    
233
        @Override
234
        public void visit(ConstantIdentifier constantIdentifier)
235
        {
236
                final T constId = createIdentifier(constantIdentifier);
237

    
238
                // make sure all the sub elements are created.
239
                VisitSub(constantIdentifier.definingScope(), constantIdentifier);
240
                VisitSub(constantIdentifier.type(), constantIdentifier);
241
                VisitSub(constantIdentifier.Value(), constantIdentifier);
242

    
243
                // create the identifier and initialize it.
244
                m_copier.initConstantIdentifier(
245
                                constId,
246
                                constantIdentifier.line(),
247
                                constantIdentifier.column(),
248
                                constantIdentifier.tokenText(),
249
                                m_convertedScopes.get(constantIdentifier.definingScope()),
250
                                m_convertedTypes.get(constantIdentifier.type()),
251
                                m_convertedExpressions.get(constantIdentifier.Value()));
252
        }
253

    
254
        @Override
255
        public void visit(AttributeIdentifier attributeIdentifier)
256
        {
257
                final T id = createIdentifier(attributeIdentifier);
258

    
259
                // make sure all the sub elements are created.
260
                VisitSub(attributeIdentifier.definingScope(), attributeIdentifier);
261
                VisitSub(attributeIdentifier.type(), attributeIdentifier);
262
                VisitSub(attributeIdentifier.initializer(), attributeIdentifier);
263

    
264
                // create the identifier and initialize it.
265
                m_copier.initAttributeIdentifier(
266
                                id,
267
                                attributeIdentifier.line(),
268
                                attributeIdentifier.column(),
269
                                attributeIdentifier.tokenText(),
270
                                m_convertedScopes.get(attributeIdentifier.definingScope()),
271
                                m_convertedTypes.get(attributeIdentifier.type()),
272
                                m_convertedExpressions.get(attributeIdentifier.initializer()),
273
                                attributeIdentifier.isStatic(),
274
                                attributeIdentifier.isControllable(),
275
                                attributeIdentifier.isObservable());
276
        }
277

    
278
        @Override
279
        public void visit(ExpressionVariableIdentifier expressionVariableIdentifier)
280
        {
281
                final T id = createIdentifier(expressionVariableIdentifier);
282

    
283
                // make sure all the sub elements are created.
284
                VisitSub(expressionVariableIdentifier.definingScope(), expressionVariableIdentifier);
285
                VisitSub(expressionVariableIdentifier.type(), expressionVariableIdentifier);
286

    
287
                // create the identifier and initialize it.
288
                m_copier.initExprVarIdentifier(
289
                                id,
290
                                expressionVariableIdentifier.line(),
291
                                expressionVariableIdentifier.column(),
292
                                expressionVariableIdentifier.tokenText(),
293
                                m_convertedScopes.get(expressionVariableIdentifier.definingScope()),
294
                                m_convertedTypes.get(expressionVariableIdentifier.type()),
295
                                expressionVariableIdentifier.initialized());
296
        }
297

    
298
        @Override
299
        public void visit(ParameterIdentifier parameterIdentifier)
300
        {
301
                final T id = createIdentifier(parameterIdentifier);
302

    
303
                // create sub elements.
304
                VisitSub(parameterIdentifier.definingScope(), parameterIdentifier);
305
                VisitSub(parameterIdentifier.type(), parameterIdentifier);
306

    
307
                // create the identifier and initialize it.
308
                m_copier.initParamIdentifier(
309
                                id,
310
                                parameterIdentifier.line(),
311
                                parameterIdentifier.column(),
312
                                parameterIdentifier.tokenText(),
313
                                m_convertedScopes.get(parameterIdentifier.definingScope()),
314
                                m_convertedTypes.get(parameterIdentifier.type()));
315
        }
316

    
317
        @Override
318
        public void visit(LocalVariableIdentifier localVariableIdentifier)
319
        {
320
                final T id = createIdentifier(localVariableIdentifier);
321

    
322
                // create sub elements.
323
                VisitSub(localVariableIdentifier.definingScope(), localVariableIdentifier);
324
                VisitSub(localVariableIdentifier.type(), localVariableIdentifier);
325

    
326
                // create the identifier and initialize it.
327
                m_copier.initLocalVarIdentifier(
328
                                id,
329
                                localVariableIdentifier.line(),
330
                                localVariableIdentifier.column(),
331
                                localVariableIdentifier.tokenText(),
332
                                m_convertedScopes.get(localVariableIdentifier.definingScope()),
333
                                m_convertedTypes.get(localVariableIdentifier.type()));
334
}
335

    
336
        @Override
337
        public void visit(TypeIdentifier typeIdentifier)
338
        {
339
                final T id = createIdentifier(typeIdentifier);
340

    
341
                // create sub elements.
342
                VisitSub(typeIdentifier.definingScope(), typeIdentifier);
343
                VisitSub(typeIdentifier.type(), typeIdentifier);
344

    
345
                // create the identifier and initialize it.
346
                m_copier.initTypeIdentifier(
347
                                id,
348
                                typeIdentifier.line(),
349
                                typeIdentifier.column(),
350
                                typeIdentifier.tokenText(),
351
                                m_convertedScopes.get(typeIdentifier.definingScope()),
352
                                m_convertedTypes.get(typeIdentifier.type()),
353
                                typeIdentifier.prefix);
354
        }
355

    
356
        @Override
357
        public void visit(SelfTypeIdentifier aself)
358
        {
359
                final T id = createIdentifier(aself);
360

    
361
                // create sub elements.
362
                VisitSub(aself.definingScope(), aself);
363
                VisitSub(aself.type(), aself);
364

    
365
                // create the identifier and initialize it. (selftypeid extends typeid..)
366
                m_copier.initSelfIdentifier(
367
                                id,
368
                                aself.line(),
369
                                aself.column(),
370
                                aself.tokenText(),
371
                                m_convertedScopes.get(aself.definingScope()),
372
                                m_convertedTypes.get(aself.type()),
373
                                aself.prefix);
374
        }
375

    
376
        @Override
377
        public void visit(MethodIdentifier methodIdentifier)
378
        {
379
                final T id = createIdentifier(methodIdentifier);
380

    
381
                // create sub elements.
382
                VisitSub(methodIdentifier.definingScope(), methodIdentifier);
383
                VisitSub(methodIdentifier.type(), methodIdentifier);
384
                for (final Identifier sym: methodIdentifier.symbolTable().symbolList())
385
                        VisitSub(sym, methodIdentifier);
386
                for (final ParameterIdentifier par: methodIdentifier.parameter())
387
                        VisitSub(par, methodIdentifier);
388
                VisitSub(methodIdentifier.body(), methodIdentifier);
389

    
390
                // create the identifier and initialize it.
391
                final T symbolTable = m_copier.createSymbolTable();
392
                for (final Identifier sym: methodIdentifier.symbolTable().symbolList())
393
                        m_copier.addIdentifierToSymbolTable(symbolTable, m_convertedIdentifiers.get(sym));
394
                final T parameterList = m_copier.createParameterList();
395
                for (final ParameterIdentifier par: methodIdentifier.parameter())
396
                        m_copier.addParameterIdentifierToList(parameterList, m_convertedIdentifiers.get(par));
397

    
398
                m_copier.initMethodIdentifier(
399
                                id,
400
                                methodIdentifier.line(),
401
                                methodIdentifier.column(),
402
                                methodIdentifier.tokenText(),
403
                                m_convertedScopes.get(methodIdentifier.definingScope()),
404
                                m_convertedTypes.get(methodIdentifier.type()),
405
                                methodIdentifier.prefix,
406
                                parameterList,
407
                                symbolTable,
408
                                m_convertedStatements.get(methodIdentifier.body()));
409
        }
410

    
411
        @Override
412
        public void visit(NamedActionIdentifier namedActionIdentifier)
413
        {
414
                final T id = createIdentifier(namedActionIdentifier);
415

    
416
                // create sub elements.
417
                VisitSub(namedActionIdentifier.definingScope(), namedActionIdentifier);
418
                VisitSub(namedActionIdentifier.type(), namedActionIdentifier);
419
                for (final Identifier sym : namedActionIdentifier.symbolTable().symbolList())
420
                        VisitSub(sym, namedActionIdentifier);
421
                for (final ParameterIdentifier par: namedActionIdentifier.parameter())
422
                        VisitSub(par, namedActionIdentifier);
423
                VisitSub(namedActionIdentifier.body(), namedActionIdentifier);
424

    
425
                // create the identifier and initialize it.
426
                final T symbolTable = m_copier.createSymbolTable();
427
                for (final Identifier sym: namedActionIdentifier.symbolTable().symbolList())
428
                        m_copier.addIdentifierToSymbolTable(symbolTable, m_convertedIdentifiers.get(sym));
429
                final T parameterList = m_copier.createParameterList();
430
                for (final ParameterIdentifier par: namedActionIdentifier.parameter())
431
                        m_copier.addParameterIdentifierToList(parameterList, m_convertedIdentifiers.get(par));
432

    
433
                m_copier.initMethodIdentifier(
434
                                id,
435
                                namedActionIdentifier.line(),
436
                                namedActionIdentifier.column(),
437
                                namedActionIdentifier.tokenText(),
438
                                m_convertedScopes.get(namedActionIdentifier.definingScope()),
439
                                m_convertedTypes.get(namedActionIdentifier.type()),
440
                                namedActionIdentifier.prefix,
441
                                parameterList,
442
                                symbolTable,
443
                                m_convertedStatements.get(namedActionIdentifier.body()));
444
        }
445

    
446
        @Override
447
        public void visit(Module module)
448
        {
449
                final T id = createIdentifier(module);
450

    
451
                VisitSub(module.definingScope(), module);
452
                VisitSub(module.type(), module);
453
                for (final Identifier sym: module.symbolTable().symbolList())
454
                        VisitSub(sym, module);
455

    
456
                final T symTab = m_copier.createSymbolTable();
457
                for (final Identifier sym: module.symbolTable().symbolList())
458
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(sym));
459

    
460
                m_copier.initModule(
461
                                id,
462
                                module.line(),
463
                                module.column(),
464
                                module.tokenText(),
465
                                m_convertedScopes.get(module.definingScope()),
466
                                m_convertedTypes.get(module.type()),
467
                                module.prefix,
468
                                symTab);
469
        }
470

    
471
        /**
472
         * Emit the main module. Notice that even though we run the
473
         * Instantiation Visitor, we DO NOT emit the flattened AS here
474
         * but the normal classes etc. That said, we include the information
475
         * about the instantiated objects (how many etc..)
476
         */
477
        @Override
478
        public void visit(MainModule mainModule)
479
        {
480
                m_visited.add(mainModule);
481

    
482
                final T id = createIdentifier(mainModule);
483

    
484
                VisitSub(mainModule.definingScope(), mainModule);
485
                VisitSub(mainModule.type(), mainModule);
486
                for (final Identifier sym: mainModule.symbolTable().symbolList())
487
                        VisitSub(sym, mainModule);
488
                VisitSub(mainModule.systemDescription(), mainModule);
489

    
490
                final T symTab = m_copier.createSymbolTable();
491
                for (final Identifier sym: mainModule.symbolTable().symbolList())
492
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(sym));
493

    
494
                m_copier.initMainModule(
495
                                id,
496
                                mainModule.line(),
497
                                mainModule.column(),
498
                                mainModule.tokenText(),
499
                                m_convertedScopes.get(mainModule.definingScope()),
500
                                m_convertedTypes.get(mainModule.type()),
501
                                mainModule.prefix,
502
                                symTab,
503
                                m_convertedIdentifiers.get(mainModule.systemDescription()));
504

    
505
                m_copier.setMainModule(mainModule, id);
506
        }
507

    
508

    
509
        @Override
510
        public void visit(NondetIdentifierList nondetIdentifierList)
511
        {
512
                final T idList = createIdentifier(nondetIdentifierList);
513

    
514
//                VisitSub(nondetIdentifierList.definingScope(), nondetIdentifierList);
515
//                VisitSub(nondetIdentifierList.type(), nondetIdentifierList);
516
                for (final Identifier id: nondetIdentifierList.identifiers())
517
                        VisitSub(id, nondetIdentifierList);
518

    
519
                for (final Identifier id: nondetIdentifierList.identifiers())
520
                        m_copier.addIdentifierToBlock(idList, m_convertedIdentifiers.get(id));
521
        }
522

    
523
        @Override
524
        public void visit(SeqIdentifierList seqIdentifierList)
525
        {
526
                final T idList = createIdentifier(seqIdentifierList);
527

    
528
//                VisitSub(nondetIdentifierList.definingScope(), nondetIdentifierList);
529
//                VisitSub(nondetIdentifierList.type(), nondetIdentifierList);
530
                for (final Identifier id: seqIdentifierList.identifiers())
531
                        VisitSub(id, seqIdentifierList);
532

    
533
                for (final Identifier id: seqIdentifierList.identifiers())
534
                        m_copier.addIdentifierToBlock(idList, m_convertedIdentifiers.get(id));
535
        }
536

    
537
        @Override
538
        public void visit(PrioIdentifierList prioIdentifierList)
539
        {
540
                final T idList = createIdentifier(prioIdentifierList);
541

    
542
//                VisitSub(nondetIdentifierList.definingScope(), nondetIdentifierList);
543
//                VisitSub(nondetIdentifierList.type(), nondetIdentifierList);
544
                for (final Identifier id: prioIdentifierList.identifiers())
545
                        VisitSub(id, prioIdentifierList);
546

    
547
                for (final Identifier id: prioIdentifierList.identifiers())
548
                        m_copier.addIdentifierToBlock(idList, m_convertedIdentifiers.get(id));
549
        }
550

    
551
        @Override
552
        public void visit(UnspecIdentifierList unspecIdentifierList)
553
        {
554
                final T idList = createIdentifier(unspecIdentifierList);
555

    
556
//                VisitSub(nondetIdentifierList.definingScope(), nondetIdentifierList);
557
//                VisitSub(nondetIdentifierList.type(), nondetIdentifierList);
558
                for (final Identifier id: unspecIdentifierList.identifiers())
559
                        VisitSub(id, unspecIdentifierList);
560

    
561
                for (final Identifier id: unspecIdentifierList.identifiers())
562
                        m_copier.addIdentifierToBlock(idList, m_convertedIdentifiers.get(id));
563
        }
564

    
565

    
566

    
567

    
568
        @Override
569
        public void visit(IntType intType)
570
        {
571
                final T type = createType(intType);
572

    
573
                final Identifier id = intType.identifier();
574
                VisitSub(id, intType);
575

    
576
                m_copier.initIntType(
577
                                type,
578
                                m_convertedIdentifiers.get(id),
579
                                intType.isAnonymousType(),
580
                                intType.rangeLow(),
581
                                intType.rangeHigh());
582
        }
583

    
584
        @Override
585
        public void visit(BoolType boolType)
586
        {
587
                final T type = createType(boolType);
588

    
589
                final Identifier id = boolType.identifier();
590
                VisitSub(id, boolType);
591

    
592
                m_copier.initBoolType(
593
                                type,
594
                                m_convertedIdentifiers.get(id),
595
                                boolType.isAnonymousType());
596
        }
597

    
598
        @Override
599
        public void visit(EnumType enumType)
600
        {
601
                final T type = createType(enumType);
602

    
603
                final Identifier id = enumType.identifier();
604
                VisitSub(id, enumType);
605
                for (final Identifier sym: enumType.listOfEnumSymbols())
606
                        VisitSub(sym, enumType);
607

    
608
                // initialize
609
                final T symTab = m_copier.createSymbolTable();
610
                for (final Identifier sym: enumType.listOfEnumSymbols())
611
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(sym));
612

    
613
                // FIXME: fix the visitor to have a separate method for ValuedEnumTypes..
614
                if (enumType instanceof ValuedEnumType) {
615
                        final ValuedEnumType t = (ValuedEnumType) enumType;
616
                        VisitSub(t.getIntType(), t);
617
                        m_copier.initValuedEnumType(
618
                                        type,
619
                                        m_convertedIdentifiers.get(id),
620
                                        enumType.isAnonymousType(),
621
                                        symTab,
622
                                        m_convertedTypes.get(t.getIntType()));
623
                } else
624
                        m_copier.initEnumType(
625
                                type,
626
                                m_convertedIdentifiers.get(id),
627
                                enumType.isAnonymousType(),
628
                                symTab);
629
        }
630

    
631
        @Override
632
        public void visit(ListType listType)
633
        {
634
                final T type = createType(listType);
635

    
636
                final Identifier id = listType.identifier();
637
                VisitSub(id, listType);
638
                VisitSub(listType.innerType(), listType);
639

    
640
                m_copier.initListType(
641
                                type,
642
                                m_convertedIdentifiers.get(id),
643
                                listType.isAnonymousType(),
644
                                m_convertedTypes.get(listType.innerType()),
645
                                listType.maxNumberOfElements());
646
        }
647

    
648

    
649
        @Override
650
        public void visit(TupleType tupleType)
651
        {
652
                final T type = createType(tupleType);
653

    
654
                final Identifier id = tupleType.identifier();
655
                VisitSub(id, tupleType);
656
                for (final Type t: tupleType.innerTypes())
657
                        VisitSub(t, tupleType);
658

    
659
                final T list = m_copier.createTypeList();
660
                for (final Type t: tupleType.innerTypes())
661
                        m_copier.addTypeToList(list, m_convertedTypes.get(t));
662

    
663
                m_copier.initTupleType(
664
                                type,
665
                                m_convertedIdentifiers.get(id),
666
                                tupleType.isAnonymousType(),
667
                                list);
668
        }
669

    
670
        @Override
671
        public void visit(FunctionType functionType)
672
        {
673
                final T type = createType(functionType);
674

    
675
                final Identifier id = functionType.identifier();
676
                VisitSub(id, functionType);
677
                for (final Type a: functionType.parameter())
678
                        VisitSub(a, functionType);
679
                VisitSub(functionType.returnType(), functionType);
680

    
681

    
682
                final T list = m_copier.createTypeList();
683
                for (final Type t: functionType.parameter())
684
                        m_copier.addTypeToList(list, m_convertedTypes.get(t));
685

    
686
                m_copier.initFunctionType(
687
                                type,
688
                                m_convertedIdentifiers.get(id),
689
                                functionType.isAnonymousType(),
690
                                list,
691
                                m_convertedTypes.get(functionType.returnType()),
692
                                functionType.functionType().integerValue,
693
                                functionType.isPureFunction());
694
                        // we ignore the isMiracleSafe property here.
695
        }
696

    
697
        private void convertActionSystemInstance(OoActionSystemInstance i, IAst ooActionSystemType) {
698
                if (i == null || m_convertedInstances.containsKey(i))
699
                        return;
700
                final T instance = m_copier.createActionSystemInstance();
701
                m_convertedInstances.put(i, instance);
702

    
703
                VisitSub(i.Type, ooActionSystemType);
704
                convertActionSystemInstance(i.ParentObject, ooActionSystemType);
705

    
706
                m_copier.initActionSystemInstance(
707
                                instance,
708
                                m_convertedTypes.get(i.Type),
709
                                i.Name,
710
                                i.numberOfCreatedObjects,
711
                                m_convertedInstances.get(i.ParentObject));
712
        }
713

    
714
        @Override
715
        public void visit(OoActionSystemType ooActionSystemType)
716
        {
717
                final T type = createType(ooActionSystemType);
718

    
719
                final Identifier id = ooActionSystemType.identifier();
720
                VisitSub(id, ooActionSystemType);
721
                for (final Identifier s: ooActionSystemType.symbols().symbolList())
722
                        VisitSub(s, ooActionSystemType);
723
                VisitSub(ooActionSystemType.doOdBlock(), ooActionSystemType);
724
                VisitSub(ooActionSystemType.baseType(), ooActionSystemType);
725
                for (final OoActionSystemInstance i: ooActionSystemType.objects())
726
                        convertActionSystemInstance(i, ooActionSystemType);
727
                for (final OoActionSystemInstance i: ooActionSystemType.derivedObjects())
728
                        convertActionSystemInstance(i, ooActionSystemType);
729

    
730
                final T symTab = m_copier.createSymbolTable();
731
                for (final Identifier s: ooActionSystemType.symbols().symbolList())
732
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(s));
733

    
734
                final T objectsList = m_copier.createActionSystemInstanceList();
735
                for (final OoActionSystemInstance i: ooActionSystemType.objects())
736
                        m_copier.addActionSystemInstanceToList(objectsList, m_convertedInstances.get(i));
737
                final T derivedObjectsList = m_copier.createActionSystemInstanceList();
738
                for (final OoActionSystemInstance i: ooActionSystemType.derivedObjects())
739
                        m_copier.addActionSystemInstanceToList(objectsList, m_convertedInstances.get(i));
740

    
741

    
742
                m_copier.initActionSystemType(
743
                                type,
744
                                m_convertedIdentifiers.get(id),
745
                                ooActionSystemType.isAnonymousType(),
746
                                m_convertedTypes.get(ooActionSystemType.baseType()),
747
                                m_convertedScopes.get(ooActionSystemType.GetParentScope()),
748
                                m_convertedStatements.get(ooActionSystemType.doOdBlock()),
749
                                symTab,
750
                                objectsList,
751
                                derivedObjectsList,
752
                                ooActionSystemType.autoConstruction(),
753
                                ooActionSystemType.isInSystemDescription());
754
        }
755

    
756
        @Override
757
        public void visit(NullType nullType)
758
        {
759
                final T type = createType(nullType);
760

    
761
                final Identifier id = nullType.identifier();
762
                VisitSub(id, nullType);
763

    
764
                m_copier.initNullType(
765
                                type,
766
                                m_convertedIdentifiers.get(id),
767
                                nullType.isAnonymousType());
768
        }
769

    
770

    
771
        // Statements..
772
        @Override
773
        public void visit(SkipStatement skipStatement)
774
        {
775
                m_copier.initSkipStatement(
776
                                createStatement(skipStatement),
777
                                skipStatement.line(),
778
                                skipStatement.pos());
779
        }
780

    
781

    
782
        @Override
783
        public void visit(BreakStatement breakStatement)
784
        {
785
                m_copier.initBreakStatement(
786
                                createStatement(breakStatement),
787
                                breakStatement.line(),
788
                                breakStatement.pos());
789
        }
790

    
791
        @Override
792
        public void visit(AbortStatement abortStatement)
793
        {
794
                m_copier.initAbortStatement(
795
                                createStatement(abortStatement),
796
                                abortStatement.line(),
797
                                abortStatement.pos());
798
        }
799

    
800
        @Override
801
        public void visit(NondetBlock nondetBlock)
802
        {
803
                final T stmt = createStatement(nondetBlock);
804

    
805
                // make sure all elements are allocated
806
                VisitSub(nondetBlock.GetParentScope(), nondetBlock);
807
                for (final Identifier id: nondetBlock.symbols().symbolList())
808
                        VisitSub(id, nondetBlock);
809
                for (final Statement stmnt: nondetBlock.statements())
810
                        VisitSub(stmnt, nondetBlock);
811

    
812
                // assemble data and initialize the block
813
                final T symTab = m_copier.createSymbolTable();
814
                for (final Identifier id: nondetBlock.symbols().symbolList())
815
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
816

    
817
                final T stmtList = m_copier.createStatementList();
818
                for (final Statement stmnt: nondetBlock.statements())
819
                        m_copier.addStatementToList(stmtList, m_convertedStatements.get(stmnt));
820

    
821
                m_copier.initNondetBlock(
822
                                stmt,
823
                                nondetBlock.line(),
824
                                nondetBlock.pos(),
825
                                symTab,
826
                                stmtList,
827
                                m_convertedScopes.get(nondetBlock.GetParentScope()));
828
        }
829

    
830
        @Override
831
        public void visit(SeqBlock seqBlock)
832
        {
833
                final T stmt = createStatement(seqBlock);
834

    
835
                // make sure all elements are allocated
836
                VisitSub(seqBlock.GetParentScope(), seqBlock);
837
                for (final Identifier id: seqBlock.symbols().symbolList())
838
                        VisitSub(id, seqBlock);
839
                if (seqBlock.filter() != null)
840
                        VisitSub(seqBlock.filter(), seqBlock);
841
                for (final Statement stmnt: seqBlock.statements())
842
                        VisitSub(stmnt, seqBlock);
843

    
844
                // assemble data and initialize the block
845
                final T symTab = m_copier.createSymbolTable();
846
                for (final Identifier id: seqBlock.symbols().symbolList())
847
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
848

    
849
                final T stmtList = m_copier.createStatementList();
850
                for (final Statement stmnt: seqBlock.statements())
851
                        m_copier.addStatementToList(stmtList, m_convertedStatements.get(stmnt));
852

    
853
                m_copier.initSeqBlock(
854
                                stmt,
855
                                seqBlock.line(),
856
                                seqBlock.pos(),
857
                                symTab,
858
                                stmtList,
859
                                m_convertedScopes.get(seqBlock.GetParentScope()),
860
                                m_convertedExpressions.get(seqBlock.filter()));
861
        }
862

    
863
        @Override
864
        public void visit(PrioBlock prioBlock)
865
        {
866
                final T stmt = createStatement(prioBlock);
867

    
868
                // make sure all elements are allocated
869
                VisitSub(prioBlock.GetParentScope(), prioBlock);
870
                for (final Identifier id: prioBlock.symbols().symbolList())
871
                        VisitSub(id, prioBlock);
872
                for (final Statement stmnt: prioBlock.statements())
873
                        VisitSub(stmnt, prioBlock);
874

    
875
                // assemble data and initialize the block
876
                final T symTab = m_copier.createSymbolTable();
877
                for (final Identifier id: prioBlock.symbols().symbolList())
878
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
879

    
880
                final T stmtList = m_copier.createStatementList();
881
                for (final Statement stmnt: prioBlock.statements())
882
                        m_copier.addStatementToList(stmtList, m_convertedStatements.get(stmnt));
883

    
884
                m_copier.initPrioBlock(
885
                                stmt,
886
                                prioBlock.line(),
887
                                prioBlock.pos(),
888
                                symTab,
889
                                stmtList,
890
                                m_convertedScopes.get(prioBlock.GetParentScope()));
891
        }
892

    
893
        @Override
894
        public void visit(GuardedCommand guardedCommand)
895
        {
896
                final T stmt = createStatement(guardedCommand);
897

    
898
                // make sure all elements are allocated
899
                VisitSub(guardedCommand.GetParentScope(), guardedCommand);
900
                VisitSub(guardedCommand.guard(), guardedCommand);
901
                VisitSub(guardedCommand.body(), guardedCommand);
902

    
903
                m_copier.initGuardedCommand(
904
                                stmt,
905
                                guardedCommand.line(),
906
                                guardedCommand.pos(),
907
                                m_convertedScopes.get(guardedCommand.GetParentScope()),
908
                                m_convertedExpressions.get(guardedCommand.guard()),
909
                                m_convertedStatements.get(guardedCommand.body()));
910
        }
911

    
912
        @Override
913
        public void visit(Assignment assignment)
914
        {
915
                final T stmt = createStatement(assignment);
916

    
917
                // make sure all elements are allocated
918
                VisitSub(assignment.GetParentScope(), assignment);
919
                for (final Identifier id: assignment.symbols().symbolList())
920
                        VisitSub(id, assignment);
921
                for (final Expression vexp: assignment.places())
922
                        VisitSub(vexp, assignment);
923
                for (final Expression expr: assignment.values())
924
                        VisitSub(expr, assignment);
925
                VisitSub(assignment.nondetExpression(), assignment);
926

    
927

    
928
                final T symTab = m_copier.createSymbolTable();
929
                for (final Identifier id: assignment.symbols().symbolList())
930
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
931
                final T places = m_copier.createExpressionList();
932
                for (final Expression vexp: assignment.places())
933
                        m_copier.addExpressionToList(places,m_convertedExpressions.get(vexp));
934
                final T values = m_copier.createExpressionList();
935
                for (final Expression expr: assignment.values())
936
                        m_copier.addExpressionToList(values,m_convertedExpressions.get(expr));
937

    
938
                m_copier.initAssignment(
939
                                stmt,
940
                                assignment.line(),
941
                                assignment.pos(),
942
                                m_convertedScopes.get(assignment.GetParentScope()),
943
                                m_convertedExpressions.get(assignment.nondetExpression()),
944
                                places,
945
                                values,
946
                                symTab);
947
        }
948

    
949
        @Override
950
        public void visit(Call call)
951
        {
952
                final T stmt = createStatement(call);
953

    
954
                // make sure all elements are allocated
955
                VisitSub(call.callExpression(), call);
956

    
957
                m_copier.initCall(
958
                                stmt,
959
                                call.line(),
960
                                call.pos(),
961
                                m_convertedExpressions.get(call.callExpression()));
962
        }
963

    
964

    
965

    
966
        // Expressions
967

    
968
        private final class ExprData {
969
                public final T typeRef;
970
                public final T callTargetsIdentifierListRef;
971
                public final T symbTabRef;
972
                public final int line;
973
                public final int pos;
974

    
975
                public ExprData(T type, T callTgts, T symbTabRef, int line, int pos) {
976
                        typeRef = type;
977
                        callTargetsIdentifierListRef = callTgts;
978
                        this.symbTabRef = symbTabRef;
979
                        this.line = line;
980
                        this.pos = pos;
981
                }
982
        }
983

    
984
        private ExprData visitBasicExpression(Expression e) {
985
                final T list = m_copier.createIdentifierList();
986
                final T symTab = m_copier.createSymbolTable();
987

    
988
                VisitSub(e.type(), e);
989
                for (final FunctionIdentifier i: e.callTargets())
990
                        VisitSub(i, e);
991
                if (e.freeVariables() != null) {
992
                        for (final Identifier id: e.freeVariables().symbolList())
993
                                VisitSub(id, e);
994
                        for (final Identifier id: e.freeVariables().symbolList())
995
                                m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
996
                }
997

    
998
                for (final FunctionIdentifier i: e.callTargets())
999
                        m_copier.addIdentifierToList(list, m_convertedIdentifiers.get(i));
1000

    
1001
                return new ExprData(m_convertedTypes.get(e.type()), list, symTab,
1002
                                e.line(), e.pos());
1003
        }
1004

    
1005
        @Override
1006
        public void visit(TypeExpression typeExpression)
1007
        {
1008
                final T expr = createExpression(typeExpression);
1009
                final ExprData d = visitBasicExpression(typeExpression);
1010
                m_copier.initTypeExpression(
1011
                                expr,
1012
                                d.line,
1013
                                d.pos,
1014
                                d.typeRef,
1015
                                d.callTargetsIdentifierListRef,
1016
                                d.symbTabRef);
1017
        }
1018

    
1019
        @Override
1020
        public void visit(IdentifierExpression identifierExpression)
1021
        {
1022
                final T expr = createExpression(identifierExpression);
1023

    
1024
                final ExprData d = visitBasicExpression(identifierExpression);
1025
                VisitSub(identifierExpression.identifier(), identifierExpression);
1026

    
1027
                m_copier.initIdentifierExpression(
1028
                                expr,
1029
                                d.line,
1030
                                d.pos,
1031
                                d.typeRef,
1032
                                d.callTargetsIdentifierListRef,
1033
                                d.symbTabRef,
1034
                                m_convertedIdentifiers.get(identifierExpression.identifier()),
1035
                                identifierExpression.isSelf());
1036
        }
1037

    
1038
        @Override
1039
        public void visit(UnaryOperator unaryOperator)
1040
        {
1041
                final T expr = createExpression(unaryOperator);
1042

    
1043
                final ExprData d = visitBasicExpression(unaryOperator);
1044
                VisitSub(unaryOperator.child(), unaryOperator);
1045

    
1046
                m_copier.initUnaryExpression(
1047
                                expr,
1048
                                d.line,
1049
                                d.pos,
1050
                                d.typeRef,
1051
                                d.callTargetsIdentifierListRef,
1052
                                d.symbTabRef,
1053
                                m_convertedExpressions.get(unaryOperator.child()));
1054
        }
1055

    
1056
        @Override
1057
        public void visit(BinaryOperator binaryOperator)
1058
        {
1059
                final T expr = createExpression(binaryOperator);
1060

    
1061
                final ExprData d = visitBasicExpression(binaryOperator);
1062
                VisitSub(binaryOperator.left(), binaryOperator);
1063
                VisitSub(binaryOperator.right(), binaryOperator);
1064

    
1065
                m_copier.initBinaryExpression(
1066
                                expr,
1067
                                d.line,
1068
                                d.pos,
1069
                                d.typeRef,
1070
                                d.callTargetsIdentifierListRef,
1071
                                d.symbTabRef,
1072
                                m_convertedExpressions.get(binaryOperator.left()),
1073
                                m_convertedExpressions.get(binaryOperator.right()));
1074
        }
1075

    
1076
        @Override
1077
        public void visit(TernaryOperator ternaryOperator)
1078
        {
1079
                final T expr = createExpression(ternaryOperator);
1080

    
1081
                final ExprData d = visitBasicExpression(ternaryOperator);
1082
                VisitSub(ternaryOperator.left(), ternaryOperator);
1083
                VisitSub(ternaryOperator.mid(), ternaryOperator);
1084
                VisitSub(ternaryOperator.right(), ternaryOperator);
1085
                VisitSub(ternaryOperator.definingScope(), ternaryOperator);
1086

    
1087
                m_copier.initTernaryExpression(
1088
                                expr,
1089
                                d.line,
1090
                                d.pos,
1091
                                d.typeRef,
1092
                                d.callTargetsIdentifierListRef,
1093
                                d.symbTabRef,
1094
                                m_convertedExpressions.get(ternaryOperator.left()),
1095
                                m_convertedExpressions.get(ternaryOperator.mid()),
1096
                                m_convertedExpressions.get(ternaryOperator.right()),
1097
                                m_convertedScopes.get(ternaryOperator.definingScope()));
1098
        }
1099

    
1100

    
1101

    
1102
        @Override
1103
        public <U>void visit(ValueExpression<U> valueExpression)
1104
        {
1105
                final T expr = createExpression(valueExpression);
1106

    
1107
                final ExprData d = visitBasicExpression(valueExpression);
1108
                switch (valueExpression.valueType()) {
1109
                case integer:
1110
                        @SuppressWarnings("unchecked")
1111
                        final int value = ((ValueExpression<Integer>) valueExpression).value();
1112
                        m_copier.initIntValueExpression(
1113
                                        expr,
1114
                                        d.line,
1115
                                        d.pos,
1116
                                        d.typeRef,
1117
                                        d.callTargetsIdentifierListRef,
1118
                                        d.symbTabRef,
1119
                                        value);
1120
                        break;
1121
                case bool:
1122
                        @SuppressWarnings("unchecked")
1123
                        final boolean bvalue = ((ValueExpression<Boolean>) valueExpression).value();
1124
                        m_copier.initBoolValueExpression(
1125
                                        expr,
1126
                                        d.line,
1127
                                        d.pos,
1128
                                        d.typeRef,
1129
                                        d.callTargetsIdentifierListRef,
1130
                                        d.symbTabRef,
1131
                                        bvalue);
1132
                        break;
1133
                case reference:
1134
                        @SuppressWarnings("unchecked")
1135
                        final Object ovalue = ((ValueExpression<Object>) valueExpression).value();
1136
                        if (ovalue != null)
1137
                                throw new NotImplementedException();
1138
                        m_copier.initNullValueExpression(
1139
                                        expr,
1140
                                        d.line,
1141
                                        d.pos,
1142
                                        d.typeRef,
1143
                                        d.callTargetsIdentifierListRef,
1144
                                        d.symbTabRef);
1145
                        break;
1146

    
1147
                case qval:
1148
                case real:
1149
                case chr:
1150
                        throw new NotImplementedException();
1151

    
1152
                case identifier:
1153
                case complex:
1154
                case type:
1155
                case unset:
1156
                default:
1157
                        throw new IllegalArgumentException();
1158
                }
1159
        }
1160

    
1161

    
1162
        @Override
1163
        public void visit(ListConstructor listConstructor)
1164
        {
1165
                final T expr = createExpression(listConstructor);
1166

    
1167
                final ExprData d = visitBasicExpression(listConstructor);
1168
                for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList())
1169
                        VisitSub(lvar, listConstructor);
1170
                for (final Expression elems: listConstructor.elements())
1171
                        VisitSub(elems, listConstructor);
1172
                VisitSub(listConstructor.comprehension(), listConstructor);
1173
                VisitSub(listConstructor.GetParentScope(), listConstructor);
1174

    
1175
                final T symTab = m_copier.createSymbolTable();
1176
                for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList())
1177
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(lvar));
1178
                final T exprList = m_copier.createExpressionList();
1179
                for (final Expression elems: listConstructor.elements())
1180
                        m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1181

    
1182
                m_copier.initListConstructor(
1183
                                expr,
1184
                                d.line,
1185
                                d.pos,
1186
                                d.typeRef,
1187
                                d.callTargetsIdentifierListRef,
1188
                                d.symbTabRef,
1189
                                exprList,
1190
                                symTab,
1191
                                m_convertedScopes.get(listConstructor.GetParentScope()),
1192
                                m_convertedExpressions.get(listConstructor.comprehension()),
1193
                                listConstructor.hasComprehension());
1194
        }
1195

    
1196
        @Override
1197
        public void visit(SetConstructor setConstructor)
1198
        {
1199
                final T expr = createExpression(setConstructor);
1200

    
1201
                final ExprData d = visitBasicExpression(setConstructor);
1202
                for (final Identifier svar: setConstructor.comprehensionVariables().symbolList())
1203
                        VisitSub(svar, setConstructor);
1204
                for (final Expression elems: setConstructor.items())
1205
                        VisitSub(elems, setConstructor);
1206
                VisitSub(setConstructor.comprehension(), setConstructor);
1207
                VisitSub(setConstructor.GetParentScope(), setConstructor);
1208

    
1209

    
1210
                final T symTab = m_copier.createSymbolTable();
1211
                for (final Identifier lvar: setConstructor.comprehensionVariables().symbolList())
1212
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(lvar));
1213
                final T exprList = m_copier.createExpressionList();
1214
                for (final Expression elems: setConstructor.items())
1215
                        m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1216

    
1217
                m_copier.initSetConstructor(
1218
                                expr,
1219
                                d.line,
1220
                                d.pos,
1221
                                d.typeRef,
1222
                                d.callTargetsIdentifierListRef,
1223
                                d.symbTabRef,
1224
                                exprList,
1225
                                symTab,
1226
                                m_convertedScopes.get(setConstructor.GetParentScope()),
1227
                                m_convertedExpressions.get(setConstructor.comprehension()),
1228
                                setConstructor.hasComprehension());
1229
        }
1230

    
1231
        @Override
1232
        public void visit(TupleConstructor tupleConstructor)
1233
        {
1234
                final T expr = createExpression(tupleConstructor);
1235

    
1236
                final ExprData d = visitBasicExpression(tupleConstructor);
1237
                for (final Expression elem: tupleConstructor.values())
1238
                        VisitSub(elem, tupleConstructor);
1239
                VisitSub(tupleConstructor.tupleType(), tupleConstructor);
1240

    
1241

    
1242
                final T exprList = m_copier.createExpressionList();
1243
                for (final Expression elems: tupleConstructor.values())
1244
                        m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1245

    
1246
                m_copier.initTupleConstructor(
1247
                                expr,
1248
                                d.line,
1249
                                d.pos,
1250
                                d.typeRef,
1251
                                d.callTargetsIdentifierListRef,
1252
                                d.symbTabRef,
1253
                                exprList,
1254
                                m_convertedIdentifiers.get(tupleConstructor.tupleType()),
1255
                                tupleConstructor.isMatcher());
1256
        }
1257

    
1258
        @Override
1259
        public void visit(AccessExpression accessExpression)
1260
        {
1261
                final T expr = createExpression(accessExpression);
1262

    
1263
                final ExprData d = visitBasicExpression(accessExpression);
1264
                VisitSub(accessExpression.left(), accessExpression);
1265
                VisitSub(accessExpression.right(), accessExpression);
1266

    
1267
                m_copier.initAccessExpression(
1268
                                expr,
1269
                                d.line,
1270
                                d.pos,
1271
                                d.typeRef,
1272
                                d.callTargetsIdentifierListRef,
1273
                                d.symbTabRef,
1274
                                m_convertedExpressions.get(accessExpression.left()),
1275
                                m_convertedExpressions.get(accessExpression.right()));
1276
        }
1277

    
1278
        @Override
1279
        public void visit(TupleMapAccessExpression tupleMapAccessExpression)
1280
        {
1281
                final T expr = createExpression(tupleMapAccessExpression);
1282

    
1283
                final ExprData d = visitBasicExpression(tupleMapAccessExpression);
1284
                VisitSub(tupleMapAccessExpression.argument(), tupleMapAccessExpression);
1285
                VisitSub(tupleMapAccessExpression.child(), tupleMapAccessExpression);
1286

    
1287
                m_copier.initTupleMapAccessExpression(
1288
                                expr,
1289
                                d.line,
1290
                                d.pos,
1291
                                d.typeRef,
1292
                                d.callTargetsIdentifierListRef,
1293
                                d.symbTabRef,
1294
                                m_convertedExpressions.get(tupleMapAccessExpression.child()),
1295
                                m_convertedExpressions.get(tupleMapAccessExpression.argument()));
1296
        }
1297

    
1298
        @Override
1299
        public void visit(CallExpression callExpression)
1300
        {
1301
                final T expr = createExpression(callExpression);
1302

    
1303
                final ExprData d = visitBasicExpression(callExpression);
1304
                VisitSub(callExpression.child(), callExpression);
1305
                VisitSub(callExpression.scope(), callExpression);
1306

    
1307
                final T exprList = m_copier.createExpressionList();
1308
                if (callExpression.arguments() != null) {
1309
                        for (final Expression arg: callExpression.arguments())
1310
                                VisitSub(arg, callExpression);
1311
                        for (final Expression elems: callExpression.arguments())
1312
                                m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1313
                }
1314

    
1315
                m_copier.initCallExpression(
1316
                                expr,
1317
                                d.line,
1318
                                d.pos,
1319
                                d.typeRef,
1320
                                d.callTargetsIdentifierListRef,
1321
                                d.symbTabRef,
1322
                                m_convertedExpressions.get(callExpression.child()),
1323
                                exprList,
1324
                                m_convertedScopes.get(callExpression.scope()));
1325
        }
1326

    
1327
        private void visitQuantifierExpression(Quantifier quantifier)
1328
        {
1329
                final T expr = createExpression(quantifier);
1330

    
1331
                final ExprData d = visitBasicExpression(quantifier);
1332
                for (final Identifier lvar: quantifier.symbols().symbolList())
1333
                        VisitSub(lvar, quantifier);
1334
                VisitSub(quantifier.child(), quantifier);
1335
                VisitSub(quantifier.GetParentScope(), quantifier);
1336

    
1337
                final T symTab = m_copier.createSymbolTable();
1338
                for (final Identifier lvar: quantifier.symbols().symbolList())
1339
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(lvar));
1340

    
1341
                m_copier.initQuantifierExpression(
1342
                                expr,
1343
                                d.line,
1344
                                d.pos,
1345
                                d.typeRef,
1346
                                d.callTargetsIdentifierListRef,
1347
                                d.symbTabRef,
1348
                                m_convertedExpressions.get(quantifier.child()),
1349
                                symTab,
1350
                                m_convertedScopes.get(quantifier.GetParentScope()));
1351
        }
1352

    
1353
        @Override
1354
        public void visit(ForallQuantifier quantifier)
1355
        {
1356
                visitQuantifierExpression(quantifier);
1357
        }
1358

    
1359
        @Override
1360
        public void visit(ExistsQuantifier quantifier)
1361
        {
1362
                visitQuantifierExpression(quantifier);
1363
        }
1364

    
1365
        @Override
1366
        public void visit(ObjectConstructor objectConstructor)
1367
        {
1368
                final T expr = createExpression(objectConstructor);
1369

    
1370
                final ExprData d = visitBasicExpression(objectConstructor);
1371
                for (final OoActionSystemInstance i: objectConstructor.instances())
1372
                        convertActionSystemInstance(i, objectConstructor);
1373

    
1374
                final T instanceList = m_copier.createActionSystemInstanceList();
1375
                for (final OoActionSystemInstance i: objectConstructor.instances())
1376
                        m_copier.addActionSystemInstanceToList(instanceList, m_convertedInstances.get(i));
1377

    
1378
                m_copier.initObjectConstructor(
1379
                                expr,
1380
                                d.line,
1381
                                d.pos,
1382
                                d.typeRef,
1383
                                d.callTargetsIdentifierListRef,
1384
                                d.symbTabRef,
1385
                                instanceList,
1386
                                objectConstructor.currentInstance(),
1387
                                objectConstructor.givenObjectName());
1388
        }
1389

    
1390

    
1391
        /*
1392
         * UNSUPPORTED METHODS BELOW
1393
         */
1394

    
1395
        @Override
1396
        public void visit(KillStatement killStatement)
1397
        {
1398
                // no support for kill right now..
1399
                throw new NotImplementedException();
1400
        }
1401
        @Override
1402
        public void visit(OpaqueType opaqueType)
1403
        {
1404
                // we must not hit this line - everything needs to be resolved at this point!
1405
                throw new NotImplementedException();
1406
        }
1407

    
1408
        @Override
1409
        public void visit(AnyType anyType)
1410
        {
1411
                // we must not hit this line - everything needs to be resolved at this point!
1412
                throw new NotImplementedException();
1413
        }
1414

    
1415
        @Override
1416
        public void visit(UnresolvedIdentifierExpression unresolvedIdentifierExpression)
1417
        {
1418
                // we must not hit this line - everything needs to be resolved at this point!
1419
                throw new NotImplementedException();
1420
        }
1421
        @Override
1422
        public void visit(MapConstructor mapConstructor)
1423
        {
1424
                // we do not support maps right now.
1425
                throw new NotImplementedException();
1426
        }
1427

    
1428
        @Override
1429
        public void visit(CharType charType)
1430
        {
1431
                // chars are not supported right now
1432
                throw new NotImplementedException();
1433
        }
1434

    
1435
        @Override
1436
        public void visit(FloatType floatType)
1437
        {
1438
                // floats are not supported right now
1439
                throw new NotImplementedException();
1440
        }
1441

    
1442
        @Override
1443
        public void visit(MapType mapType)
1444
        {
1445
                // maps are not supported right now
1446
                throw new NotImplementedException();
1447
        }
1448
}