xref: /AOO41X/main/autodoc/source/parser_i/inc/s2_luidl/pe_struc.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef LUIDL_PE_STRUC_HXX
29 #define LUIDL_PE_STRUC_HXX
30 
31 
32 
33 // USED SERVICES
34 	// BASE CLASSES
35 #include <s2_luidl/parsenv2.hxx>
36 #include <s2_luidl/pestate.hxx>
37 	// COMPONENTS
38 #include <s2_luidl/semnode.hxx>
39 #include <ary/qualiname.hxx>
40 	// PARAMETERS
41 
42 
43 
44 namespace csi
45 {
46 namespace prl
47 {
48     class TNamespace;
49 }
50 }
51 
52 
53 
54 namespace csi
55 {
56 namespace uidl
57 {
58 
59 
60 class Struct;
61 class StructElement;
62 class PE_StructElement;
63 class PE_Type;
64 
65 
66 class PE_Struct : public UnoIDL_PE
67 {
68   public:
69 						PE_Struct();
70 	virtual void	 	EstablishContacts(
71 							UnoIDL_PE *			io_pParentPE,
72 							ary::Repository &	io_rRepository,
73 							TokenProcessing_Result &
74 												o_rResult );
75 						~PE_Struct();
76 	virtual void	  	ProcessToken(
77 							const Token &		i_rToken );
78 
79   private:
80 	struct S_Work
81 	{
82 							S_Work();
83 
84 		void				InitData();
85 		void				Prepare_PE_QualifiedName();
86 		void				Prepare_PE_Element();
87 		void				Data_Set_Name(
88 								const char *		i_sName );
89 		void				Data_Set_TemplateParam(
90 								const char *		i_sTemplateParam );
91 
92 		String              sData_Name;
93 		String              sData_TemplateParam;
94 		bool				bIsPreDeclaration;
95         ary::idl::Ce_id	    nCurStruct;
96 
97 		Dyn<PE_StructElement>
98 							pPE_Element;
99 		ary::idl::Ce_id	    nCurParsed_ElementRef;
100 		Dyn<PE_Type>		pPE_Type;
101 		ary::idl::Type_id	nCurParsed_Base;
102 	};
103 
104 	struct S_Stati;
105     class PE_StructState;
106     friend struct S_Stati;
107     friend class PE_StructState;
108 
109 
110 	class PE_StructState : public ParseEnvState
111 	{
112 	  public:
113 
114 	  protected:
115 							PE_StructState(
116 								PE_Struct &			i_rStruct )
117 													: 	rStruct(i_rStruct) {}
118 		void				MoveState(
119 								ParseEnvState &	    i_rState ) const;
120 		void				SetResult(
121 								E_TokenDone			i_eDone,
122 								E_EnvStackAction	i_eWhat2DoWithEnvStack,
123 								UnoIDL_PE *			i_pParseEnv2Push = 0 ) const
124 													{ rStruct.SetResult(i_eDone, i_eWhat2DoWithEnvStack, i_pParseEnv2Push); }
125 
126 		S_Stati &          	Stati() const           { return *rStruct.pStati; }
127 		S_Work &			Work() const			{ return rStruct.aWork; }
128 		PE_Struct &			PE() const				{ return rStruct; }
129 
130 	  private:
131 		virtual UnoIDL_PE &	MyPE();
132 		// DATA
133 		PE_Struct &			rStruct;
134 	};
135 
136 	class State_None : public PE_StructState
137 	{
138 		public:
139 							State_None(
140 								PE_Struct &			i_rStruct )
141 													: 	PE_StructState(i_rStruct) {}
142 	};
143 	class State_WaitForName : public PE_StructState
144 	{  	// -> Name
145 	  public:
146 							State_WaitForName(
147 								PE_Struct &			i_rStruct )
148 													: 	PE_StructState(i_rStruct) {}
149 		virtual void		Process_Identifier(
150 								const TokIdentifier &
151 													i_rToken );
152 	};
153 	class State_GotName : public PE_StructState
154 	{  	// -> : { ; <
155 	  public:
156 							State_GotName(
157 								PE_Struct &			i_rStruct )
158 													: 	PE_StructState(i_rStruct) {}
159 		virtual void		Process_Punctuation(
160 								const TokPunctuation &
161 													i_rToken );
162 	};
163 	class State_WaitForTemplateParam : public PE_StructState
164 	{  	// -> Template parameter identifier
165 	  public:
166 							State_WaitForTemplateParam(
167 								PE_Struct &			i_rStruct )
168 													: 	PE_StructState(i_rStruct) {}
169 		virtual void		Process_Identifier(
170 								const TokIdentifier &
171 													i_rToken );
172 	};
173 	class State_WaitForTemplateEnd : public PE_StructState
174 	{  	// -> >
175 	  public:
176 							State_WaitForTemplateEnd(
177 								PE_Struct &			i_rStruct )
178 													: 	PE_StructState(i_rStruct) {}
179 		virtual void		Process_Punctuation(
180 								const TokPunctuation &
181 													i_rToken );
182 	};
183 	class State_WaitForBase : public PE_StructState
184 	{   // -> Base
185 	  public:
186 							State_WaitForBase(
187 								PE_Struct &			i_rStruct )
188 													: 	PE_StructState(i_rStruct) {}
189 		virtual void		On_SubPE_Left();
190 	};
191 	class State_GotBase : public PE_StructState
192 	{   // -> {
193 	  public:
194 							State_GotBase(
195 								PE_Struct &			i_rStruct )
196 													: 	PE_StructState(i_rStruct) {}
197 		virtual void		Process_Punctuation(
198 								const TokPunctuation &
199 													i_rToken );
200 	};
201 	class State_WaitForElement : public PE_StructState
202 	{   // -> Typ }
203 	  public:
204 							State_WaitForElement(
205 								PE_Struct &			i_rStruct )
206 													: 	PE_StructState(i_rStruct) {}
207 		virtual void		Process_Identifier(
208 								const TokIdentifier &
209 													i_rToken );
210 		virtual void		Process_NameSeparator();
211 		virtual void		Process_BuiltInType(
212 								const TokBuiltInType &
213 													i_rToken );
214 		virtual void		Process_TypeModifier(
215 								const TokTypeModifier &
216 													i_rToken );
217 		virtual void		Process_Punctuation(
218 								const TokPunctuation &
219 													i_rToken );
220 	};
221 	class State_WaitForFinish : public PE_StructState
222 	{ // -> ;
223 	  public:
224 							State_WaitForFinish(
225 								PE_Struct &			i_rStruct )
226 													: 	PE_StructState(i_rStruct) {}
227 		virtual void		Process_Punctuation(
228 								const TokPunctuation &
229 													i_rToken );
230 	};
231 
232 	struct S_Stati
233 	{
234 							S_Stati(
235 								PE_Struct &			io_rStruct );
236 		void				SetState(
237 								ParseEnvState &		i_rNextState )
238 													{ pCurStatus = &i_rNextState; }
239 
240 		State_None			aNone;
241 		State_WaitForName	aWaitForName;
242 		State_GotName       aGotName;
243 		State_WaitForTemplateParam
244 		                    aWaitForTemplateParam;
245 		State_WaitForTemplateEnd
246 		                    aWaitForTemplateEnd;
247 		State_WaitForBase   aWaitForBase;
248 		State_GotBase       aGotBase;
249 		State_WaitForElement
250 							aWaitForElement;
251 		State_WaitForFinish aWaitForFinish;
252 
253 		ParseEnvState *		pCurStatus;
254 	};
255 
256 	virtual void		InitData();
257 	virtual void		TransferData();
258 	virtual void		ReceiveData();
259 
260     public:
261 
262 	void        store_Struct();
263 
264 	private:
265 
266 	S_Stati &	       	Stati()					{ return *pStati; }
267 	S_Work &			Work()					{ return aWork; }
268 
269 	// DATA
270 	S_Work				aWork;
271 	Dyn<S_Stati>		pStati;
272 };
273 
274 
275 inline void
276 PE_Struct::PE_StructState::MoveState(
277 								ParseEnvState &	    i_rState ) const
278 													{ rStruct.Stati().SetState(i_rState); }
279 
280 }   // namespace uidl
281 }   // namespace csi
282 
283 
284 #endif
285 
286