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_expr.hxx"
24cdf0e10cSrcweir 
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir namespace cpp {
30cdf0e10cSrcweir 
31cdf0e10cSrcweir 
32cdf0e10cSrcweir 
PE_Expression(Cpp_PE * i_pParent)33cdf0e10cSrcweir PE_Expression::PE_Expression( Cpp_PE * i_pParent )
34cdf0e10cSrcweir 	:   Cpp_PE(i_pParent),
35cdf0e10cSrcweir         pStati( new PeStatusArray<PE_Expression> ),
36cdf0e10cSrcweir         aResult_Text(100),
37cdf0e10cSrcweir         nBracketCounter(0)
38cdf0e10cSrcweir {
39cdf0e10cSrcweir 	Setup_StatusFunctions();
40cdf0e10cSrcweir }
41cdf0e10cSrcweir 
42cdf0e10cSrcweir 
~PE_Expression()43cdf0e10cSrcweir PE_Expression::~PE_Expression()
44cdf0e10cSrcweir {
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
47cdf0e10cSrcweir void
Call_Handler(const cpp::Token & i_rTok)48cdf0e10cSrcweir PE_Expression::Call_Handler( const cpp::Token & i_rTok )
49cdf0e10cSrcweir {
50cdf0e10cSrcweir 	pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text());
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #if 0
53cdf0e10cSrcweir 	switch (i_rTok.TypeId())
54cdf0e10cSrcweir     {
55cdf0e10cSrcweir 		case Tid_SwBracket_Left:	SetTokenResult(done, stay);
56cdf0e10cSrcweir 									nBracketCounter++;
57cdf0e10cSrcweir 									bBlockOpened = true;
58cdf0e10cSrcweir 									break;
59cdf0e10cSrcweir 		case Tid_SwBracket_Right:	SetTokenResult(done, stay);
60cdf0e10cSrcweir 									nBracketCounter--;
61cdf0e10cSrcweir 									break;
62cdf0e10cSrcweir 		case Tid_Semicolon:			if (nBracketCounter == 0)
63cdf0e10cSrcweir                                         SetTokenResult(done, pop_success);
64cdf0e10cSrcweir                                     else
65cdf0e10cSrcweir                                         SetTokenResult(done, stay);
66cdf0e10cSrcweir 									break;
67cdf0e10cSrcweir 		default:
68cdf0e10cSrcweir 									if  ( bBlockOpened AND nBracketCounter == 0 )
69cdf0e10cSrcweir 									{
70cdf0e10cSrcweir 										SetTokenResult(not_done, pop_success);
71cdf0e10cSrcweir 									}
72cdf0e10cSrcweir 									else
73cdf0e10cSrcweir 									{
74cdf0e10cSrcweir 										SetTokenResult(done, stay);
75cdf0e10cSrcweir 									}
76cdf0e10cSrcweir 	}	// end switch
77cdf0e10cSrcweir #endif // 0
78cdf0e10cSrcweir }
79cdf0e10cSrcweir 
80cdf0e10cSrcweir void
Setup_StatusFunctions()81cdf0e10cSrcweir PE_Expression::Setup_StatusFunctions()
82cdf0e10cSrcweir {
83cdf0e10cSrcweir 	typedef CallFunction<PE_Expression>::F_Tok	F_Tok;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	static F_Tok stateF_std[] =			    { &PE_Expression::On_std_SwBracket_Left,
86cdf0e10cSrcweir 											  &PE_Expression::On_std_SwBracket_Right,
87cdf0e10cSrcweir 											  &PE_Expression::On_std_ArrayBracket_Left,
88cdf0e10cSrcweir 											  &PE_Expression::On_std_ArrayBracket_Right,
89cdf0e10cSrcweir 											  &PE_Expression::On_std_Bracket_Left,
90cdf0e10cSrcweir 											  &PE_Expression::On_std_Bracket_Right,
91cdf0e10cSrcweir 											  &PE_Expression::On_std_Semicolon,
92cdf0e10cSrcweir                                               &PE_Expression::On_std_Comma };
93cdf0e10cSrcweir 	static INT16 stateT_std[] =       	    { Tid_SwBracket_Left,
94cdf0e10cSrcweir 											  Tid_SwBracket_Right,
95cdf0e10cSrcweir 											  Tid_ArrayBracket_Left,
96cdf0e10cSrcweir 											  Tid_ArrayBracket_Right,
97cdf0e10cSrcweir 											  Tid_Bracket_Left,
98cdf0e10cSrcweir 											  Tid_Bracket_Right,
99cdf0e10cSrcweir 											  Tid_Semicolon,
100cdf0e10cSrcweir                                               Tid_Comma };
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	SEMPARSE_CREATE_STATUS(PE_Expression, std, On_std_Default);
103cdf0e10cSrcweir }
104cdf0e10cSrcweir 
105cdf0e10cSrcweir void
InitData()106cdf0e10cSrcweir PE_Expression::InitData()
107cdf0e10cSrcweir {
108cdf0e10cSrcweir     pStati->SetCur(std);
109cdf0e10cSrcweir     aResult_Text.seekp(0);
110cdf0e10cSrcweir 	nBracketCounter = 0;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir void
TransferData()114cdf0e10cSrcweir PE_Expression::TransferData()
115cdf0e10cSrcweir {
116cdf0e10cSrcweir     pStati->SetCur(size_of_states);
117cdf0e10cSrcweir     if ( aResult_Text.tellp() > 0)
118cdf0e10cSrcweir         aResult_Text.pop_back(1);
119cdf0e10cSrcweir }
120cdf0e10cSrcweir 
121cdf0e10cSrcweir void
On_std_Default(const char * i_sText)122cdf0e10cSrcweir PE_Expression::On_std_Default( const char * i_sText)
123cdf0e10cSrcweir {
124cdf0e10cSrcweir     SetTokenResult(done, stay);
125cdf0e10cSrcweir     aResult_Text << i_sText << " ";
126cdf0e10cSrcweir }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir void
On_std_SwBracket_Left(const char *)129cdf0e10cSrcweir PE_Expression::On_std_SwBracket_Left( const char *)
130cdf0e10cSrcweir {
131cdf0e10cSrcweir     SetTokenResult(done, stay);
132cdf0e10cSrcweir     nBracketCounter++;
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir void
On_std_SwBracket_Right(const char *)136cdf0e10cSrcweir PE_Expression::On_std_SwBracket_Right( const char *)
137cdf0e10cSrcweir {
138cdf0e10cSrcweir     nBracketCounter--;
139cdf0e10cSrcweir     if ( nBracketCounter >= 0 )
140cdf0e10cSrcweir         SetTokenResult(done, stay);
141cdf0e10cSrcweir     else
142cdf0e10cSrcweir         SetTokenResult(not_done, pop_success);
143cdf0e10cSrcweir }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir void
On_std_ArrayBracket_Left(const char *)146cdf0e10cSrcweir PE_Expression::On_std_ArrayBracket_Left( const char *)
147cdf0e10cSrcweir {
148cdf0e10cSrcweir     SetTokenResult(done, stay);
149cdf0e10cSrcweir     nBracketCounter++;
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir void
On_std_ArrayBracket_Right(const char *)153cdf0e10cSrcweir PE_Expression::On_std_ArrayBracket_Right( const char *)
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     nBracketCounter--;
156cdf0e10cSrcweir     if ( nBracketCounter >= 0 )
157cdf0e10cSrcweir         SetTokenResult(done, stay);
158cdf0e10cSrcweir     else
159cdf0e10cSrcweir         SetTokenResult(not_done, pop_success);
160cdf0e10cSrcweir }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir void
On_std_Bracket_Left(const char *)163cdf0e10cSrcweir PE_Expression::On_std_Bracket_Left( const char *)
164cdf0e10cSrcweir {
165cdf0e10cSrcweir     SetTokenResult(done, stay);
166cdf0e10cSrcweir     nBracketCounter++;
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
169cdf0e10cSrcweir void
On_std_Bracket_Right(const char *)170cdf0e10cSrcweir PE_Expression::On_std_Bracket_Right( const char *)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir     nBracketCounter--;
173cdf0e10cSrcweir     if ( nBracketCounter >= 0 )
174cdf0e10cSrcweir         SetTokenResult(done, stay);
175cdf0e10cSrcweir     else
176cdf0e10cSrcweir         SetTokenResult(not_done, pop_success);
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
179cdf0e10cSrcweir void
On_std_Semicolon(const char *)180cdf0e10cSrcweir PE_Expression::On_std_Semicolon( const char *)
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     SetTokenResult(not_done, pop_success);
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir void
On_std_Comma(const char *)186cdf0e10cSrcweir PE_Expression::On_std_Comma( const char *)
187cdf0e10cSrcweir {
188cdf0e10cSrcweir     SetTokenResult(not_done, pop_success);
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 
192cdf0e10cSrcweir }   // namespace cpp
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 
199