Project

General

Profile

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

    
30
import org.momut.ooas.ast.AstNodeTypeEnum;
31
import org.momut.ooas.ast.IAst;
32
import org.momut.ooas.ast.identifiers.AttributeIdentifier;
33
import org.momut.ooas.ast.identifiers.EnumIdentifier;
34
import org.momut.ooas.ast.identifiers.ExpressionVariableIdentifier;
35
import org.momut.ooas.ast.identifiers.Identifier;
36
import org.momut.ooas.ast.identifiers.LocalVariableIdentifier;
37
import org.momut.ooas.ast.identifiers.MainModule;
38
import org.momut.ooas.ast.identifiers.MethodIdentifier;
39
import org.momut.ooas.ast.identifiers.Module;
40
import org.momut.ooas.ast.identifiers.NamedActionIdentifier;
41
import org.momut.ooas.ast.identifiers.NondetIdentifierList;
42
import org.momut.ooas.ast.identifiers.ParameterIdentifier;
43
import org.momut.ooas.ast.identifiers.PrioIdentifierList;
44
import org.momut.ooas.ast.identifiers.SelfTypeIdentifier;
45
import org.momut.ooas.ast.identifiers.SeqIdentifierList;
46
import org.momut.ooas.ast.identifiers.TypeIdentifier;
47
import org.momut.ooas.ast.identifiers.UnspecIdentifierList;
48
import org.momut.ooas.ast.types.EnumType;
49
import org.momut.ooas.ast.types.FunctionType;
50
import org.momut.ooas.ast.types.ListType;
51
import org.momut.ooas.ast.types.TypeKind;
52
import org.momut.ooas.ast.types.Type;
53
import org.momut.ooas.codegen.OoasCodeEmitter;
54
import org.momut.ooas.visitors.OoaCompleteAstTraversalVisitor;
55

    
56
/// <summary>
57
/// Knows how to construct a C-CADP identifier from an AST-Identifier
58
/// (enums, attributes, variables, parameters supported)
59
/// </summary>
60
public final class CadpIdentifier extends OoaCompleteAstTraversalVisitor
61
{
62
        private final OoasCodeEmitter m_emitter = new OoasCodeEmitter();
63
        private final String m_stateVariablePrefix;
64

    
65
        /// <summary>
66
        /// enums are mapped to ints, so an enum identifier simply gets an integer.
67
        /// </summary>
68
        @Override
69
        public  void visit(EnumIdentifier enumIdentifier)
70
        {
71
                if (enumIdentifier.HaveValue())
72
                {
73
                        m_emitter.Append(enumIdentifier.Value());
74
                        m_emitter.Append(" /* ");
75
                        m_emitter.Append(enumIdentifier.tokenText());
76
                        m_emitter.Append(" */ ");
77
                }
78
                else
79
                {
80
                        final EnumType anEnum = (EnumType)enumIdentifier.type();
81
                        m_emitter.Append(anEnum.listOfEnumSymbols().indexOf(enumIdentifier));
82
                        m_emitter.Append(" /* ");
83
                        m_emitter.Append(enumIdentifier.tokenText());
84
                        m_emitter.Append(" */ ");
85
                }
86
        }
87

    
88
        @Override
89
        public  void visit(AttributeIdentifier attributeIdentifier)
90
        {
91
                if (m_stateVariablePrefix != null && !m_stateVariablePrefix.equals(""))
92
                {
93
                        m_emitter.Append(m_stateVariablePrefix);
94
                        m_emitter.Append("->");
95
                }
96
                m_emitter.Append(attributeIdentifier.tokenText());
97
        }
98
        @Override
99
        public  void visit(ExpressionVariableIdentifier expressionVariableIdentifier)
100
        {
101
                // expression vars are local..
102
                m_emitter.Append(expressionVariableIdentifier.tokenText());
103
        }
104
        @Override
105
        public  void visit(ParameterIdentifier parameterIdentifier)
106
        {
107
                /* handed in as parameter to named action, hence no state ref. necessary. */
108
                if (parameterIdentifier.tokenText().equals("result"))
109
                        m_emitter.Append(String.format("*param_%1$s", parameterIdentifier.tokenText()));
110
                else
111
                        m_emitter.Append(String.format("param_%1$s", parameterIdentifier.tokenText()));
112
        }
113
        @Override
114
        public  void visit(LocalVariableIdentifier localVariableIdentifier)
115
        {
116
                m_emitter.Append(localVariableIdentifier.tokenText());
117
        }
118
        @Override
119
        public  void visit(TypeIdentifier typeIdentifier)
120
        {
121
                m_emitter.Append("aType_");
122
                if (typeIdentifier.type().kind() == TypeKind.ListType)
123
                {
124
                        m_emitter.Append("list_");
125
                        final ListType alist = (ListType)typeIdentifier.type();
126
                        if (alist.maxNumberOfElements() >= 0)
127
                                m_emitter.Append(String.format("%1$s_", alist.maxNumberOfElements()));
128
                        else
129
                                m_emitter.Append(String.format("dyn_", alist.maxNumberOfElements()));
130

    
131
                        visit(alist.innerType().identifier());
132
                }
133
                else if (typeIdentifier.type().kind() == TypeKind.FunctionType)
134
                {
135
                        final FunctionType funType = (FunctionType) typeIdentifier.type();
136
                        m_emitter.Append(typeIdentifier.tokenText());
137
                        for (final Type x : funType.parameter())
138
                        {
139
                                m_emitter.Append("_");
140
                                m_emitter.Append(x.toString());
141
                        }
142
                        if (funType.returnType() != null)
143
                        {
144
                                m_emitter.Append("__");
145
                                m_emitter.Append(funType.returnType().toString());
146
                        }
147
                }
148
                else
149
                        m_emitter.Append(typeIdentifier.tokenText());
150
        }
151

    
152
        @Override
153
        public  void visit(SelfTypeIdentifier aself)
154
        {
155
                m_emitter.Append(aself.tokenText());
156
        }
157

    
158
        @Override
159
        public  void visit(MethodIdentifier methodIdentifier)
160
        {
161
                m_emitter.Append(methodIdentifier.tokenText());
162
        }
163
        @Override
164
        public  void visit(NamedActionIdentifier namedActionIdentifier)
165
        {
166
                m_emitter.Append(namedActionIdentifier.tokenText());
167
        }
168
        @Override
169
        public  void visit(MainModule mainModule)
170
        {
171
                throw new UnsupportedOperationException();
172
        }
173
        @Override
174
        public  void visit(Module module)
175
        {
176
                throw new UnsupportedOperationException();
177
        }
178
        @Override
179
        public  void visit(NondetIdentifierList nondetIdentifierList)
180
        {
181
                throw new UnsupportedOperationException();
182
        }
183
        @Override
184
        public  void visit(SeqIdentifierList seqIdentifierList)
185
        {
186
                throw new UnsupportedOperationException();
187
        }
188
        @Override
189
        public  void visit(PrioIdentifierList prioIdentifierList)
190
        {
191
                throw new UnsupportedOperationException();
192
        }
193
        @Override
194
        public  void visit(UnspecIdentifierList unspecIdentifierList)
195
        {
196
                throw new UnsupportedOperationException();
197
        }
198

    
199
        @Override
200
        protected  void VisitAstElement(IAst element, IAst parent)
201
        {
202
                if (element.nodeType() == AstNodeTypeEnum.identifier)
203
                        super.VisitAstElement(element, parent);
204
        }
205

    
206
        @Override
207
        public  String toString()
208
        {
209
                return m_emitter.toString();
210
        }
211

    
212
        public CadpIdentifier(String stateVariablePrefix)
213
        {
214
                super(null);
215
                m_stateVariablePrefix = stateVariablePrefix;
216
        }
217

    
218

    
219
        public static String GetIdentifierString(TypeIdentifier typeIdentifier)
220
        {
221
                final CadpIdentifier ident = new CadpIdentifier("");
222
                ident.visit(typeIdentifier);
223
                return ident.toString();
224
        }
225
        public static String GetIdentifierString(ParameterIdentifier aParam)
226
        {
227
                final CadpIdentifier anid = new CadpIdentifier("");
228
                anid.visit(aParam);
229
                return anid.toString();
230
        }
231
        public static Object GetIdentifierString(Identifier x)
232
        {
233
                final CadpIdentifier anid = new CadpIdentifier(OoaCADPVisitor.StateVariablePrefix);
234
                x.Accept(anid);
235
                return anid.toString();
236
        }
237
}