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