1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24
25 #ifndef ADC_CPP_PE_VAFU_HXX
26 #define ADC_CPP_PE_VAFU_HXX
27
28 // BASE CLASSES
29 #include "cpp_pe.hxx"
30 // USED SERVICES
31 #include <semantic/callf.hxx>
32 #include <semantic/sub_peu.hxx>
33 #include <ary/cpp/c_types4cpp.hxx>
34 #include <ary/cpp/c_vfflag.hxx>
35
36
37
38 namespace cpp
39 {
40
41 class PE_Type;
42 class PE_Variable;
43 class PE_Function;
44 class PE_Ignore;
45
46
47
48
49 class PE_VarFunc : public Cpp_PE
50 {
51 public:
52 enum E_State
53 {
54 start,
55 expectCtor,
56 afterClassDecl, // Also used for after enum declaration.
57 expectName,
58 afterName,
59 afterName_inErraneousTemplate,
60 finished,
61 finishedIncludingFunctionImplementation,
62 size_of_states
63 };
64 enum E_ResultType
65 {
66 result_unknown = 0,
67 result_ignore, /// Used for class and enum declarations and predeclarations and for extern variables and functions.
68 result_variable,
69 result_function
70 };
71
72 typedef ary::cpp::E_Protection E_Protection;
73
74
75 PE_VarFunc(
76 Cpp_PE * i_pParent );
77 ~PE_VarFunc();
78
79 virtual void Call_Handler(
80 const cpp::Token & i_rTok );
81
82 const std::vector<ary::cpp::Ce_id> &
83 Result_Ids() const;
84 ary::cpp::Type_id Result_FrontType() const;
85 const StringVector &
86 Result_Names() const;
87 E_ResultType Result_CeType() const;
88
89 private:
90 typedef SubPe< PE_VarFunc, PE_Type > SP_Type;
91 typedef SubPeUse< PE_VarFunc, PE_Type > SPU_Type;
92 typedef SubPe< PE_VarFunc, PE_Variable > SP_Variable;
93 typedef SubPeUse< PE_VarFunc, PE_Variable > SPU_Variable;
94 typedef SubPe< PE_VarFunc, PE_Function > SP_Function;
95 typedef SubPeUse< PE_VarFunc, PE_Function > SPU_Function;
96 typedef SubPe< PE_VarFunc, PE_Ignore > SP_Ignore;
97 typedef SubPeUse< PE_VarFunc, PE_Ignore > SPU_Ignore;
98
99 void Setup_StatusFunctions();
100 virtual void InitData();
101 virtual void TransferData();
102 void Hdl_UnknownToken( const char *);
103
104 void SpInit_FunctionStd();
105 void SpInit_FunctionCtor();
106 void SpInit_FunctionDtor();
107 void SpInit_FunctionCastOperator();
108 void SpInit_FunctionNormalOperator();
109 void SpReturn_Type();
110 void SpReturn_Variable();
111 void SpReturn_FunctionStd();
112 void SpReturn_Ignore();
113
114 void On_start_Identifier(const char * i_sText);
115 void On_start_operator(const char * i_sText);
116 void On_start_TypeKey(const char * i_sText);
117 void On_start_virtual(const char * i_sText);
118 void On_start_Tilde(const char * i_sText);
119 void On_start_const(const char * i_sText);
120 void On_start_volatile(const char * i_sText);
121 void On_start_extern(const char * i_sText);
122 void On_start_static(const char * i_sText);
123 void On_start_mutable(const char * i_sText);
124 void On_start_register(const char * i_sText);
125 void On_start_inline(const char * i_sText);
126 void On_start_explicit(const char * i_sText);
127 void On_start_Bracket_Right(const char * i_sText);
128 void On_start_typename(const char * i_sText);
129
130 void On_expectCtor_Bracket_Left(const char * i_sText);
131
132 void On_afterClassDecl_Semicolon(const char * i_sText);
133
134 void On_expectName_Identifier(const char * i_sText);
135 void On_expectName_operator(const char * i_sText);
136 void On_expectName_Bracket_Left(const char * i_sText);
137
138 void On_afterName_ArrayBracket_Left(const char * i_sText);
139 void On_afterName_Bracket_Left(const char * i_sText);
140 void On_afterName_DoubleColon(const char * i_sText);
141 void On_afterName_Semicolon(const char * i_sText);
142 void On_afterName_Comma(const char * i_sText);
143 void On_afterName_Assign(const char * i_sText);
144 void On_afterName_Less(const char * i_sText);
145
146 void On_afterName_inErraneousTemplate_Less(const char * i_sText);
147 void On_afterName_inErraneousTemplate_Greater(const char * i_sText);
148 void On_afterName_inErraneousTemplate_Default(const char * i_sText);
149
150 void On_finished_Semicolon(const char * i_sText);
151 void On_finished_Comma(const char * i_sText);
152 void On_finished_Default(const char * i_sText);
153
154 void On_finishedIncludingFunctionImplementation_Default(const char * i_sText);
155
156 ary::cpp::FunctionFlags
157 CreateFunctionFlags();
158
159 // DATA
160 Dyn< PeStatusArray<PE_VarFunc> >
161 pStati;
162
163 Dyn<SP_Type> pSpType;
164 Dyn<SPU_Type> pSpuType;
165 Dyn<SP_Variable> pSpVariable;
166 Dyn<SPU_Variable> pSpuVariable;
167 Dyn<SP_Function> pSpFunction;
168 Dyn<SPU_Function> pSpuFunctionStd;
169 Dyn<SPU_Function> pSpuFunctionCtor;
170 Dyn<SPU_Function> pSpuFunctionDtor;
171 Dyn<SPU_Function> pSpuFunctionCastOperator;
172 Dyn<SPU_Function> pSpuFunctionNormalOperator;
173 Dyn<SP_Ignore> pSpIgnore;
174 Dyn<SPU_Ignore> pSpuIgnore;
175
176 intt nCounter_TemplateBrackets;
177 bool bInDestructor;
178
179 std::vector<ary::cpp::Ce_id>
180 aResultIds;
181 ary::cpp::Type_id nResultFrontType;
182 E_ResultType eResultType;
183
184 // Pre-Results
185 String sName;
186
187 bool bVirtual;
188 bool bStatic;
189 bool bExtern;
190 bool bExternC;
191 bool bMutable;
192 bool bInline;
193 bool bRegister;
194 bool bExplicit;
195 };
196
197
198
199 // IMPLEMENTATION
200
201 inline const std::vector<ary::cpp::Ce_id> &
Result_Ids() const202 PE_VarFunc::Result_Ids() const
203 { return aResultIds; }
204 inline ary::cpp::Type_id
Result_FrontType() const205 PE_VarFunc::Result_FrontType() const
206 { return nResultFrontType; }
207 inline PE_VarFunc::E_ResultType
Result_CeType() const208 PE_VarFunc::Result_CeType() const
209 { return eResultType; }
210
211
212
213 } // namespace cpp
214
215
216
217
218 #endif
219
220
221 /* // Overview of Stati
222
223 Undecided
224 ---------
225
226 start // vor und w�hrend storage class specifiern
227 any ->stay
228 operaator ->goto Function
229
230 ->Typ
231
232 expectName
233 Identifier ->stay
234 operator ->goto Function
235
236 afterName ->goto Variable or Function
237
238
239
240
241 Variable
242 --------
243
244 start // vor und w�hrend storage class specifiern
245
246 ->Typ
247
248 expectName // Typ ist da -> im Falle von '(': notyetimplemented
249 afterName
250
251 expectSize // after [
252 expectFinish
253 // vor ; oder ,
254 expectNextVarName // anders als bei expectName kann hier auch * oder & kommen
255
256
257
258
259
260 Function
261 --------
262
263 start // vor und w�hrend storage class specifiern
264
265 ->Typ
266
267 expectName // Typ ist da
268 expectBracket // Nach Name
269 expectParameter // nach ( oder ,
270 -> Parameter
271 after Parameters // before const, volatile throw or = 0.
272 after throw // expect (
273 expectException // after (
274 after exceptions // = 0 oder ; oder ,
275
276
277 expectNextVarName // anders als bei expectName kann hier auch * oder & kommen
278
279
280
281
282
283
284
285 */
286