1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22 #include <precomp.h>
23 #include <s2_luidl/distrib.hxx>
24
25
26 // NOT FULLY DECLARED SERVICES
27 #include <ary/doc/d_oldidldocu.hxx>
28 #include <parser/parserinfo.hxx>
29 #include <s2_luidl/tkp_uidl.hxx>
30 #include <s2_luidl/parsenv2.hxx>
31 #include <s2_luidl/tk_punct.hxx>
32 #include <s2_dsapi/docu_pe2.hxx>
33 #include <adc_cl.hxx>
34 #include <x_parse2.hxx>
35
36
37
38 const uintt C_nNO_TRY = uintt(-1);
39
40
41 namespace csi
42 {
43 namespace uidl
44 {
45
TokenDistributor(ary::Repository & io_rRepository,ParserInfo & io_rParserInfo)46 TokenDistributor::TokenDistributor( ary::Repository & io_rRepository,
47 ParserInfo & io_rParserInfo )
48 : pTokenSource(0),
49 aDocumentation(io_rParserInfo),
50 aProcessingData( io_rRepository, aDocumentation, io_rParserInfo )
51 {
52 }
53
~TokenDistributor()54 TokenDistributor::~TokenDistributor()
55 {
56 }
57
58 void
TradeToken()59 TokenDistributor::TradeToken()
60 {
61 bool bGoon = true;
62 while (bGoon AND NOT aProcessingData.NextTokenExists())
63 {
64 bGoon = pTokenSource->GetNextToken();
65 }
66 if (bGoon)
67 aProcessingData.ProcessCurToken();
68 }
69
ProcessingData(ary::Repository & io_rRepository,Documentation & i_rDocuProcessor,ParserInfo & io_rParserInfo)70 TokenDistributor::ProcessingData::ProcessingData(
71 ary::Repository & io_rRepository,
72 Documentation & i_rDocuProcessor,
73 ParserInfo & io_rParserInfo )
74 : // aEnvironments
75 // aTokenQueue
76 // itCurToken
77 // aCurResult
78 nTryCount(0),
79 bFinished(false),
80 rRepository(io_rRepository),
81 rParserInfo(io_rParserInfo),
82 pDocuProcessor(&i_rDocuProcessor),
83 bPublishedRecentlyOn(false)
84 {
85 itCurToken = aTokenQueue.end();
86 }
87
~ProcessingData()88 TokenDistributor::ProcessingData::~ProcessingData()
89 {
90 }
91
92 void
SetTopParseEnvironment(UnoIDL_PE & io_pTopParseEnvironment)93 TokenDistributor::ProcessingData::SetTopParseEnvironment( UnoIDL_PE & io_pTopParseEnvironment )
94 {
95 csv::erase_container(aEnvironments);
96 aEnvironments.push_back( EnvironmentInfo( &io_pTopParseEnvironment, 0 ) );
97 io_pTopParseEnvironment.EstablishContacts(0,rRepository,aCurResult);
98 }
99
100 void
Receive(DYN csi::uidl::Token & let_drToken)101 TokenDistributor::ProcessingData::Receive( DYN csi::uidl::Token & let_drToken )
102 {
103 aTokenQueue.push_back( &let_drToken );
104 itCurToken = aTokenQueue.end()-1;
105 }
106
107 void
Increment_CurLine()108 TokenDistributor::ProcessingData::Increment_CurLine()
109 {
110 rParserInfo.Increment_CurLine();
111 }
112
113 void
ProcessCurToken()114 TokenDistributor::ProcessingData::ProcessCurToken()
115 {
116
117 if (DEBUG_ShowTokens())
118 {
119 Cout() << (*itCurToken)->Text() << Endl();
120 }
121
122 aCurResult.reset();
123
124 CurEnvironment().ProcessToken( CurToken() );
125 AcknowledgeResult();
126 }
127
128
129 UnoIDL_PE &
CurEnvironment() const130 TokenDistributor::ProcessingData::CurEnvironment() const
131 {
132 csv_assert(!aEnvironments.empty());
133 csv_assert(aEnvironments.back().first != 0);
134
135 return *aEnvironments.back().first;
136 }
137
138 bool
NextTokenExists() const139 TokenDistributor::ProcessingData::NextTokenExists() const
140 {
141 return itCurToken != aTokenQueue.end();
142 }
143
144 void
AcknowledgeResult()145 TokenDistributor::ProcessingData::AcknowledgeResult()
146 {
147 if (aCurResult.eDone == done)
148 ++itCurToken;
149
150 switch ( aCurResult.eStackAction )
151 {
152 case stay:
153 if (aCurResult.eDone != done)
154 {
155 csv_assert(false);
156 }
157 break;
158 case push_sure:
159 CurEnv().Leave(push_sure);
160 aEnvironments.push_back( EnvironmentInfo(&PushEnv(), C_nNO_TRY) );
161 PushEnv().Enter(push_sure);
162 PushEnv().SetDocu(pDocuProcessor->ReleaseLastParsedDocu());
163 if (bPublishedRecentlyOn)
164 {
165 PushEnv().SetPublished();
166 bPublishedRecentlyOn = false;
167 }
168
169 break;
170 case push_try:
171 Cout() << "TestInfo: Environment tried." << Endl();
172 CurEnv().Leave(push_try);
173 aEnvironments.push_back( EnvironmentInfo(&PushEnv(), CurTokenPosition()) );
174 nTryCount++;
175 PushEnv().Enter(push_try);
176 break;
177 case pop_success:
178 CurEnv().Leave(pop_success);
179 if ( CurEnv_TriedTokenPosition() > 0 )
180 DecrementTryCount();
181 aEnvironments.pop_back();
182 CurEnv().Enter(pop_success);
183 break;
184 case pop_failure:
185 {
186 CurEnv().Leave(pop_failure);
187 if (aCurResult.eDone == done)
188 {
189 csv_assert(false);
190 }
191
192 if ( CurEnv_TriedTokenPosition() == C_nNO_TRY )
193 throw X_AutodocParser( X_AutodocParser::x_UnexpectedToken, (*itCurToken)->Text() );
194
195 itCurToken = aTokenQueue.begin() + CurEnv_TriedTokenPosition();
196 DecrementTryCount();
197 aEnvironments.pop_back();
198 CurEnv().Enter(pop_failure);
199 } break;
200 default:
201 csv_assert(false);
202 } // end switch(aCurResult.eStackAction)
203 }
204
205 void
DecrementTryCount()206 TokenDistributor::ProcessingData::DecrementTryCount()
207 {
208 nTryCount--;
209 if (nTryCount == 0)
210 {
211 aTokenQueue.erase(aTokenQueue.begin(), itCurToken);
212 itCurToken = aTokenQueue.begin();
213 }
214 }
215
216 TokenDistributor::
Documentation(ParserInfo & io_rParserInfo)217 Documentation::Documentation(ParserInfo & io_rParserInfo)
218 : pDocuParseEnv(new csi::dsapi::SapiDocu_PE(io_rParserInfo)),
219 rParserInfo(io_rParserInfo),
220 pMostRecentDocu(0),
221 bIsPassedFirstDocu(false)
222 {
223 }
224
225 TokenDistributor::
~Documentation()226 Documentation::~Documentation()
227 {
228 }
229
230 void
231 TokenDistributor::
Receive(DYN csi::dsapi::Token & let_drToken)232 Documentation::Receive( DYN csi::dsapi::Token & let_drToken )
233 {
234 csv_assert(pDocuParseEnv);
235
236 pDocuParseEnv->ProcessToken(let_drToken);
237 if ( pDocuParseEnv->IsComplete() )
238 {
239 pMostRecentDocu = pDocuParseEnv->ReleaseJustParsedDocu();
240 if (NOT bIsPassedFirstDocu)
241 {
242 pMostRecentDocu = 0; // Deletes the most recent docu.
243 bIsPassedFirstDocu = true;
244 }
245 }
246 }
247
248 void
249 TokenDistributor::
Increment_CurLine()250 Documentation::Increment_CurLine()
251 {
252 rParserInfo.Increment_CurLine();
253 }
254
255
256 } // namespace uidl
257 } // namespace csi
258
259