1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #include <precomp.h>
23*b1cdbd2cSJim Jagielski #include "pe_funct.hxx"
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski // NOT FULLY DEFINED SERVICES
27*b1cdbd2cSJim Jagielski #include <cosv/tpl/tpltools.hxx>
28*b1cdbd2cSJim Jagielski #include <ary/cpp/c_gate.hxx>
29*b1cdbd2cSJim Jagielski #include <ary/cpp/c_funct.hxx>
30*b1cdbd2cSJim Jagielski #include <ary/cpp/c_type.hxx>
31*b1cdbd2cSJim Jagielski #include <ary/cpp/cp_ce.hxx>
32*b1cdbd2cSJim Jagielski #include <ary/cpp/cp_type.hxx>
33*b1cdbd2cSJim Jagielski #include <ary/cpp/inpcontx.hxx>
34*b1cdbd2cSJim Jagielski #include "pe_type.hxx"
35*b1cdbd2cSJim Jagielski #include "pe_param.hxx"
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski namespace cpp
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski inline void
PerformFinishingPunctuation()45*b1cdbd2cSJim Jagielski PE_Function::PerformFinishingPunctuation()
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski     SetTokenResult(not_done,pop_success);
48*b1cdbd2cSJim Jagielski }
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski 
PE_Function(Cpp_PE * i_pParent)51*b1cdbd2cSJim Jagielski PE_Function::PE_Function( Cpp_PE * i_pParent )
52*b1cdbd2cSJim Jagielski 	:   Cpp_PE(i_pParent),
53*b1cdbd2cSJim Jagielski 		pStati( new PeStatusArray<PE_Function> ),
54*b1cdbd2cSJim Jagielski 		// pSpParameter,
55*b1cdbd2cSJim Jagielski 		// pSpuParameter,
56*b1cdbd2cSJim Jagielski         // pSpType,
57*b1cdbd2cSJim Jagielski         // pSpuException,
58*b1cdbd2cSJim Jagielski         // pSpuCastOperatorType,
59*b1cdbd2cSJim Jagielski 		nResult(0),
60*b1cdbd2cSJim Jagielski         bResult_WithImplementation(false),
61*b1cdbd2cSJim Jagielski         aName(60),
62*b1cdbd2cSJim Jagielski         eVirtuality(ary::cpp::VIRTUAL_none),
63*b1cdbd2cSJim Jagielski         eConVol(ary::cpp::CONVOL_none),
64*b1cdbd2cSJim Jagielski         // aFlags,
65*b1cdbd2cSJim Jagielski         nReturnType(0),
66*b1cdbd2cSJim Jagielski         // aParameters
67*b1cdbd2cSJim Jagielski         // aExceptions,
68*b1cdbd2cSJim Jagielski         bThrow(false),
69*b1cdbd2cSJim Jagielski         nBracketCounterInImplementation(0)
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski 	Setup_StatusFunctions();
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 	pSpParameter     = new SP_Parameter(*this);
74*b1cdbd2cSJim Jagielski 	pSpType          = new SP_Type(*this);
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 	pSpuParameter	        = new SPU_Parameter(*pSpParameter, 0, &PE_Function::SpReturn_Parameter);
77*b1cdbd2cSJim Jagielski 	pSpuException	        = new SPU_Type(*pSpType, 0, &PE_Function::SpReturn_Exception);
78*b1cdbd2cSJim Jagielski 	pSpuCastOperatorType	= new SPU_Type(*pSpType, &PE_Function::SpInit_CastOperatorType, &PE_Function::SpReturn_CastOperatorType);
79*b1cdbd2cSJim Jagielski }
80*b1cdbd2cSJim Jagielski 
~PE_Function()81*b1cdbd2cSJim Jagielski PE_Function::~PE_Function()
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski void
Init_Std(const String & i_sName,ary::cpp::Type_id i_nReturnType,bool i_bVirtual,ary::cpp::FunctionFlags i_aFlags)87*b1cdbd2cSJim Jagielski PE_Function::Init_Std( const String  &          i_sName,
88*b1cdbd2cSJim Jagielski                        ary::cpp::Type_id        i_nReturnType,
89*b1cdbd2cSJim Jagielski 	                   bool                     i_bVirtual,
90*b1cdbd2cSJim Jagielski                        ary::cpp::FunctionFlags  i_aFlags )
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski     aName << i_sName;
93*b1cdbd2cSJim Jagielski     eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
94*b1cdbd2cSJim Jagielski     aFlags = i_aFlags;
95*b1cdbd2cSJim Jagielski     nReturnType = i_nReturnType;
96*b1cdbd2cSJim Jagielski     pStati->SetCur(afterName);
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski void
Init_Ctor(const String & i_sName,ary::cpp::FunctionFlags i_aFlags)100*b1cdbd2cSJim Jagielski PE_Function::Init_Ctor( const String  &         i_sName,
101*b1cdbd2cSJim Jagielski                         ary::cpp::FunctionFlags i_aFlags )
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski     aName << i_sName;
104*b1cdbd2cSJim Jagielski     eVirtuality = ary::cpp::VIRTUAL_none;
105*b1cdbd2cSJim Jagielski     aFlags = i_aFlags;
106*b1cdbd2cSJim Jagielski     nReturnType = 0;
107*b1cdbd2cSJim Jagielski     pStati->SetCur(afterName);
108*b1cdbd2cSJim Jagielski }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski void
Init_Dtor(const String & i_sName,bool i_bVirtual,ary::cpp::FunctionFlags i_aFlags)111*b1cdbd2cSJim Jagielski PE_Function::Init_Dtor( const String  &         i_sName,
112*b1cdbd2cSJim Jagielski                         bool                    i_bVirtual,
113*b1cdbd2cSJim Jagielski                         ary::cpp::FunctionFlags i_aFlags )
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski     aName << "~" << i_sName;
116*b1cdbd2cSJim Jagielski     eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
117*b1cdbd2cSJim Jagielski     aFlags = i_aFlags;
118*b1cdbd2cSJim Jagielski     nReturnType = 0;
119*b1cdbd2cSJim Jagielski     pStati->SetCur(afterName);
120*b1cdbd2cSJim Jagielski }
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski void
Init_CastOperator(bool i_bVirtual,ary::cpp::FunctionFlags i_aFlags)123*b1cdbd2cSJim Jagielski PE_Function::Init_CastOperator( bool                    i_bVirtual,
124*b1cdbd2cSJim Jagielski                                 ary::cpp::FunctionFlags i_aFlags )
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski     aName << "operator ";
127*b1cdbd2cSJim Jagielski     eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
128*b1cdbd2cSJim Jagielski     aFlags = i_aFlags;
129*b1cdbd2cSJim Jagielski     nReturnType = 0;
130*b1cdbd2cSJim Jagielski     pStati->SetCur(afterCastOperator);
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski void
Init_NormalOperator(ary::cpp::Type_id i_nReturnType,bool i_bVirtual,ary::cpp::FunctionFlags i_aFlags)134*b1cdbd2cSJim Jagielski PE_Function::Init_NormalOperator( ary::cpp::Type_id                  i_nReturnType,
135*b1cdbd2cSJim Jagielski 	                              bool                      i_bVirtual,
136*b1cdbd2cSJim Jagielski                                   ary::cpp::FunctionFlags   i_aFlags )
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski     aName << "operator";
139*b1cdbd2cSJim Jagielski     eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
140*b1cdbd2cSJim Jagielski     aFlags = i_aFlags;
141*b1cdbd2cSJim Jagielski     nReturnType = i_nReturnType;
142*b1cdbd2cSJim Jagielski     pStati->SetCur(afterStdOperator);
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski ary::cpp::Ce_id
Result_Id() const146*b1cdbd2cSJim Jagielski PE_Function::Result_Id() const
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski 	return nResult;
149*b1cdbd2cSJim Jagielski }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski void
Call_Handler(const cpp::Token & i_rTok)152*b1cdbd2cSJim Jagielski PE_Function::Call_Handler( const cpp::Token & i_rTok )
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski 	pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text());
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski void
Setup_StatusFunctions()158*b1cdbd2cSJim Jagielski PE_Function::Setup_StatusFunctions()
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski 	typedef CallFunction<PE_Function>::F_Tok	F_Tok;
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 	static F_Tok stateF_afterStdOperator[] =
163*b1cdbd2cSJim Jagielski                                             { &PE_Function::On_afterOperator_Std_Operator,
164*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_LeftBracket,
165*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_LeftBracket,
166*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_Operator,
167*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_Operator,
168*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_Operator,
169*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_Operator,
170*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_Operator,
171*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Std_Operator };
172*b1cdbd2cSJim Jagielski 	static INT16 stateT_afterStdOperator[] =
173*b1cdbd2cSJim Jagielski                                             { Tid_Operator,
174*b1cdbd2cSJim Jagielski 											  Tid_ArrayBracket_Left,
175*b1cdbd2cSJim Jagielski 											  Tid_Bracket_Left,
176*b1cdbd2cSJim Jagielski 											  Tid_Comma,
177*b1cdbd2cSJim Jagielski 											  Tid_Assign,
178*b1cdbd2cSJim Jagielski 											  Tid_Less,
179*b1cdbd2cSJim Jagielski 											  Tid_Greater,
180*b1cdbd2cSJim Jagielski 											  Tid_Asterix,
181*b1cdbd2cSJim Jagielski 											  Tid_AmpersAnd };
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 	static F_Tok stateF_afterStdOperatorLeftBracket[] =
184*b1cdbd2cSJim Jagielski                                             { &PE_Function::On_afterStdOperatorLeftBracket_RightBracket,
185*b1cdbd2cSJim Jagielski                                               &PE_Function::On_afterStdOperatorLeftBracket_RightBracket };
186*b1cdbd2cSJim Jagielski 	static INT16 stateT_afterStdOperatorLeftBracket[] =
187*b1cdbd2cSJim Jagielski                                             { Tid_ArrayBracket_Right,
188*b1cdbd2cSJim Jagielski 											  Tid_Bracket_Right };
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 	static F_Tok stateF_afterCastOperator[] =
191*b1cdbd2cSJim Jagielski                                             { &PE_Function::On_afterOperator_Cast_Type,
192*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
193*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
194*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
195*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
196*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
197*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
198*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
199*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
200*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type,
201*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterOperator_Cast_Type };
202*b1cdbd2cSJim Jagielski 	static INT16 stateT_afterCastOperator[] =
203*b1cdbd2cSJim Jagielski                                             { Tid_Identifier,
204*b1cdbd2cSJim Jagielski 											  Tid_class,
205*b1cdbd2cSJim Jagielski 											  Tid_struct,
206*b1cdbd2cSJim Jagielski 											  Tid_union,
207*b1cdbd2cSJim Jagielski 											  Tid_enum,
208*b1cdbd2cSJim Jagielski 											  Tid_const,
209*b1cdbd2cSJim Jagielski 											  Tid_volatile,
210*b1cdbd2cSJim Jagielski 											  Tid_DoubleColon,
211*b1cdbd2cSJim Jagielski                                               Tid_typename,
212*b1cdbd2cSJim Jagielski 											  Tid_BuiltInType,
213*b1cdbd2cSJim Jagielski 											  Tid_TypeSpecializer };
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	static F_Tok stateF_afterName[] =		{ &PE_Function::On_afterName_Bracket_Left };
216*b1cdbd2cSJim Jagielski 	static INT16 stateT_afterName[] =     	{ Tid_Bracket_Left };
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 	static F_Tok stateF_expectParameterSeparator[] =
219*b1cdbd2cSJim Jagielski 											{ &PE_Function::On_expectParameterSeparator_BracketRight,
220*b1cdbd2cSJim Jagielski 											  &PE_Function::On_expectParameterSeparator_Comma };
221*b1cdbd2cSJim Jagielski 	static INT16 stateT_expectParameterSeparator[] =
222*b1cdbd2cSJim Jagielski 											{ Tid_Bracket_Right,
223*b1cdbd2cSJim Jagielski 											  Tid_Comma };
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	static F_Tok stateF_afterParameters[] =	{ &PE_Function::On_afterParameters_const,
226*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterParameters_volatile,
227*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterParameters_throw,
228*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterParameters_SwBracket_Left,
229*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterParameters_Semicolon,
230*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterParameters_Comma,
231*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterParameters_Colon,
232*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterParameters_Assign };
233*b1cdbd2cSJim Jagielski 	static INT16 stateT_afterParameters[] = { Tid_const,
234*b1cdbd2cSJim Jagielski 											  Tid_volatile,
235*b1cdbd2cSJim Jagielski 											  Tid_throw,
236*b1cdbd2cSJim Jagielski                                               Tid_SwBracket_Left,
237*b1cdbd2cSJim Jagielski 											  Tid_Semicolon,
238*b1cdbd2cSJim Jagielski 											  Tid_Comma,
239*b1cdbd2cSJim Jagielski                                               Tid_Colon,
240*b1cdbd2cSJim Jagielski 											  Tid_Assign };
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 	static F_Tok stateF_afterThrow[] =		{ &PE_Function::On_afterThrow_Bracket_Left };
243*b1cdbd2cSJim Jagielski 	static INT16 stateT_afterThrow[] =     	{ Tid_Bracket_Left };
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	static F_Tok stateF_expectExceptionSeparator[] =
246*b1cdbd2cSJim Jagielski 											{ &PE_Function::On_expectExceptionSeparator_BracketRight,
247*b1cdbd2cSJim Jagielski 											  &PE_Function::On_expectExceptionSeparator_Comma };
248*b1cdbd2cSJim Jagielski 	static INT16 stateT_expectExceptionSeparator[] =
249*b1cdbd2cSJim Jagielski 											{ Tid_Bracket_Right,
250*b1cdbd2cSJim Jagielski 											  Tid_Comma };
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	static F_Tok stateF_afterExceptions[] =	{ &PE_Function::On_afterExceptions_SwBracket_Left,
253*b1cdbd2cSJim Jagielski                                               &PE_Function::On_afterExceptions_Semicolon,
254*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterExceptions_Comma,
255*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterExceptions_Colon,
256*b1cdbd2cSJim Jagielski 											  &PE_Function::On_afterExceptions_Assign };
257*b1cdbd2cSJim Jagielski 	static INT16 stateT_afterExceptions[] = { Tid_SwBracket_Left,
258*b1cdbd2cSJim Jagielski                                               Tid_Semicolon,
259*b1cdbd2cSJim Jagielski 											  Tid_Comma,
260*b1cdbd2cSJim Jagielski 											  Tid_Colon,
261*b1cdbd2cSJim Jagielski 											  Tid_Assign };
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 	static F_Tok stateF_expectZero[] =		{ &PE_Function::On_expectZero_Constant };
264*b1cdbd2cSJim Jagielski 	static INT16 stateT_expectZero[] =     	{ Tid_Constant };
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	static F_Tok stateF_inImplementation[] =
267*b1cdbd2cSJim Jagielski                                             { &PE_Function::On_inImplementation_SwBracket_Left,
268*b1cdbd2cSJim Jagielski                                               &PE_Function::On_inImplementation_SwBracket_Right };
269*b1cdbd2cSJim Jagielski 	static INT16 stateT_inImplementation[] =
270*b1cdbd2cSJim Jagielski                                             { Tid_SwBracket_Left,
271*b1cdbd2cSJim Jagielski                                               Tid_SwBracket_Right };
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, afterStdOperator, Hdl_SyntaxError);
274*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, afterStdOperatorLeftBracket, Hdl_SyntaxError);
275*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, afterCastOperator, Hdl_SyntaxError);
276*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, afterName, Hdl_SyntaxError);
277*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, expectParameterSeparator, Hdl_SyntaxError);
278*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, afterParameters, Hdl_SyntaxError);
279*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, afterThrow, Hdl_SyntaxError);
280*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, expectExceptionSeparator, Hdl_SyntaxError);
281*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, afterExceptions, Hdl_SyntaxError);
282*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, expectZero, Hdl_SyntaxError);
283*b1cdbd2cSJim Jagielski 	SEMPARSE_CREATE_STATUS(PE_Function, inImplementation, On_inImplementation_Default );
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski void
InitData()287*b1cdbd2cSJim Jagielski PE_Function::InitData()
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski     pStati->SetCur( afterName ),
290*b1cdbd2cSJim Jagielski 	nResult = 0;
291*b1cdbd2cSJim Jagielski     bResult_WithImplementation = false;
292*b1cdbd2cSJim Jagielski     aName.seekp(0);
293*b1cdbd2cSJim Jagielski     eVirtuality = ary::cpp::VIRTUAL_none;
294*b1cdbd2cSJim Jagielski     eConVol = ary::cpp::CONVOL_none;
295*b1cdbd2cSJim Jagielski     aFlags.Reset();
296*b1cdbd2cSJim Jagielski     nReturnType = 0;
297*b1cdbd2cSJim Jagielski     csv::erase_container(aParameters);
298*b1cdbd2cSJim Jagielski     csv::erase_container(aExceptions);
299*b1cdbd2cSJim Jagielski     bThrow = false;
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski void
TransferData()303*b1cdbd2cSJim Jagielski PE_Function::TransferData()
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski     String  sName( aName.c_str() );
306*b1cdbd2cSJim Jagielski     ary::cpp::Function *
307*b1cdbd2cSJim Jagielski         pFunction = Env().AryGate().Ces().Store_Operation(
308*b1cdbd2cSJim Jagielski                                                 Env().Context(),
309*b1cdbd2cSJim Jagielski                                                 sName,
310*b1cdbd2cSJim Jagielski                                                 nReturnType,
311*b1cdbd2cSJim Jagielski                                                 aParameters,
312*b1cdbd2cSJim Jagielski                                                 eVirtuality,
313*b1cdbd2cSJim Jagielski                                                 eConVol,
314*b1cdbd2cSJim Jagielski                                                 aFlags,
315*b1cdbd2cSJim Jagielski                                                 bThrow,
316*b1cdbd2cSJim Jagielski                                                 aExceptions );
317*b1cdbd2cSJim Jagielski     if (pFunction != 0)
318*b1cdbd2cSJim Jagielski     {
319*b1cdbd2cSJim Jagielski         // KORR_FUTURE: How to handle differing documentation?
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski         Dyn< StringVector >
322*b1cdbd2cSJim Jagielski                 pTplParams ( Env().Get_CurTemplateParameters() );
323*b1cdbd2cSJim Jagielski         if ( pTplParams )
324*b1cdbd2cSJim Jagielski         {
325*b1cdbd2cSJim Jagielski           	for ( StringVector::const_iterator it = pTplParams->begin();
326*b1cdbd2cSJim Jagielski     	    	  it !=  pTplParams->end();
327*b1cdbd2cSJim Jagielski     		      ++it )
328*b1cdbd2cSJim Jagielski         	{
329*b1cdbd2cSJim Jagielski     	    	pFunction->Add_TemplateParameterType( *it, ary::cpp::Type_id(0) );
330*b1cdbd2cSJim Jagielski         	}  // end for
331*b1cdbd2cSJim Jagielski         }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski         Env().Event_Store_Function(*pFunction);
334*b1cdbd2cSJim Jagielski     }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski     pStati->SetCur(size_of_states);
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski void
Hdl_SyntaxError(const char * i_sText)340*b1cdbd2cSJim Jagielski PE_Function::Hdl_SyntaxError(const char * i_sText)
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski     StdHandlingOfSyntaxError(i_sText);
343*b1cdbd2cSJim Jagielski }
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski void
SpInit_CastOperatorType()346*b1cdbd2cSJim Jagielski PE_Function::SpInit_CastOperatorType()
347*b1cdbd2cSJim Jagielski {
348*b1cdbd2cSJim Jagielski     pSpuCastOperatorType->Child().Init_AsCastOperatorType();
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski void
SpReturn_Parameter()352*b1cdbd2cSJim Jagielski PE_Function::SpReturn_Parameter()
353*b1cdbd2cSJim Jagielski {
354*b1cdbd2cSJim Jagielski     pStati->SetCur(expectParameterSeparator);
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 	ary::cpp::Type_id nParamType = pSpuParameter->Child().Result_FrontType();
357*b1cdbd2cSJim Jagielski 	if ( nParamType.IsValid() )      // Check, if there was a parameter, or only the closing ')'.
358*b1cdbd2cSJim Jagielski 	{
359*b1cdbd2cSJim Jagielski 	    aParameters.push_back( pSpuParameter->Child().Result_ParamInfo() );
360*b1cdbd2cSJim Jagielski 	}
361*b1cdbd2cSJim Jagielski }
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski void
SpReturn_Exception()364*b1cdbd2cSJim Jagielski PE_Function::SpReturn_Exception()
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski     pStati->SetCur(expectExceptionSeparator);
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski     ary::cpp::Type_id
369*b1cdbd2cSJim Jagielski         nException = pSpuException->Child().Result_Type().TypeId();
370*b1cdbd2cSJim Jagielski     if ( nException.IsValid() AND pSpuException->Child().Result_KindOf() == PE_Type::is_type )
371*b1cdbd2cSJim Jagielski     {
372*b1cdbd2cSJim Jagielski         aExceptions.push_back( nException );
373*b1cdbd2cSJim Jagielski     }
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski void
SpReturn_CastOperatorType()377*b1cdbd2cSJim Jagielski PE_Function::SpReturn_CastOperatorType()
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski     pStati->SetCur(afterName);
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski     Env().AryGate().Types().Get_TypeText(
382*b1cdbd2cSJim Jagielski             aName, pSpuCastOperatorType->Child().Result_Type().TypeId() );
383*b1cdbd2cSJim Jagielski }
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski void
On_afterOperator_Std_Operator(const char * i_sText)386*b1cdbd2cSJim Jagielski PE_Function::On_afterOperator_Std_Operator(const char * i_sText)
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
389*b1cdbd2cSJim Jagielski     pStati->SetCur(afterName);
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski     if ( 'a' <= *i_sText AND *i_sText <= 'z' )
392*b1cdbd2cSJim Jagielski         aName << ' ';
393*b1cdbd2cSJim Jagielski     aName << i_sText;
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski void
On_afterOperator_Std_LeftBracket(const char * i_sText)397*b1cdbd2cSJim Jagielski PE_Function::On_afterOperator_Std_LeftBracket(const char * i_sText)
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
400*b1cdbd2cSJim Jagielski     pStati->SetCur(afterStdOperatorLeftBracket);
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski     aName << i_sText;
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski void
On_afterStdOperatorLeftBracket_RightBracket(const char * i_sText)406*b1cdbd2cSJim Jagielski PE_Function::On_afterStdOperatorLeftBracket_RightBracket(const char * i_sText)
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
409*b1cdbd2cSJim Jagielski     pStati->SetCur(afterName);
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski     aName << i_sText;
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski void
On_afterOperator_Cast_Type(const char *)415*b1cdbd2cSJim Jagielski PE_Function::On_afterOperator_Cast_Type(const char *)
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski     pSpuCastOperatorType->Push(not_done);
418*b1cdbd2cSJim Jagielski }
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski void
On_afterName_Bracket_Left(const char *)421*b1cdbd2cSJim Jagielski PE_Function::On_afterName_Bracket_Left(const char *)
422*b1cdbd2cSJim Jagielski {
423*b1cdbd2cSJim Jagielski     pSpuParameter->Push(done);
424*b1cdbd2cSJim Jagielski }
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski void
On_expectParameterSeparator_BracketRight(const char *)427*b1cdbd2cSJim Jagielski PE_Function::On_expectParameterSeparator_BracketRight(const char *)
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
430*b1cdbd2cSJim Jagielski     pStati->SetCur(afterParameters);
431*b1cdbd2cSJim Jagielski }
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski void
On_expectParameterSeparator_Comma(const char *)434*b1cdbd2cSJim Jagielski PE_Function::On_expectParameterSeparator_Comma(const char *)
435*b1cdbd2cSJim Jagielski {
436*b1cdbd2cSJim Jagielski     pSpuParameter->Push(done);
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski void
On_afterParameters_const(const char *)440*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_const(const char *)
441*b1cdbd2cSJim Jagielski {
442*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
443*b1cdbd2cSJim Jagielski     eConVol = static_cast<E_ConVol>(
444*b1cdbd2cSJim Jagielski                     static_cast<int>(eConVol) | static_cast<int>(ary::cpp::CONVOL_const) );
445*b1cdbd2cSJim Jagielski }
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski void
On_afterParameters_volatile(const char *)448*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_volatile(const char *)
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
451*b1cdbd2cSJim Jagielski     eConVol = static_cast<E_ConVol>(
452*b1cdbd2cSJim Jagielski                     static_cast<int>(eConVol) | static_cast<int>(ary::cpp::CONVOL_volatile) );
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski void
On_afterParameters_throw(const char *)456*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_throw(const char *)
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
459*b1cdbd2cSJim Jagielski     pStati->SetCur(afterThrow);
460*b1cdbd2cSJim Jagielski     bThrow = true;
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski void
On_afterParameters_SwBracket_Left(const char *)464*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_SwBracket_Left(const char *)
465*b1cdbd2cSJim Jagielski {
466*b1cdbd2cSJim Jagielski     EnterImplementation(1);
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski void
On_afterParameters_Semicolon(const char *)470*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_Semicolon(const char *)
471*b1cdbd2cSJim Jagielski {
472*b1cdbd2cSJim Jagielski     PerformFinishingPunctuation();
473*b1cdbd2cSJim Jagielski }
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski void
On_afterParameters_Comma(const char *)476*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_Comma(const char *)
477*b1cdbd2cSJim Jagielski {
478*b1cdbd2cSJim Jagielski     PerformFinishingPunctuation();
479*b1cdbd2cSJim Jagielski }
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski void
On_afterParameters_Colon(const char *)482*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_Colon(const char *)
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski     EnterImplementation(0);
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski void
On_afterParameters_Assign(const char *)488*b1cdbd2cSJim Jagielski PE_Function::On_afterParameters_Assign(const char *)
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
491*b1cdbd2cSJim Jagielski     pStati->SetCur(expectZero);
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski void
On_afterThrow_Bracket_Left(const char *)495*b1cdbd2cSJim Jagielski PE_Function::On_afterThrow_Bracket_Left(const char *)
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski     pSpuException->Push(done);
498*b1cdbd2cSJim Jagielski }
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski void
On_expectExceptionSeparator_BracketRight(const char *)501*b1cdbd2cSJim Jagielski PE_Function::On_expectExceptionSeparator_BracketRight(const char *)
502*b1cdbd2cSJim Jagielski {
503*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
504*b1cdbd2cSJim Jagielski     pStati->SetCur(afterExceptions);
505*b1cdbd2cSJim Jagielski }
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski void
On_expectExceptionSeparator_Comma(const char *)508*b1cdbd2cSJim Jagielski PE_Function::On_expectExceptionSeparator_Comma(const char *)
509*b1cdbd2cSJim Jagielski {
510*b1cdbd2cSJim Jagielski     pSpuException->Push(done);
511*b1cdbd2cSJim Jagielski }
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski void
On_afterExceptions_SwBracket_Left(const char *)514*b1cdbd2cSJim Jagielski PE_Function::On_afterExceptions_SwBracket_Left(const char *)
515*b1cdbd2cSJim Jagielski {
516*b1cdbd2cSJim Jagielski     EnterImplementation(1);
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski void
On_afterExceptions_Semicolon(const char *)520*b1cdbd2cSJim Jagielski PE_Function::On_afterExceptions_Semicolon(const char *)
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski     PerformFinishingPunctuation();
523*b1cdbd2cSJim Jagielski }
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski void
On_afterExceptions_Comma(const char *)526*b1cdbd2cSJim Jagielski PE_Function::On_afterExceptions_Comma(const char *)
527*b1cdbd2cSJim Jagielski {
528*b1cdbd2cSJim Jagielski     PerformFinishingPunctuation();
529*b1cdbd2cSJim Jagielski }
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski void
On_afterExceptions_Colon(const char *)532*b1cdbd2cSJim Jagielski PE_Function::On_afterExceptions_Colon(const char *)
533*b1cdbd2cSJim Jagielski {
534*b1cdbd2cSJim Jagielski     EnterImplementation(0);
535*b1cdbd2cSJim Jagielski }
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski void
On_afterExceptions_Assign(const char *)538*b1cdbd2cSJim Jagielski PE_Function::On_afterExceptions_Assign(const char *)
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
541*b1cdbd2cSJim Jagielski     pStati->SetCur(expectZero);
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski void
On_expectZero_Constant(const char * i_sText)545*b1cdbd2cSJim Jagielski PE_Function::On_expectZero_Constant(const char * i_sText)
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski     if ( strcmp(i_sText,"0") != 0 )
548*b1cdbd2cSJim Jagielski         Hdl_SyntaxError(i_sText);
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
551*b1cdbd2cSJim Jagielski     pStati->SetCur(afterExceptions);
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski     eVirtuality = ary::cpp::VIRTUAL_abstract;
554*b1cdbd2cSJim Jagielski }
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski void
On_inImplementation_SwBracket_Left(const char *)557*b1cdbd2cSJim Jagielski PE_Function::On_inImplementation_SwBracket_Left(const char *)
558*b1cdbd2cSJim Jagielski {
559*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
560*b1cdbd2cSJim Jagielski     nBracketCounterInImplementation++;
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski void
On_inImplementation_SwBracket_Right(const char *)564*b1cdbd2cSJim Jagielski PE_Function::On_inImplementation_SwBracket_Right(const char *)
565*b1cdbd2cSJim Jagielski {
566*b1cdbd2cSJim Jagielski     nBracketCounterInImplementation--;
567*b1cdbd2cSJim Jagielski     if (nBracketCounterInImplementation == 0)
568*b1cdbd2cSJim Jagielski     {
569*b1cdbd2cSJim Jagielski         SetTokenResult(done,pop_success);
570*b1cdbd2cSJim Jagielski     }
571*b1cdbd2cSJim Jagielski     else
572*b1cdbd2cSJim Jagielski     {
573*b1cdbd2cSJim Jagielski         SetTokenResult(done,stay);
574*b1cdbd2cSJim Jagielski     }
575*b1cdbd2cSJim Jagielski }
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski void
On_inImplementation_Default(const char *)578*b1cdbd2cSJim Jagielski PE_Function::On_inImplementation_Default(const char *)
579*b1cdbd2cSJim Jagielski {
580*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
581*b1cdbd2cSJim Jagielski }
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski void
EnterImplementation(intt i_nBracketCountStart)584*b1cdbd2cSJim Jagielski PE_Function::EnterImplementation( intt i_nBracketCountStart )
585*b1cdbd2cSJim Jagielski {
586*b1cdbd2cSJim Jagielski     SetTokenResult(done,stay);
587*b1cdbd2cSJim Jagielski     pStati->SetCur(inImplementation);
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski     bResult_WithImplementation = true;
590*b1cdbd2cSJim Jagielski     nBracketCounterInImplementation = i_nBracketCountStart;
591*b1cdbd2cSJim Jagielski     if ( Env().Context().CurClass() != 0 )
592*b1cdbd2cSJim Jagielski     {
593*b1cdbd2cSJim Jagielski         aFlags.SetInline();
594*b1cdbd2cSJim Jagielski     }
595*b1cdbd2cSJim Jagielski }
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski }   // namespace cpp
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski 
605