Project

General

Profile

root / trunk / compiler / ooasCompiler / src / org / momut / ooas / codegen / ast / OoaAstEmitter.java @ 12

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

    
27

    
28
package org.momut.ooas.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.MetaType;
97
import org.momut.ooas.ast.types.NullType;
98
import org.momut.ooas.ast.types.OoActionSystemInstance;
99
import org.momut.ooas.ast.types.OoActionSystemType;
100
import org.momut.ooas.ast.types.OpaqueType;
101
import org.momut.ooas.ast.types.TupleType;
102
import org.momut.ooas.ast.types.TypeKind;
103
import org.momut.ooas.ast.types.Type;
104
import org.momut.ooas.ast.types.ValuedEnumType;
105
import org.momut.ooas.parser.ParserState;
106
import org.momut.ooas.utils.exceptions.NotImplementedException;
107
import org.momut.ooas.utils.exceptions.OoasCompilerRuntimeException;
108

    
109
public class OoaAstEmitter<T> implements IAstVisitor {
110

    
111

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

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

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

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

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

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

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

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

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

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

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

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

    
233

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
483
                final T id = createIdentifier(mainModule);
484

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

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

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

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

    
509

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

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

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

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

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

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

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

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

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

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

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

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

    
566

    
567

    
568

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
654
                final Identifier id = metaType.identifier();
655
                VisitSub(id, metaType);
656
                VisitSub(metaType.Type(), metaType);
657

    
658
                m_copier.initMetaType(
659
                                type,
660
                                m_convertedIdentifiers.get(id),
661
                                metaType.isAnonymousType(),
662
                                m_convertedTypes.get(metaType.Type()));
663
        }
664

    
665

    
666
        @Override
667
        public void visit(TupleType tupleType)
668
        {
669
                final T type = createType(tupleType);
670

    
671
                final Identifier id = tupleType.identifier();
672
                VisitSub(id, tupleType);
673
                for (final Type t: tupleType.innerTypes())
674
                        VisitSub(t, tupleType);
675

    
676
                final T list = m_copier.createTypeList();
677
                for (final Type t: tupleType.innerTypes())
678
                        m_copier.addTypeToList(list, m_convertedTypes.get(t));
679

    
680
                m_copier.initTupleType(
681
                                type,
682
                                m_convertedIdentifiers.get(id),
683
                                tupleType.isAnonymousType(),
684
                                list);
685
        }
686

    
687
        @Override
688
        public void visit(FunctionType functionType)
689
        {
690
                final T type = createType(functionType);
691

    
692
                final Identifier id = functionType.identifier();
693
                VisitSub(id, functionType);
694
                for (final Type a: functionType.parameter())
695
                        VisitSub(a, functionType);
696
                VisitSub(functionType.returnType(), functionType);
697

    
698

    
699
                final T list = m_copier.createTypeList();
700
                for (final Type t: functionType.parameter())
701
                        m_copier.addTypeToList(list, m_convertedTypes.get(t));
702

    
703
                m_copier.initFunctionType(
704
                                type,
705
                                m_convertedIdentifiers.get(id),
706
                                functionType.isAnonymousType(),
707
                                list,
708
                                m_convertedTypes.get(functionType.returnType()),
709
                                functionType.functionType().integerValue,
710
                                functionType.isPureFunction());
711
                        // we ignore the isMiracleSafe property here.
712
        }
713

    
714
        private void convertActionSystemInstance(OoActionSystemInstance i, IAst ooActionSystemType) {
715
                if (i == null || m_convertedInstances.containsKey(i))
716
                        return;
717
                final T instance = m_copier.createActionSystemInstance();
718
                m_convertedInstances.put(i, instance);
719

    
720
                VisitSub(i.Type, ooActionSystemType);
721
                convertActionSystemInstance(i.ParentObject, ooActionSystemType);
722

    
723
                m_copier.initActionSystemInstance(
724
                                instance,
725
                                m_convertedTypes.get(i.Type),
726
                                i.Name,
727
                                i.numberOfCreatedObjects,
728
                                m_convertedInstances.get(i.ParentObject));
729
        }
730

    
731
        @Override
732
        public void visit(OoActionSystemType ooActionSystemType)
733
        {
734
                final T type = createType(ooActionSystemType);
735

    
736
                final Identifier id = ooActionSystemType.identifier();
737
                VisitSub(id, ooActionSystemType);
738
                for (final Identifier s: ooActionSystemType.symbols().symbolList())
739
                        VisitSub(s, ooActionSystemType);
740
                VisitSub(ooActionSystemType.doOdBlock(), ooActionSystemType);
741
                VisitSub(ooActionSystemType.baseType(), ooActionSystemType);
742
                for (final OoActionSystemInstance i: ooActionSystemType.objects())
743
                        convertActionSystemInstance(i, ooActionSystemType);
744
                for (final OoActionSystemInstance i: ooActionSystemType.derivedObjects())
745
                        convertActionSystemInstance(i, ooActionSystemType);
746

    
747
                final T symTab = m_copier.createSymbolTable();
748
                for (final Identifier s: ooActionSystemType.symbols().symbolList())
749
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(s));
750

    
751
                final T objectsList = m_copier.createActionSystemInstanceList();
752
                for (final OoActionSystemInstance i: ooActionSystemType.objects())
753
                        m_copier.addActionSystemInstanceToList(objectsList, m_convertedInstances.get(i));
754
                final T derivedObjectsList = m_copier.createActionSystemInstanceList();
755
                for (final OoActionSystemInstance i: ooActionSystemType.derivedObjects())
756
                        m_copier.addActionSystemInstanceToList(objectsList, m_convertedInstances.get(i));
757

    
758

    
759
                m_copier.initActionSystemType(
760
                                type,
761
                                m_convertedIdentifiers.get(id),
762
                                ooActionSystemType.isAnonymousType(),
763
                                m_convertedTypes.get(ooActionSystemType.baseType()),
764
                                m_convertedScopes.get(ooActionSystemType.GetParentScope()),
765
                                m_convertedStatements.get(ooActionSystemType.doOdBlock()),
766
                                symTab,
767
                                objectsList,
768
                                derivedObjectsList,
769
                                ooActionSystemType.autoConstruction(),
770
                                ooActionSystemType.isInSystemDescription());
771
        }
772

    
773
        @Override
774
        public void visit(NullType nullType)
775
        {
776
                final T type = createType(nullType);
777

    
778
                final Identifier id = nullType.identifier();
779
                VisitSub(id, nullType);
780

    
781
                m_copier.initNullType(
782
                                type,
783
                                m_convertedIdentifiers.get(id),
784
                                nullType.isAnonymousType());
785
        }
786

    
787

    
788
        // Statements..
789
        @Override
790
        public void visit(SkipStatement skipStatement)
791
        {
792
                m_copier.initSkipStatement(
793
                                createStatement(skipStatement),
794
                                skipStatement.line(),
795
                                skipStatement.pos());
796
        }
797

    
798

    
799
        @Override
800
        public void visit(BreakStatement breakStatement)
801
        {
802
                m_copier.initBreakStatement(
803
                                createStatement(breakStatement),
804
                                breakStatement.line(),
805
                                breakStatement.pos());
806
        }
807

    
808
        @Override
809
        public void visit(AbortStatement abortStatement)
810
        {
811
                m_copier.initAbortStatement(
812
                                createStatement(abortStatement),
813
                                abortStatement.line(),
814
                                abortStatement.pos());
815
        }
816

    
817
        @Override
818
        public void visit(NondetBlock nondetBlock)
819
        {
820
                final T stmt = createStatement(nondetBlock);
821

    
822
                // make sure all elements are allocated
823
                VisitSub(nondetBlock.GetParentScope(), nondetBlock);
824
                for (final Identifier id: nondetBlock.symbols().symbolList())
825
                        VisitSub(id, nondetBlock);
826
                for (final Statement stmnt: nondetBlock.statements())
827
                        VisitSub(stmnt, nondetBlock);
828

    
829
                // assemble data and initialize the block
830
                final T symTab = m_copier.createSymbolTable();
831
                for (final Identifier id: nondetBlock.symbols().symbolList())
832
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
833

    
834
                final T stmtList = m_copier.createStatementList();
835
                for (final Statement stmnt: nondetBlock.statements())
836
                        m_copier.addStatementToList(stmtList, m_convertedStatements.get(stmnt));
837

    
838
                m_copier.initNondetBlock(
839
                                stmt,
840
                                nondetBlock.line(),
841
                                nondetBlock.pos(),
842
                                symTab,
843
                                stmtList,
844
                                m_convertedScopes.get(nondetBlock.GetParentScope()));
845
        }
846

    
847
        @Override
848
        public void visit(SeqBlock seqBlock)
849
        {
850
                final T stmt = createStatement(seqBlock);
851

    
852
                // make sure all elements are allocated
853
                VisitSub(seqBlock.GetParentScope(), seqBlock);
854
                for (final Identifier id: seqBlock.symbols().symbolList())
855
                        VisitSub(id, seqBlock);
856
                if (seqBlock.filter() != null)
857
                        VisitSub(seqBlock.filter(), seqBlock);
858
                for (final Statement stmnt: seqBlock.statements())
859
                        VisitSub(stmnt, seqBlock);
860

    
861
                // assemble data and initialize the block
862
                final T symTab = m_copier.createSymbolTable();
863
                for (final Identifier id: seqBlock.symbols().symbolList())
864
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
865

    
866
                final T stmtList = m_copier.createStatementList();
867
                for (final Statement stmnt: seqBlock.statements())
868
                        m_copier.addStatementToList(stmtList, m_convertedStatements.get(stmnt));
869

    
870
                m_copier.initSeqBlock(
871
                                stmt,
872
                                seqBlock.line(),
873
                                seqBlock.pos(),
874
                                symTab,
875
                                stmtList,
876
                                m_convertedScopes.get(seqBlock.GetParentScope()),
877
                                m_convertedExpressions.get(seqBlock.filter()));
878
        }
879

    
880
        @Override
881
        public void visit(PrioBlock prioBlock)
882
        {
883
                final T stmt = createStatement(prioBlock);
884

    
885
                // make sure all elements are allocated
886
                VisitSub(prioBlock.GetParentScope(), prioBlock);
887
                for (final Identifier id: prioBlock.symbols().symbolList())
888
                        VisitSub(id, prioBlock);
889
                for (final Statement stmnt: prioBlock.statements())
890
                        VisitSub(stmnt, prioBlock);
891

    
892
                // assemble data and initialize the block
893
                final T symTab = m_copier.createSymbolTable();
894
                for (final Identifier id: prioBlock.symbols().symbolList())
895
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
896

    
897
                final T stmtList = m_copier.createStatementList();
898
                for (final Statement stmnt: prioBlock.statements())
899
                        m_copier.addStatementToList(stmtList, m_convertedStatements.get(stmnt));
900

    
901
                m_copier.initPrioBlock(
902
                                stmt,
903
                                prioBlock.line(),
904
                                prioBlock.pos(),
905
                                symTab,
906
                                stmtList,
907
                                m_convertedScopes.get(prioBlock.GetParentScope()));
908
        }
909

    
910
        @Override
911
        public void visit(GuardedCommand guardedCommand)
912
        {
913
                final T stmt = createStatement(guardedCommand);
914

    
915
                // make sure all elements are allocated
916
                VisitSub(guardedCommand.GetParentScope(), guardedCommand);
917
                VisitSub(guardedCommand.guard(), guardedCommand);
918
                VisitSub(guardedCommand.body(), guardedCommand);
919

    
920
                m_copier.initGuardedCommand(
921
                                stmt,
922
                                guardedCommand.line(),
923
                                guardedCommand.pos(),
924
                                m_convertedScopes.get(guardedCommand.GetParentScope()),
925
                                m_convertedExpressions.get(guardedCommand.guard()),
926
                                m_convertedStatements.get(guardedCommand.body()));
927
        }
928

    
929
        @Override
930
        public void visit(Assignment assignment)
931
        {
932
                final T stmt = createStatement(assignment);
933

    
934
                // make sure all elements are allocated
935
                VisitSub(assignment.GetParentScope(), assignment);
936
                for (final Identifier id: assignment.symbols().symbolList())
937
                        VisitSub(id, assignment);
938
                for (final Expression vexp: assignment.places())
939
                        VisitSub(vexp, assignment);
940
                for (final Expression expr: assignment.values())
941
                        VisitSub(expr, assignment);
942
                VisitSub(assignment.nondetExpression(), assignment);
943

    
944

    
945
                final T symTab = m_copier.createSymbolTable();
946
                for (final Identifier id: assignment.symbols().symbolList())
947
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
948
                final T places = m_copier.createExpressionList();
949
                for (final Expression vexp: assignment.places())
950
                        m_copier.addExpressionToList(places,m_convertedExpressions.get(vexp));
951
                final T values = m_copier.createExpressionList();
952
                for (final Expression expr: assignment.values())
953
                        m_copier.addExpressionToList(values,m_convertedExpressions.get(expr));
954

    
955
                m_copier.initAssignment(
956
                                stmt,
957
                                assignment.line(),
958
                                assignment.pos(),
959
                                m_convertedScopes.get(assignment.GetParentScope()),
960
                                m_convertedExpressions.get(assignment.nondetExpression()),
961
                                places,
962
                                values,
963
                                symTab);
964
        }
965

    
966
        @Override
967
        public void visit(Call call)
968
        {
969
                final T stmt = createStatement(call);
970

    
971
                // make sure all elements are allocated
972
                VisitSub(call.callExpression(), call);
973

    
974
                m_copier.initCall(
975
                                stmt,
976
                                call.line(),
977
                                call.pos(),
978
                                m_convertedExpressions.get(call.callExpression()));
979
        }
980

    
981

    
982

    
983
        // Expressions
984

    
985
        private final class ExprData {
986
                public final T typeRef;
987
                public final T callTargetsIdentifierListRef;
988
                public final T symbTabRef;
989
                public final int line;
990
                public final int pos;
991

    
992
                public ExprData(T type, T callTgts, T symbTabRef, int line, int pos) {
993
                        typeRef = type;
994
                        callTargetsIdentifierListRef = callTgts;
995
                        this.symbTabRef = symbTabRef;
996
                        this.line = line;
997
                        this.pos = pos;
998
                }
999
        }
1000

    
1001
        private ExprData visitBasicExpression(Expression e) {
1002
                final T list = m_copier.createIdentifierList();
1003
                final T symTab = m_copier.createSymbolTable();
1004

    
1005
                VisitSub(e.type(), e);
1006
                for (final FunctionIdentifier i: e.callTargets())
1007
                        VisitSub(i, e);
1008
                if (e.freeVariables() != null) {
1009
                        for (final Identifier id: e.freeVariables().symbolList())
1010
                                VisitSub(id, e);
1011
                        for (final Identifier id: e.freeVariables().symbolList())
1012
                                m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(id));
1013
                }
1014

    
1015
                for (final FunctionIdentifier i: e.callTargets())
1016
                        m_copier.addIdentifierToList(list, m_convertedIdentifiers.get(i));
1017

    
1018
                return new ExprData(m_convertedTypes.get(e.type()), list, symTab,
1019
                                e.line(), e.pos());
1020
        }
1021

    
1022
        @Override
1023
        public void visit(TypeExpression typeExpression)
1024
        {
1025
                final T expr = createExpression(typeExpression);
1026
                final ExprData d = visitBasicExpression(typeExpression);
1027
                VisitSub(typeExpression.referredType(), typeExpression);
1028

    
1029
                m_copier.initTypeExpression(
1030
                                expr,
1031
                                d.line,
1032
                                d.pos,
1033
                                d.typeRef,
1034
                                d.callTargetsIdentifierListRef,
1035
                                d.symbTabRef,
1036
                                m_convertedTypes.get(typeExpression.referredType()));
1037
        }
1038

    
1039
        @Override
1040
        public void visit(IdentifierExpression identifierExpression)
1041
        {
1042
                final T expr = createExpression(identifierExpression);
1043

    
1044
                final ExprData d = visitBasicExpression(identifierExpression);
1045
                VisitSub(identifierExpression.identifier(), identifierExpression);
1046

    
1047
                m_copier.initIdentifierExpression(
1048
                                expr,
1049
                                d.line,
1050
                                d.pos,
1051
                                d.typeRef,
1052
                                d.callTargetsIdentifierListRef,
1053
                                d.symbTabRef,
1054
                                m_convertedIdentifiers.get(identifierExpression.identifier()),
1055
                                identifierExpression.isSelf());
1056
        }
1057

    
1058
        @Override
1059
        public void visit(UnaryOperator unaryOperator)
1060
        {
1061
                final T expr = createExpression(unaryOperator);
1062

    
1063
                final ExprData d = visitBasicExpression(unaryOperator);
1064
                VisitSub(unaryOperator.child(), unaryOperator);
1065

    
1066
                m_copier.initUnaryExpression(
1067
                                expr,
1068
                                d.line,
1069
                                d.pos,
1070
                                d.typeRef,
1071
                                d.callTargetsIdentifierListRef,
1072
                                d.symbTabRef,
1073
                                m_convertedExpressions.get(unaryOperator.child()));
1074
        }
1075

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

    
1081
                final ExprData d = visitBasicExpression(binaryOperator);
1082
                VisitSub(binaryOperator.left(), binaryOperator);
1083
                VisitSub(binaryOperator.right(), binaryOperator);
1084

    
1085
                m_copier.initBinaryExpression(
1086
                                expr,
1087
                                d.line,
1088
                                d.pos,
1089
                                d.typeRef,
1090
                                d.callTargetsIdentifierListRef,
1091
                                d.symbTabRef,
1092
                                m_convertedExpressions.get(binaryOperator.left()),
1093
                                m_convertedExpressions.get(binaryOperator.right()));
1094
        }
1095

    
1096
        @Override
1097
        public void visit(TernaryOperator ternaryOperator)
1098
        {
1099
                final T expr = createExpression(ternaryOperator);
1100

    
1101
                final ExprData d = visitBasicExpression(ternaryOperator);
1102
                VisitSub(ternaryOperator.left(), ternaryOperator);
1103
                VisitSub(ternaryOperator.mid(), ternaryOperator);
1104
                VisitSub(ternaryOperator.right(), ternaryOperator);
1105
                VisitSub(ternaryOperator.definingScope(), ternaryOperator);
1106

    
1107
                m_copier.initTernaryExpression(
1108
                                expr,
1109
                                d.line,
1110
                                d.pos,
1111
                                d.typeRef,
1112
                                d.callTargetsIdentifierListRef,
1113
                                d.symbTabRef,
1114
                                m_convertedExpressions.get(ternaryOperator.left()),
1115
                                m_convertedExpressions.get(ternaryOperator.mid()),
1116
                                m_convertedExpressions.get(ternaryOperator.right()),
1117
                                m_convertedScopes.get(ternaryOperator.definingScope()));
1118
        }
1119

    
1120

    
1121

    
1122
        @Override
1123
        public <U>void visit(ValueExpression<U> valueExpression)
1124
        {
1125
                final T expr = createExpression(valueExpression);
1126

    
1127
                final ExprData d = visitBasicExpression(valueExpression);
1128
                switch (valueExpression.valueType()) {
1129
                case integer:
1130
                        @SuppressWarnings("unchecked")
1131
                        final int value = ((ValueExpression<Integer>) valueExpression).value();
1132
                        m_copier.initIntValueExpression(
1133
                                        expr,
1134
                                        d.line,
1135
                                        d.pos,
1136
                                        d.typeRef,
1137
                                        d.callTargetsIdentifierListRef,
1138
                                        d.symbTabRef,
1139
                                        value);
1140
                        break;
1141
                case bool:
1142
                        @SuppressWarnings("unchecked")
1143
                        final boolean bvalue = ((ValueExpression<Boolean>) valueExpression).value();
1144
                        m_copier.initBoolValueExpression(
1145
                                        expr,
1146
                                        d.line,
1147
                                        d.pos,
1148
                                        d.typeRef,
1149
                                        d.callTargetsIdentifierListRef,
1150
                                        d.symbTabRef,
1151
                                        bvalue);
1152
                        break;
1153
                case reference:
1154
                        @SuppressWarnings("unchecked")
1155
                        final Object ovalue = ((ValueExpression<Object>) valueExpression).value();
1156
                        if (ovalue != null)
1157
                                throw new NotImplementedException();
1158
                        m_copier.initNullValueExpression(
1159
                                        expr,
1160
                                        d.line,
1161
                                        d.pos,
1162
                                        d.typeRef,
1163
                                        d.callTargetsIdentifierListRef,
1164
                                        d.symbTabRef);
1165
                        break;
1166

    
1167
                case qval:
1168
                case real:
1169
                case chr:
1170
                        throw new NotImplementedException();
1171

    
1172
                case identifier:
1173
                case complex:
1174
                case type:
1175
                case unset:
1176
                default:
1177
                        throw new IllegalArgumentException();
1178
                }
1179
        }
1180

    
1181

    
1182
        @Override
1183
        public void visit(ListConstructor listConstructor)
1184
        {
1185
                final T expr = createExpression(listConstructor);
1186

    
1187
                final ExprData d = visitBasicExpression(listConstructor);
1188
                for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList())
1189
                        VisitSub(lvar, listConstructor);
1190
                for (final Expression elems: listConstructor.elements())
1191
                        VisitSub(elems, listConstructor);
1192
                VisitSub(listConstructor.comprehension(), listConstructor);
1193
                VisitSub(listConstructor.GetParentScope(), listConstructor);
1194

    
1195
                final T symTab = m_copier.createSymbolTable();
1196
                for (final Identifier lvar: listConstructor.comprehensionVariables().symbolList())
1197
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(lvar));
1198
                final T exprList = m_copier.createExpressionList();
1199
                for (final Expression elems: listConstructor.elements())
1200
                        m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1201

    
1202
                m_copier.initListConstructor(
1203
                                expr,
1204
                                d.line,
1205
                                d.pos,
1206
                                d.typeRef,
1207
                                d.callTargetsIdentifierListRef,
1208
                                d.symbTabRef,
1209
                                exprList,
1210
                                symTab,
1211
                                m_convertedScopes.get(listConstructor.GetParentScope()),
1212
                                m_convertedExpressions.get(listConstructor.comprehension()),
1213
                                listConstructor.hasComprehension());
1214
        }
1215

    
1216
        @Override
1217
        public void visit(SetConstructor setConstructor)
1218
        {
1219
                final T expr = createExpression(setConstructor);
1220

    
1221
                final ExprData d = visitBasicExpression(setConstructor);
1222
                for (final Identifier svar: setConstructor.comprehensionVariables().symbolList())
1223
                        VisitSub(svar, setConstructor);
1224
                for (final Expression elems: setConstructor.items())
1225
                        VisitSub(elems, setConstructor);
1226
                VisitSub(setConstructor.comprehension(), setConstructor);
1227
                VisitSub(setConstructor.GetParentScope(), setConstructor);
1228

    
1229

    
1230
                final T symTab = m_copier.createSymbolTable();
1231
                for (final Identifier lvar: setConstructor.comprehensionVariables().symbolList())
1232
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(lvar));
1233
                final T exprList = m_copier.createExpressionList();
1234
                for (final Expression elems: setConstructor.items())
1235
                        m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1236

    
1237
                m_copier.initSetConstructor(
1238
                                expr,
1239
                                d.line,
1240
                                d.pos,
1241
                                d.typeRef,
1242
                                d.callTargetsIdentifierListRef,
1243
                                d.symbTabRef,
1244
                                exprList,
1245
                                symTab,
1246
                                m_convertedScopes.get(setConstructor.GetParentScope()),
1247
                                m_convertedExpressions.get(setConstructor.comprehension()),
1248
                                setConstructor.hasComprehension());
1249
        }
1250

    
1251
        @Override
1252
        public void visit(TupleConstructor tupleConstructor)
1253
        {
1254
                final T expr = createExpression(tupleConstructor);
1255

    
1256
                final ExprData d = visitBasicExpression(tupleConstructor);
1257
                for (final Expression elem: tupleConstructor.values())
1258
                        VisitSub(elem, tupleConstructor);
1259
                VisitSub(tupleConstructor.tupleType(), tupleConstructor);
1260

    
1261

    
1262
                final T exprList = m_copier.createExpressionList();
1263
                for (final Expression elems: tupleConstructor.values())
1264
                        m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1265

    
1266
                m_copier.initTupleConstructor(
1267
                                expr,
1268
                                d.line,
1269
                                d.pos,
1270
                                d.typeRef,
1271
                                d.callTargetsIdentifierListRef,
1272
                                d.symbTabRef,
1273
                                exprList,
1274
                                m_convertedIdentifiers.get(tupleConstructor.tupleType()),
1275
                                tupleConstructor.isMatcher());
1276
        }
1277

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

    
1283
                final ExprData d = visitBasicExpression(accessExpression);
1284
                VisitSub(accessExpression.left(), accessExpression);
1285
                VisitSub(accessExpression.right(), accessExpression);
1286

    
1287
                m_copier.initAccessExpression(
1288
                                expr,
1289
                                d.line,
1290
                                d.pos,
1291
                                d.typeRef,
1292
                                d.callTargetsIdentifierListRef,
1293
                                d.symbTabRef,
1294
                                m_convertedExpressions.get(accessExpression.left()),
1295
                                m_convertedExpressions.get(accessExpression.right()));
1296
        }
1297

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

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

    
1307
                m_copier.initTupleMapAccessExpression(
1308
                                expr,
1309
                                d.line,
1310
                                d.pos,
1311
                                d.typeRef,
1312
                                d.callTargetsIdentifierListRef,
1313
                                d.symbTabRef,
1314
                                m_convertedExpressions.get(tupleMapAccessExpression.child()),
1315
                                m_convertedExpressions.get(tupleMapAccessExpression.argument()));
1316
        }
1317

    
1318
        @Override
1319
        public void visit(CallExpression callExpression)
1320
        {
1321
                final T expr = createExpression(callExpression);
1322

    
1323
                final ExprData d = visitBasicExpression(callExpression);
1324
                VisitSub(callExpression.child(), callExpression);
1325
                VisitSub(callExpression.scope(), callExpression);
1326

    
1327
                final T exprList = m_copier.createExpressionList();
1328
                if (callExpression.arguments() != null) {
1329
                        for (final Expression arg: callExpression.arguments())
1330
                                VisitSub(arg, callExpression);
1331
                        for (final Expression elems: callExpression.arguments())
1332
                                m_copier.addExpressionToList(exprList, m_convertedExpressions.get(elems));
1333
                }
1334

    
1335
                m_copier.initCallExpression(
1336
                                expr,
1337
                                d.line,
1338
                                d.pos,
1339
                                d.typeRef,
1340
                                d.callTargetsIdentifierListRef,
1341
                                d.symbTabRef,
1342
                                m_convertedExpressions.get(callExpression.child()),
1343
                                exprList,
1344
                                m_convertedScopes.get(callExpression.scope()));
1345
        }
1346

    
1347
        private void visitQuantifierExpression(Quantifier quantifier)
1348
        {
1349
                final T expr = createExpression(quantifier);
1350

    
1351
                final ExprData d = visitBasicExpression(quantifier);
1352
                for (final Identifier lvar: quantifier.symbols().symbolList())
1353
                        VisitSub(lvar, quantifier);
1354
                VisitSub(quantifier.child(), quantifier);
1355
                VisitSub(quantifier.GetParentScope(), quantifier);
1356

    
1357
                final T symTab = m_copier.createSymbolTable();
1358
                for (final Identifier lvar: quantifier.symbols().symbolList())
1359
                        m_copier.addIdentifierToSymbolTable(symTab, m_convertedIdentifiers.get(lvar));
1360

    
1361
                m_copier.initQuantifierExpression(
1362
                                expr,
1363
                                d.line,
1364
                                d.pos,
1365
                                d.typeRef,
1366
                                d.callTargetsIdentifierListRef,
1367
                                d.symbTabRef,
1368
                                m_convertedExpressions.get(quantifier.child()),
1369
                                symTab,
1370
                                m_convertedScopes.get(quantifier.GetParentScope()));
1371
        }
1372

    
1373
        @Override
1374
        public void visit(ForallQuantifier quantifier)
1375
        {
1376
                visitQuantifierExpression(quantifier);
1377
        }
1378

    
1379
        @Override
1380
        public void visit(ExistsQuantifier quantifier)
1381
        {
1382
                visitQuantifierExpression(quantifier);
1383
        }
1384

    
1385
        @Override
1386
        public void visit(ObjectConstructor objectConstructor)
1387
        {
1388
                final T expr = createExpression(objectConstructor);
1389

    
1390
                final ExprData d = visitBasicExpression(objectConstructor);
1391
                for (final OoActionSystemInstance i: objectConstructor.instances())
1392
                        convertActionSystemInstance(i, objectConstructor);
1393

    
1394
                final T instanceList = m_copier.createActionSystemInstanceList();
1395
                for (final OoActionSystemInstance i: objectConstructor.instances())
1396
                        m_copier.addActionSystemInstanceToList(instanceList, m_convertedInstances.get(i));
1397

    
1398
                m_copier.initObjectConstructor(
1399
                                expr,
1400
                                d.line,
1401
                                d.pos,
1402
                                d.typeRef,
1403
                                d.callTargetsIdentifierListRef,
1404
                                d.symbTabRef,
1405
                                instanceList,
1406
                                objectConstructor.currentInstance(),
1407
                                objectConstructor.givenObjectName());
1408
        }
1409

    
1410

    
1411
        /*
1412
         * UNSUPPORTED METHODS BELOW
1413
         */
1414

    
1415
        @Override
1416
        public void visit(KillStatement killStatement)
1417
        {
1418
                // no support for kill right now..
1419
                throw new NotImplementedException();
1420
        }
1421
        @Override
1422
        public void visit(OpaqueType opaqueType)
1423
        {
1424
                // we must not hit this line - everything needs to be resolved at this point!
1425
                throw new NotImplementedException();
1426
        }
1427

    
1428
        @Override
1429
        public void visit(AnyType anyType)
1430
        {
1431
                // we must not hit this line - everything needs to be resolved at this point!
1432
                throw new NotImplementedException();
1433
        }
1434

    
1435
        @Override
1436
        public void visit(UnresolvedIdentifierExpression unresolvedIdentifierExpression)
1437
        {
1438
                // we must not hit this line - everything needs to be resolved at this point!
1439
                throw new NotImplementedException();
1440
        }
1441
        @Override
1442
        public void visit(MapConstructor mapConstructor)
1443
        {
1444
                // we do not support maps right now.
1445
                throw new NotImplementedException();
1446
        }
1447

    
1448
        @Override
1449
        public void visit(CharType charType)
1450
        {
1451
                // chars are not supported right now
1452
                throw new NotImplementedException();
1453
        }
1454

    
1455
        @Override
1456
        public void visit(FloatType floatType)
1457
        {
1458
                // floats are not supported right now
1459
                throw new NotImplementedException();
1460
        }
1461

    
1462
        @Override
1463
        public void visit(MapType mapType)
1464
        {
1465
                // maps are not supported right now
1466
                throw new NotImplementedException();
1467
        }
1468
}