1*78bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*78bc99aaSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*78bc99aaSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*78bc99aaSAndrew Rist  * distributed with this work for additional information
6*78bc99aaSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*78bc99aaSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*78bc99aaSAndrew Rist  * "License"); you may not use this file except in compliance
9*78bc99aaSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*78bc99aaSAndrew Rist  *
11*78bc99aaSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*78bc99aaSAndrew Rist  *
13*78bc99aaSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*78bc99aaSAndrew Rist  * software distributed under the License is distributed on an
15*78bc99aaSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*78bc99aaSAndrew Rist  * KIND, either express or implied.  See the License for the
17*78bc99aaSAndrew Rist  * specific language governing permissions and limitations
18*78bc99aaSAndrew Rist  * under the License.
19*78bc99aaSAndrew Rist  *
20*78bc99aaSAndrew Rist  *************************************************************/
21cdf0e10cSrcweir 
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include "pe_param.hxx"
24cdf0e10cSrcweir 
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
27cdf0e10cSrcweir #include <cosv/tpl/tpltools.hxx>
28cdf0e10cSrcweir #include <ary/cpp/c_gate.hxx>
29cdf0e10cSrcweir #include <ary/cpp/cp_type.hxx>
30cdf0e10cSrcweir #include "pe_type.hxx"
31cdf0e10cSrcweir #include "pe_vari.hxx"
32cdf0e10cSrcweir 
33cdf0e10cSrcweir 
34cdf0e10cSrcweir namespace cpp {
35cdf0e10cSrcweir 
36cdf0e10cSrcweir 
37cdf0e10cSrcweir 
38cdf0e10cSrcweir //***********************		PE_Parameter		***********************//
39cdf0e10cSrcweir 
40cdf0e10cSrcweir 
PE_Parameter(Cpp_PE * i_pParent)41cdf0e10cSrcweir PE_Parameter::PE_Parameter( Cpp_PE * i_pParent )
42cdf0e10cSrcweir 	:   Cpp_PE(i_pParent),
43cdf0e10cSrcweir         pStati( new PeStatusArray<PE_Parameter> )
44cdf0e10cSrcweir 	    // pSpType,
45cdf0e10cSrcweir 	    // pSpuType,
46cdf0e10cSrcweir 	    // pSpVariable,
47cdf0e10cSrcweir 	    // pSpuVariable,
48cdf0e10cSrcweir         // aResultParamInfo
49cdf0e10cSrcweir {
50cdf0e10cSrcweir 	Setup_StatusFunctions();
51cdf0e10cSrcweir 
52cdf0e10cSrcweir     pSpType         = new SP_Type(*this);
53cdf0e10cSrcweir 	pSpuType        = new SPU_Type(*pSpType, &PE_Parameter::SpInit_Type, &PE_Parameter::SpReturn_Type);
54cdf0e10cSrcweir 	pSpVariable     = new SP_Variable(*this);
55cdf0e10cSrcweir 	pSpuVariable    = new SPU_Variable(*pSpVariable, &PE_Parameter::SpInit_Variable, &PE_Parameter::SpReturn_Variable);
56cdf0e10cSrcweir }
57cdf0e10cSrcweir 
~PE_Parameter()58cdf0e10cSrcweir PE_Parameter::~PE_Parameter()
59cdf0e10cSrcweir {
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir void
Call_Handler(const cpp::Token & i_rTok)63cdf0e10cSrcweir PE_Parameter::Call_Handler( const cpp::Token & i_rTok )
64cdf0e10cSrcweir {
65cdf0e10cSrcweir 	pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text());
66cdf0e10cSrcweir }
67cdf0e10cSrcweir 
68cdf0e10cSrcweir void
Setup_StatusFunctions()69cdf0e10cSrcweir PE_Parameter::Setup_StatusFunctions()
70cdf0e10cSrcweir {
71cdf0e10cSrcweir 	typedef CallFunction<PE_Parameter>::F_Tok	F_Tok;
72cdf0e10cSrcweir 	static F_Tok stateF_start[] =			{ &PE_Parameter::On_start_Type,
73cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
74cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
75cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
76cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
79cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
80cdf0e10cSrcweir 											  &PE_Parameter::On_start_Bracket_Right,
81cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
82cdf0e10cSrcweir                                               &PE_Parameter::On_start_Ellipse,
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
85cdf0e10cSrcweir 											  &PE_Parameter::On_start_Type,
86cdf0e10cSrcweir                                               &PE_Parameter::On_start_Type };
87cdf0e10cSrcweir 	static INT16 stateT_start[] =       	{ Tid_Identifier,
88cdf0e10cSrcweir 											  Tid_class,
89cdf0e10cSrcweir 											  Tid_struct,
90cdf0e10cSrcweir 											  Tid_union,
91cdf0e10cSrcweir 											  Tid_enum,
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 											  Tid_const,
94cdf0e10cSrcweir 											  Tid_volatile,
95cdf0e10cSrcweir 											  Tid_Bracket_Right,
96cdf0e10cSrcweir 											  Tid_DoubleColon,
97cdf0e10cSrcweir                                               Tid_Ellipse,
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 											  Tid_typename,
100cdf0e10cSrcweir                                               Tid_BuiltInType,
101cdf0e10cSrcweir 											  Tid_TypeSpecializer };
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 	static F_Tok stateF_expectName[] =		{ &PE_Parameter::On_expectName_Identifier,
104cdf0e10cSrcweir 											  &PE_Parameter::On_expectName_ArrayBracket_Left,
105cdf0e10cSrcweir 											  &PE_Parameter::On_expectName_Bracket_Right,
106cdf0e10cSrcweir 											  &PE_Parameter::On_expectName_Comma,
107cdf0e10cSrcweir 											  &PE_Parameter::On_afterName_Assign  };
108cdf0e10cSrcweir 	static INT16 stateT_expectName[] =     	{ Tid_Identifier,
109cdf0e10cSrcweir 											  Tid_ArrayBracket_Left,
110cdf0e10cSrcweir 											  Tid_Bracket_Right,
111cdf0e10cSrcweir                                               Tid_Comma,
112cdf0e10cSrcweir 											  Tid_Assign };
113cdf0e10cSrcweir 	static F_Tok stateF_afterName[] =		{ &PE_Parameter::On_afterName_ArrayBracket_Left,
114cdf0e10cSrcweir 											  &PE_Parameter::On_afterName_Bracket_Right,
115cdf0e10cSrcweir 											  &PE_Parameter::On_afterName_Comma,
116cdf0e10cSrcweir 											  &PE_Parameter::On_afterName_Assign };
117cdf0e10cSrcweir 	static INT16 stateT_afterName[] =     	{ Tid_ArrayBracket_Left,
118cdf0e10cSrcweir 											  Tid_Bracket_Right,
119cdf0e10cSrcweir 											  Tid_Comma,
120cdf0e10cSrcweir 											  Tid_Assign };
121cdf0e10cSrcweir 	static F_Tok stateF_finished[] =		{ &PE_Parameter::On_finished_Comma,
122cdf0e10cSrcweir                                               &PE_Parameter::On_finished_Bracket_Right };
123cdf0e10cSrcweir 	static INT16 stateT_finished[] =     	{ Tid_Bracket_Right,
124cdf0e10cSrcweir 											  Tid_Comma };
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 	SEMPARSE_CREATE_STATUS(PE_Parameter, start, Hdl_SyntaxError);
127cdf0e10cSrcweir 	SEMPARSE_CREATE_STATUS(PE_Parameter, expectName, Hdl_SyntaxError);
128cdf0e10cSrcweir 	SEMPARSE_CREATE_STATUS(PE_Parameter, afterName, Hdl_SyntaxError);
129cdf0e10cSrcweir 	SEMPARSE_CREATE_STATUS(PE_Parameter, finished, Hdl_SyntaxError);
130cdf0e10cSrcweir }
131cdf0e10cSrcweir 
132cdf0e10cSrcweir 
133cdf0e10cSrcweir void
InitData()134cdf0e10cSrcweir PE_Parameter::InitData()
135cdf0e10cSrcweir {
136cdf0e10cSrcweir 	pStati->SetCur(start);
137cdf0e10cSrcweir     aResultParamInfo.Empty();
138cdf0e10cSrcweir }
139cdf0e10cSrcweir 
140cdf0e10cSrcweir void
TransferData()141cdf0e10cSrcweir PE_Parameter::TransferData()
142cdf0e10cSrcweir {
143cdf0e10cSrcweir 	pStati->SetCur(size_of_states);
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir void
Hdl_SyntaxError(const char * i_sText)147cdf0e10cSrcweir PE_Parameter::Hdl_SyntaxError( const char * i_sText)
148cdf0e10cSrcweir {
149cdf0e10cSrcweir 	StdHandlingOfSyntaxError(i_sText);
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir void
SpInit_Type()153cdf0e10cSrcweir PE_Parameter::SpInit_Type()
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     // Does nothing.
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir void
SpInit_Variable()159cdf0e10cSrcweir PE_Parameter::SpInit_Variable()
160cdf0e10cSrcweir {
161cdf0e10cSrcweir     // Does nothing.
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir void
SpReturn_Type()165cdf0e10cSrcweir PE_Parameter::SpReturn_Type()
166cdf0e10cSrcweir {
167cdf0e10cSrcweir     aResultParamInfo.nType = pSpuType->Child().Result_Type().Id();
168cdf0e10cSrcweir 	pStati->SetCur(expectName);
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir void
SpReturn_Variable()172cdf0e10cSrcweir PE_Parameter::SpReturn_Variable()
173cdf0e10cSrcweir {
174cdf0e10cSrcweir     if (pSpuVariable->Child().Result_Pattern() > 0)
175cdf0e10cSrcweir     {
176cdf0e10cSrcweir         aResultParamInfo.sSizeExpression = pSpuVariable->Child().Result_SizeExpression();
177cdf0e10cSrcweir         aResultParamInfo.sInitExpression = pSpuVariable->Child().Result_InitExpression();
178cdf0e10cSrcweir     }
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir void
On_start_Type(const char *)182cdf0e10cSrcweir PE_Parameter::On_start_Type(const char *)
183cdf0e10cSrcweir {
184cdf0e10cSrcweir     pSpuType->Push(not_done);
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir void
On_start_Bracket_Right(const char *)188cdf0e10cSrcweir PE_Parameter::On_start_Bracket_Right(const char *)
189cdf0e10cSrcweir {
190cdf0e10cSrcweir 	SetTokenResult(not_done, pop_success);
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir void
On_start_Ellipse(const char *)194cdf0e10cSrcweir PE_Parameter::On_start_Ellipse(const char *)
195cdf0e10cSrcweir {
196cdf0e10cSrcweir 	SetTokenResult(done, pop_success);
197cdf0e10cSrcweir 
198cdf0e10cSrcweir     aResultParamInfo.nType = Env().AryGate().Types().Tid_Ellipse();
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
201cdf0e10cSrcweir void
On_expectName_Identifier(const char * i_sText)202cdf0e10cSrcweir PE_Parameter::On_expectName_Identifier(const char * i_sText)
203cdf0e10cSrcweir {
204cdf0e10cSrcweir 	SetTokenResult(done, stay);
205cdf0e10cSrcweir 	pStati->SetCur(afterName);
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     aResultParamInfo.sName = i_sText;
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir void
On_expectName_ArrayBracket_Left(const char * i_sText)211cdf0e10cSrcweir PE_Parameter::On_expectName_ArrayBracket_Left(const char * i_sText)
212cdf0e10cSrcweir {
213cdf0e10cSrcweir     On_afterName_ArrayBracket_Left(i_sText);
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir void
On_expectName_Bracket_Right(const char * i_sText)217cdf0e10cSrcweir PE_Parameter::On_expectName_Bracket_Right(const char * i_sText)
218cdf0e10cSrcweir {
219cdf0e10cSrcweir     On_afterName_Bracket_Right(i_sText);
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
222cdf0e10cSrcweir void
On_expectName_Comma(const char * i_sText)223cdf0e10cSrcweir PE_Parameter::On_expectName_Comma(const char * i_sText)
224cdf0e10cSrcweir {
225cdf0e10cSrcweir     On_afterName_Comma(i_sText);
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir void
On_afterName_ArrayBracket_Left(const char *)229cdf0e10cSrcweir PE_Parameter::On_afterName_ArrayBracket_Left(const char *)
230cdf0e10cSrcweir {
231cdf0e10cSrcweir     pSpuVariable->Push(not_done);
232cdf0e10cSrcweir }
233cdf0e10cSrcweir 
234cdf0e10cSrcweir void
On_afterName_Bracket_Right(const char *)235cdf0e10cSrcweir PE_Parameter::On_afterName_Bracket_Right(const char *)
236cdf0e10cSrcweir {
237cdf0e10cSrcweir     SetTokenResult(not_done, pop_success);
238cdf0e10cSrcweir }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir void
On_afterName_Comma(const char *)241cdf0e10cSrcweir PE_Parameter::On_afterName_Comma(const char *)
242cdf0e10cSrcweir {
243cdf0e10cSrcweir     SetTokenResult(not_done, pop_success);
244cdf0e10cSrcweir }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir void
On_afterName_Assign(const char *)247cdf0e10cSrcweir PE_Parameter::On_afterName_Assign(const char *)
248cdf0e10cSrcweir {
249cdf0e10cSrcweir     pSpuVariable->Push(not_done);
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir void
On_finished_Bracket_Right(const char *)253cdf0e10cSrcweir PE_Parameter::On_finished_Bracket_Right(const char *)
254cdf0e10cSrcweir {
255cdf0e10cSrcweir 	SetTokenResult(not_done, pop_success);
256cdf0e10cSrcweir }
257cdf0e10cSrcweir 
258cdf0e10cSrcweir void
On_finished_Comma(const char *)259cdf0e10cSrcweir PE_Parameter::On_finished_Comma(const char *)
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     SetTokenResult(not_done, pop_success);
262cdf0e10cSrcweir }
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 
265cdf0e10cSrcweir }   // namespace cpp
266cdf0e10cSrcweir 
267cdf0e10cSrcweir 
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 
275