xref: /trunk/main/autodoc/source/parser/cpp/pe_file.cxx (revision 78bc99aa)
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