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_file.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES
26cdf0e10cSrcweir #include "pe_defs.hxx"
27cdf0e10cSrcweir #include "pe_enum.hxx"
28cdf0e10cSrcweir #include "pe_namsp.hxx"
29cdf0e10cSrcweir #include "pe_tpltp.hxx"
30cdf0e10cSrcweir #include "pe_tydef.hxx"
31cdf0e10cSrcweir #include "pe_vafu.hxx"
32cdf0e10cSrcweir #include "pe_ignor.hxx"
33cdf0e10cSrcweir
34cdf0e10cSrcweir
35cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES
36cdf0e10cSrcweir
37cdf0e10cSrcweir
38cdf0e10cSrcweir namespace cpp
39cdf0e10cSrcweir {
40cdf0e10cSrcweir
PE_File(cpp::PeEnvironment & io_rEnv)41cdf0e10cSrcweir PE_File::PE_File( cpp::PeEnvironment & io_rEnv)
42cdf0e10cSrcweir : Cpp_PE(io_rEnv),
43cdf0e10cSrcweir pEnv(&io_rEnv),
44cdf0e10cSrcweir pStati( new PeStatusArray<PE_File> ),
45cdf0e10cSrcweir // pSpNamespace,
46cdf0e10cSrcweir // pSpTypedef,
47cdf0e10cSrcweir // pSpVarFunc,
48cdf0e10cSrcweir // pSpIgnore,
49cdf0e10cSrcweir // pSpuNamespace,
50cdf0e10cSrcweir // pSpuClass,
51cdf0e10cSrcweir // pSpuTypedef,
52cdf0e10cSrcweir // pSpuVarFunc,
53cdf0e10cSrcweir // pSpuTemplate,
54cdf0e10cSrcweir // pSpuUsing,
55cdf0e10cSrcweir // pSpuIgnoreFailure,
56cdf0e10cSrcweir bWithinSingleExternC(false)
57cdf0e10cSrcweir {
58cdf0e10cSrcweir Setup_StatusFunctions();
59cdf0e10cSrcweir
60cdf0e10cSrcweir pSpNamespace = new SP_Namespace(*this);
61cdf0e10cSrcweir pSpTypedef = new SP_Typedef(*this);
62cdf0e10cSrcweir pSpVarFunc = new SP_VarFunc(*this);
63cdf0e10cSrcweir pSpTemplate = new SP_Template(*this);
64cdf0e10cSrcweir pSpDefs = new SP_Defines(*this);
65cdf0e10cSrcweir pSpIgnore = new SP_Ignore(*this);
66cdf0e10cSrcweir
67cdf0e10cSrcweir pSpuNamespace = new SPU_Namespace(*pSpNamespace, 0, 0);
68cdf0e10cSrcweir pSpuTypedef = new SPU_Typedef(*pSpTypedef, 0, 0);
69cdf0e10cSrcweir pSpuVarFunc = new SPU_VarFunc(*pSpVarFunc, 0, &PE_File::SpReturn_VarFunc);
70cdf0e10cSrcweir pSpuTemplate = new SPU_Template(*pSpTemplate, 0, &PE_File::SpReturn_Template);
71cdf0e10cSrcweir pSpuDefs = new SPU_Defines(*pSpDefs, 0, 0);
72cdf0e10cSrcweir pSpuUsing = new SPU_Ignore(*pSpIgnore, 0, 0);
73cdf0e10cSrcweir pSpuIgnoreFailure
74cdf0e10cSrcweir = new SPU_Ignore(*pSpIgnore, 0, 0);
75cdf0e10cSrcweir }
76cdf0e10cSrcweir
~PE_File()77cdf0e10cSrcweir PE_File::~PE_File()
78cdf0e10cSrcweir {
79cdf0e10cSrcweir }
80cdf0e10cSrcweir
81cdf0e10cSrcweir void
Call_Handler(const cpp::Token & i_rTok)82cdf0e10cSrcweir PE_File::Call_Handler( const cpp::Token & i_rTok )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text());
85cdf0e10cSrcweir }
86cdf0e10cSrcweir
87cdf0e10cSrcweir Cpp_PE *
Handle_ChildFailure()88cdf0e10cSrcweir PE_File::Handle_ChildFailure()
89cdf0e10cSrcweir {
90cdf0e10cSrcweir SetCurSPU(pSpuIgnoreFailure.Ptr());
91cdf0e10cSrcweir return &pSpuIgnoreFailure->Child();
92cdf0e10cSrcweir }
93cdf0e10cSrcweir
94cdf0e10cSrcweir void
Setup_StatusFunctions()95cdf0e10cSrcweir PE_File::Setup_StatusFunctions()
96cdf0e10cSrcweir {
97cdf0e10cSrcweir typedef CallFunction<PE_File>::F_Tok F_Tok;
98cdf0e10cSrcweir static F_Tok stateF_std[] = { &PE_File::On_std_VarFunc,
99cdf0e10cSrcweir &PE_File::On_std_ClassKey,
100cdf0e10cSrcweir &PE_File::On_std_ClassKey,
101cdf0e10cSrcweir &PE_File::On_std_ClassKey,
102cdf0e10cSrcweir &PE_File::On_std_enum,
103cdf0e10cSrcweir
104cdf0e10cSrcweir &PE_File::On_std_typedef,
105cdf0e10cSrcweir &PE_File::On_std_template,
106cdf0e10cSrcweir &PE_File::On_std_VarFunc,
107cdf0e10cSrcweir &PE_File::On_std_VarFunc,
108cdf0e10cSrcweir &PE_File::On_std_extern,
109cdf0e10cSrcweir
110cdf0e10cSrcweir &PE_File::On_std_VarFunc,
111cdf0e10cSrcweir &PE_File::On_std_VarFunc,
112cdf0e10cSrcweir &PE_File::On_std_VarFunc,
113cdf0e10cSrcweir &PE_File::On_std_namespace,
114cdf0e10cSrcweir &PE_File::On_std_using,
115cdf0e10cSrcweir
116cdf0e10cSrcweir &PE_File::On_std_SwBracketRight,
117cdf0e10cSrcweir &PE_File::On_std_VarFunc,
118cdf0e10cSrcweir &PE_File::On_std_VarFunc,
119cdf0e10cSrcweir &PE_File::On_std_DefineName,
120cdf0e10cSrcweir &PE_File::On_std_MacroName,
121cdf0e10cSrcweir
122cdf0e10cSrcweir &PE_File::On_std_VarFunc,
123cdf0e10cSrcweir &PE_File::On_std_VarFunc };
124cdf0e10cSrcweir
125cdf0e10cSrcweir static INT16 stateT_std[] = { Tid_Identifier,
126cdf0e10cSrcweir Tid_class,
127cdf0e10cSrcweir Tid_struct,
128cdf0e10cSrcweir Tid_union,
129cdf0e10cSrcweir Tid_enum,
130cdf0e10cSrcweir
131cdf0e10cSrcweir Tid_typedef,
132cdf0e10cSrcweir Tid_template,
133cdf0e10cSrcweir Tid_const,
134cdf0e10cSrcweir Tid_volatile,
135cdf0e10cSrcweir Tid_extern,
136cdf0e10cSrcweir
137cdf0e10cSrcweir Tid_static,
138cdf0e10cSrcweir Tid_register,
139cdf0e10cSrcweir Tid_inline,
140cdf0e10cSrcweir Tid_namespace,
141cdf0e10cSrcweir Tid_using,
142cdf0e10cSrcweir
143cdf0e10cSrcweir Tid_SwBracket_Right,
144cdf0e10cSrcweir Tid_DoubleColon,
145cdf0e10cSrcweir Tid_typename,
146cdf0e10cSrcweir Tid_DefineName,
147cdf0e10cSrcweir Tid_MacroName,
148cdf0e10cSrcweir
149cdf0e10cSrcweir Tid_BuiltInType,
150cdf0e10cSrcweir Tid_TypeSpecializer };
151cdf0e10cSrcweir
152cdf0e10cSrcweir static F_Tok stateF_in_extern[] = { &PE_File::On_in_extern_Constant };
153cdf0e10cSrcweir static INT16 stateT_in_extern[] = { Tid_Constant };
154cdf0e10cSrcweir
155cdf0e10cSrcweir static F_Tok stateF_in_externC[] = { &PE_File::On_in_externC_SwBracket_Left };
156cdf0e10cSrcweir static INT16 stateT_in_externC[] = { Tid_SwBracket_Left };
157cdf0e10cSrcweir
158cdf0e10cSrcweir
159cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_File, std, Hdl_SyntaxError);
160cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_File, in_extern, On_in_extern_Ignore);
161cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_File, in_externC, On_in_externC_NoBlock);
162cdf0e10cSrcweir }
163cdf0e10cSrcweir
164cdf0e10cSrcweir void
InitData()165cdf0e10cSrcweir PE_File::InitData()
166cdf0e10cSrcweir {
167cdf0e10cSrcweir pStati->SetCur(std);
168cdf0e10cSrcweir }
169cdf0e10cSrcweir
170cdf0e10cSrcweir void
TransferData()171cdf0e10cSrcweir PE_File::TransferData()
172cdf0e10cSrcweir {
173cdf0e10cSrcweir pStati->SetCur(size_of_states);
174cdf0e10cSrcweir }
175cdf0e10cSrcweir
176cdf0e10cSrcweir void
Hdl_SyntaxError(const char * i_sText)177cdf0e10cSrcweir PE_File::Hdl_SyntaxError( const char * i_sText)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir if ( *i_sText == ';' )
180cdf0e10cSrcweir {
181cdf0e10cSrcweir Cerr() << Env().CurFileName() << ", line "
182cdf0e10cSrcweir << Env().LineCount()
183cdf0e10cSrcweir << ": Sourcecode warning: ';' as a toplevel declaration is deprecated."
184cdf0e10cSrcweir << Endl();
185cdf0e10cSrcweir SetTokenResult(done,stay);
186cdf0e10cSrcweir return;
187cdf0e10cSrcweir }
188cdf0e10cSrcweir
189cdf0e10cSrcweir StdHandlingOfSyntaxError(i_sText);
190cdf0e10cSrcweir }
191cdf0e10cSrcweir
192cdf0e10cSrcweir void
SpReturn_VarFunc()193cdf0e10cSrcweir PE_File::SpReturn_VarFunc()
194cdf0e10cSrcweir {
195cdf0e10cSrcweir if (bWithinSingleExternC)
196cdf0e10cSrcweir {
197cdf0e10cSrcweir access_Env().CloseBlock();
198cdf0e10cSrcweir bWithinSingleExternC = false;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202cdf0e10cSrcweir void
SpReturn_Template()203cdf0e10cSrcweir PE_File::SpReturn_Template()
204cdf0e10cSrcweir {
205cdf0e10cSrcweir access_Env().OpenTemplate( pSpuTemplate->Child().Result_Parameters() );
206cdf0e10cSrcweir }
207cdf0e10cSrcweir
208cdf0e10cSrcweir void
On_std_namespace(const char *)209cdf0e10cSrcweir PE_File::On_std_namespace(const char * )
210cdf0e10cSrcweir {
211cdf0e10cSrcweir pSpuNamespace->Push(done);
212cdf0e10cSrcweir }
213cdf0e10cSrcweir
214cdf0e10cSrcweir void
On_std_ClassKey(const char *)215cdf0e10cSrcweir PE_File::On_std_ClassKey(const char * )
216cdf0e10cSrcweir {
217cdf0e10cSrcweir pSpuVarFunc->Push(not_done); // This is correct,
218cdf0e10cSrcweir // classes are parsed via PE_Type.
219cdf0e10cSrcweir }
220cdf0e10cSrcweir
221cdf0e10cSrcweir void
On_std_typedef(const char *)222cdf0e10cSrcweir PE_File::On_std_typedef(const char * )
223cdf0e10cSrcweir {
224cdf0e10cSrcweir pSpuTypedef->Push(not_done);
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir void
On_std_enum(const char *)228cdf0e10cSrcweir PE_File::On_std_enum(const char * )
229cdf0e10cSrcweir {
230cdf0e10cSrcweir pSpuVarFunc->Push(not_done); // This is correct,
231cdf0e10cSrcweir // enums are parsed via PE_Type.
232cdf0e10cSrcweir }
233cdf0e10cSrcweir
234cdf0e10cSrcweir void
On_std_VarFunc(const char *)235cdf0e10cSrcweir PE_File::On_std_VarFunc(const char * )
236cdf0e10cSrcweir {
237cdf0e10cSrcweir pSpuVarFunc->Push(not_done);
238cdf0e10cSrcweir }
239cdf0e10cSrcweir
240cdf0e10cSrcweir void
On_std_template(const char *)241cdf0e10cSrcweir PE_File::On_std_template(const char * )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir pSpuTemplate->Push(done);
244cdf0e10cSrcweir }
245cdf0e10cSrcweir
246cdf0e10cSrcweir void
On_std_extern(const char *)247cdf0e10cSrcweir PE_File::On_std_extern(const char * )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir SetTokenResult(done, stay);
250cdf0e10cSrcweir pStati->SetCur(in_extern);
251cdf0e10cSrcweir }
252cdf0e10cSrcweir
253cdf0e10cSrcweir void
On_std_using(const char *)254cdf0e10cSrcweir PE_File::On_std_using(const char * )
255cdf0e10cSrcweir {
256cdf0e10cSrcweir pSpuUsing->Push(done);
257cdf0e10cSrcweir }
258cdf0e10cSrcweir
259cdf0e10cSrcweir void
On_std_SwBracketRight(const char *)260cdf0e10cSrcweir PE_File::On_std_SwBracketRight(const char * )
261cdf0e10cSrcweir {
262cdf0e10cSrcweir SetTokenResult(done,stay);
263cdf0e10cSrcweir access_Env().CloseBlock();
264cdf0e10cSrcweir }
265cdf0e10cSrcweir
266cdf0e10cSrcweir void
On_std_DefineName(const char *)267cdf0e10cSrcweir PE_File::On_std_DefineName(const char * )
268cdf0e10cSrcweir {
269cdf0e10cSrcweir pSpuDefs->Push(not_done);
270cdf0e10cSrcweir }
271cdf0e10cSrcweir
272cdf0e10cSrcweir void
On_std_MacroName(const char *)273cdf0e10cSrcweir PE_File::On_std_MacroName(const char * )
274cdf0e10cSrcweir {
275cdf0e10cSrcweir pSpuDefs->Push(not_done);
276cdf0e10cSrcweir }
277cdf0e10cSrcweir
278cdf0e10cSrcweir void
On_in_extern_Constant(const char *)279cdf0e10cSrcweir PE_File::On_in_extern_Constant(const char * )
280cdf0e10cSrcweir {
281cdf0e10cSrcweir SetTokenResult(done,stay);
282cdf0e10cSrcweir pStati->SetCur(in_externC);
283cdf0e10cSrcweir
284cdf0e10cSrcweir access_Env().OpenExternC();
285cdf0e10cSrcweir }
286cdf0e10cSrcweir
287cdf0e10cSrcweir void
On_in_extern_Ignore(const char *)288cdf0e10cSrcweir PE_File::On_in_extern_Ignore(const char * )
289cdf0e10cSrcweir {
290cdf0e10cSrcweir SetTokenResult(not_done, stay);
291cdf0e10cSrcweir pStati->SetCur(std);
292cdf0e10cSrcweir }
293cdf0e10cSrcweir
294cdf0e10cSrcweir void
On_in_externC_SwBracket_Left(const char *)295cdf0e10cSrcweir PE_File::On_in_externC_SwBracket_Left(const char * )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir SetTokenResult(done, stay);
298cdf0e10cSrcweir pStati->SetCur(std);
299cdf0e10cSrcweir }
300cdf0e10cSrcweir
301cdf0e10cSrcweir void
On_in_externC_NoBlock(const char *)302cdf0e10cSrcweir PE_File::On_in_externC_NoBlock(const char * )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir SetTokenResult(not_done, stay);
305cdf0e10cSrcweir pStati->SetCur(std);
306cdf0e10cSrcweir
307cdf0e10cSrcweir bWithinSingleExternC = true;
308cdf0e10cSrcweir }
309cdf0e10cSrcweir
310cdf0e10cSrcweir
311cdf0e10cSrcweir } // namespace cpp
312