source: dev/trunk/jenga/src/smoothie/LexicalAnalysis.cpp@ 394

Last change on this file since 394 was 394, checked in by dai_9181, 16 years ago
File size: 9.6 KB
Line 
1#include <jenga/include/common/Exception.h>
2#include <jenga/include/smoothie/SmoothieException.h>
3#include <jenga/include/smoothie/LexicalAnalysis.h>
4#include <jenga/include/smoothie/BasicFixed.h>
5
6#include <windows.h>
7
8bool IsVariableTopChar(char c){
9 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_')
10 {
11 return true;
12 }
13 return false;
14}
15bool IsVariableChar( char c, bool isGenericsChars ){
16 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
17 c=='%'||c=='!'||c=='#'||c=='$'||
18 c=='_'||c=='.')
19 {
20 return true;
21 }
22
23 if( isGenericsChars )
24 {
25 if( c == '<' || c == '>' )
26 {
27 return true;
28 }
29 }
30
31 return false;
32}
33bool IsBlank(char c){
34 if(c==' '||c=='\t') return 1;
35 return 0;
36}
37int GetOneParameter(const char *Parameter,int pos,char *retAns){
38 int i,i2,i3,IsStr;
39 for(i=pos,i2=0,IsStr=0;;i++,i2++){
40 if(Parameter[i]=='\"') IsStr^=1;
41 else if(Parameter[i]=='('&&IsStr==0){
42 i3=GetStringInPare(retAns+i2,Parameter+i);
43 i+=i3-1;
44 i2+=i3-1;
45 continue;
46 }
47 else if(Parameter[i]=='['&&IsStr==0){
48 i3=GetStringInBracket(retAns+i2,Parameter+i);
49 i+=i3-1;
50 i2+=i3-1;
51 continue;
52 }
53 else if(Parameter[i]==','&&IsStr==0){
54 retAns[i2]=0;
55 i++;
56 break;
57 }
58
59 if(IsCommandDelimitation(Parameter[i])&&IsStr==0
60 || Parameter[i] == ')' && IsStr == 0 ){
61 retAns[i2]=0;
62 break;
63 }
64
65 retAns[i2]=Parameter[i];
66 }
67 return i;
68}
69int JumpOneParameter(char *Parameter,int i){
70 int i2,IsStr;
71 for(i2=0,IsStr=0;;i++,i2++){
72 if(Parameter[i]=='\"') IsStr^=1;
73 else if(Parameter[i]=='('&&IsStr==0){
74 i=JumpStringInPare(Parameter,i+1);
75 continue;
76 }
77 else if(Parameter[i]=='['&&IsStr==0){
78 i=JumpStringInBracket(Parameter,i+1);
79 continue;
80 }
81 else if(Parameter[i]==','&&IsStr==0){
82 i++;
83 break;
84 }
85 if(IsCommandDelimitation(Parameter[i])) break;
86 }
87 return i;
88}
89int GetStringInQuotation(char *buffer,char *ReadBuffer){
90 int i;
91
92 if(ReadBuffer[0]=='\"'){
93 buffer[0]=ReadBuffer[0];
94 i=1;
95 }
96 else i=0;
97
98 for(;;i++){
99 buffer[i]=ReadBuffer[i];
100 if(IsDBCSLeadByte(ReadBuffer[i])){
101 i++;
102 buffer[i]=ReadBuffer[i];
103 continue;
104 }
105 if(ReadBuffer[i]=='\"'){
106 i++;
107 buffer[i]=0;
108 break;
109 }
110 if(ReadBuffer[i]=='\0') return 0;
111 }
112 return i;
113}
114int GetStringInPare(char *buffer,const char *ReadBuffer){
115 int i,IsStr,PareNum;
116 for(i=0,IsStr=0,PareNum=0;;i++){
117 buffer[i]=ReadBuffer[i];
118 if(IsDBCSLeadByte(ReadBuffer[i])){
119 i++;
120 buffer[i]=ReadBuffer[i];
121 continue;
122 }
123 if(ReadBuffer[i]=='\"') IsStr^=1;
124 else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
125 else if(ReadBuffer[i]==')'&&IsStr==0){
126 PareNum--;
127 if(PareNum==0){
128 i++;
129 buffer[i]=0;
130 break;
131 }
132 }
133 else if(ReadBuffer[i]=='\0') return 0;
134 }
135 return i;
136}
137int GetStringInBracket(char *buffer,const char *ReadBuffer){
138 int i,IsStr,PareNum;
139 for(i=0,IsStr=0,PareNum=0;;i++){
140 buffer[i]=ReadBuffer[i];
141 if(IsDBCSLeadByte(ReadBuffer[i])){
142 i++;
143 buffer[i]=ReadBuffer[i];
144 continue;
145 }
146 if(ReadBuffer[i]=='\"') IsStr^=1;
147 else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
148 else if(ReadBuffer[i]==']'&&IsStr==0){
149 PareNum--;
150 if(PareNum==0){
151 i++;
152 buffer[i]=0;
153 break;
154 }
155 }
156 else if(ReadBuffer[i]=='\0') return 0;
157 }
158 return i;
159}
160int GetStringInGenericBracket(char *buffer,const char *ReadBuffer){
161 int i,IsStr,PareNum;
162 for(i=0,IsStr=0,PareNum=0;;i++){
163 buffer[i]=ReadBuffer[i];
164 if(IsDBCSLeadByte(ReadBuffer[i])){
165 i++;
166 buffer[i]=ReadBuffer[i];
167 continue;
168 }
169 if(ReadBuffer[i]=='\"') IsStr^=1;
170 else if(ReadBuffer[i]=='<'&&IsStr==0) PareNum++;
171 else if(ReadBuffer[i]=='>'&&IsStr==0){
172 PareNum--;
173 if(PareNum==0){
174 i++;
175 buffer[i]=0;
176 break;
177 }
178 }
179 else if(ReadBuffer[i]=='\0') return 0;
180 }
181 return i;
182}
183int JumpStringInPare(const char *buffer,int pos){
184 int PareNum;
185 for(PareNum=1;;pos++){
186 if(buffer[pos]=='\"'){
187 for(pos++;;pos++){
188 if(buffer[pos]=='\"') break;
189 }
190 continue;
191 }
192 else if(buffer[pos]=='(') PareNum++;
193 else if(buffer[pos]==')'){
194 PareNum--;
195 if(PareNum==0) return pos;
196 }
197 else if(buffer[pos]=='\0') break;
198 }
199 return 0;
200}
201int JumpStringInBracket(const char *buffer,int pos){
202 int PareNum;
203 for(PareNum=1;;pos++){
204 if(buffer[pos]=='\"'){
205 for(pos++;;pos++){
206 if(buffer[pos]=='\"') break;
207 }
208 continue;
209 }
210 else if(buffer[pos]=='[') PareNum++;
211 else if(buffer[pos]==']'){
212 PareNum--;
213 if(PareNum==0) return pos;
214 }
215 else if(buffer[pos]=='\0') break;
216 }
217 return 0;
218}
219bool IsCommandDelimitation( char c ){
220 if( c == '\n' || c == ':' || c == '\0' ){
221 return true;
222 }
223
224 return false;
225}
226
227int GetStringInPare_RemovePare(char *buffer,const char *ReadBuffer){
228 int i,IsStr,PareNum;
229 for(i=0,IsStr=0,PareNum=1;;i++){
230 buffer[i]=ReadBuffer[i];
231 if(IsDBCSLeadByte(ReadBuffer[i])){
232 i++;
233 buffer[i]=ReadBuffer[i];
234 continue;
235 }
236 if(ReadBuffer[i]=='\"') IsStr^=1;
237 else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
238 else if(ReadBuffer[i]==')'&&IsStr==0){
239 PareNum--;
240 if(PareNum==0){
241 buffer[i]=0;
242 break;
243 }
244 }
245 else if(ReadBuffer[i]=='\0') return 0;
246 }
247 return i;
248}
249
250void SplitParameter( const std::string &src, Jenga::Common::Strings &dests, bool isClear )
251{
252 const char *buffer = src.c_str();
253 int i = 0;
254
255 if( isClear )
256 {
257 dests.clear();
258 }
259
260 while( buffer[i] )
261 {
262 char result[8192];
263 i = GetOneParameter( buffer, i, result );
264 dests.push_back( result );
265 }
266}
267
268
269bool SplitMemberName( const char *desc, char *object, char *member, ReferenceKind &refType ){
270 int lastIndex = -1;
271 for( int i=0; desc[i]; i++ ){
272 if( desc[i] == '(' ){
273 i=JumpStringInPare(desc,i+1);
274 continue;
275 }
276 else if( desc[i] == '[' ){
277 i=JumpStringInBracket(desc,i+1);
278 continue;
279 }
280 else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){
281 lastIndex = i;
282 }
283 }
284 if( lastIndex == -1 ){
285 if( object )
286 {
287 object[0] = 0;
288 }
289 lstrcpy( member, desc );
290 return false;
291 }
292
293 if(desc[lastIndex]=='.'){
294 lstrcpy(member,desc+lastIndex+1);
295 refType = RefDot;
296 }
297 else{
298 lstrcpy(member,desc+lastIndex+2);
299 refType = RefPointer;
300 }
301
302 if( object ){
303 lstrcpy( object, desc );
304 object[lastIndex]=0;
305 }
306
307 return true;
308}
309bool SplitMemberName( const char *desc, char *object, char *member ){
310 ReferenceKind dummyRefType;
311 return SplitMemberName( desc, object, member, dummyRefType );
312}
313
314void SplitSyntacticForAs( const char *src, char *varName, char *typeName)
315{
316 int i = 0;
317 for( ; ; i++ )
318 {
319 if( src[i] == '\0' || src[i] == 1 && src[i+1] == ESC_AS )
320 {
321 varName[i] = 0;
322 break;
323 }
324 varName[i] = src[i];
325 }
326
327 if( src[i] )
328 {
329 lstrcpy( typeName, src + i + 2 );
330 }
331 else
332 {
333 typeName[i] = 0;
334 }
335}
336
337char *calcNames[255] = {
338 "xor",
339};
340void InitCalcNames()
341{
342 if( calcNames[CALC_XOR] )
343 {
344 return;
345 }
346
347 memset( calcNames, 0, 255 * sizeof(char *) );
348 calcNames[CALC_XOR] = "xor";
349 calcNames[CALC_OR] = "or";
350 calcNames[CALC_AND] = "and";
351 calcNames[CALC_NOT] = "Not";
352 calcNames[CALC_PE] = "<=";
353 calcNames[CALC_QE] = ">=";
354 calcNames[CALC_NOTEQUAL] = "<>";
355 calcNames[CALC_EQUAL] = "=(compare)";
356 calcNames[CALC_P] = "<";
357 calcNames[CALC_Q] = ">";
358 calcNames[CALC_SHL] = "<<";
359 calcNames[CALC_SHR] = ">>";
360 calcNames[CALC_ADDITION] = "+";
361 calcNames[CALC_SUBTRACTION] = "-";
362 calcNames[CALC_STRPLUS] = "&";
363 calcNames[CALC_MOD] = "mod";
364 calcNames[CALC_PRODUCT] = "*";
365 calcNames[CALC_QUOTIENT] = "/";
366 calcNames[CALC_INTQUOTIENT] = "\\";
367 calcNames[CALC_AS] = "As";
368 calcNames[CALC_BYVAL] = "ByVal";
369 calcNames[CALC_MINUSMARK] = "-(mark)";
370 calcNames[CALC_POWER] = "^";
371 calcNames[CALC_SUBSITUATION] = "=";
372 calcNames[CALC_ARRAY_GET] = "[]";
373 calcNames[CALC_ARRAY_SET] = "[]=";
374}
375void GetCalcName(int idCalc,char *name){
376 InitCalcNames();
377
378 if( calcNames[idCalc] == NULL )
379 {
380 SmoothieException::Throw();
381 }
382 lstrcpy( name, calcNames[idCalc] );
383}
384BYTE ToCalcId( const char *name )
385{
386 InitCalcNames();
387
388 for( int i=0; i<255; i++ )
389 {
390 if( calcNames[i] )
391 {
392 if( lstrcmp( name, calcNames[i] ) == 0 )
393 {
394 return i;
395 }
396 }
397 }
398 SmoothieException::Throw();
399 return 0;
400}
401
402std::string Operator_NaturalStringToCalcMarkString( const std::string &name )
403{
404 if( name[0] == 1 && name[1] == ESC_OPERATOR )
405 {
406 BYTE calcId = ToCalcId( name.c_str()+2 );
407 char temporary[255];
408 temporary[0] = name[0];
409 temporary[1] = name[1];
410 temporary[2] = calcId;
411 temporary[3] = 0;
412 return temporary;
413 }
414 return name;
415}
416std::string Operator_CalcMarkStringToNaturalString( const std::string &name )
417{
418 if( name[0] == 1 && name[1] == ESC_OPERATOR )
419 {
420 BYTE calcId = name[2];
421 char temporary[255], calcName[255];
422 GetCalcName( calcId, calcName );
423 temporary[0] = name[0];
424 temporary[1] = name[1];
425 lstrcpy( temporary+2, calcName );
426 return temporary;
427 }
428 return name;
429}
430
431bool IsGenericTypeSourcePart( const char *buffer )
432{
433 if( buffer[0] != '<' )
434 {
435 Jenga::Throw( "意図しない文字列に対してIsGenericTypeSourcePart関数が呼ばれた" );
436 return false;
437 }
438
439 int i=1, scopeCount=1;
440 for( ; ; i++ )
441 {
442 if( buffer[i] == '\0' )
443 {
444 break;
445 }
446 if( buffer[i] == '<' )
447 {
448 scopeCount++;
449 }
450 else if( buffer[i] == '>' )
451 {
452 scopeCount--;
453
454 if( scopeCount == 0 )
455 {
456 break;
457 }
458 }
459 }
460
461 if( buffer[i] != '>' )
462 {
463 return false;
464 }
465
466
467 /////////////////////////////////////////////////////////////////
468 // '>'に続く文字を判定する
469 /////////////////////////////////////////////////////////////////
470
471 i++;
472 while( IsBlank( buffer[i] ) )
473 {
474 i++;
475 }
476
477 if( IsVariableChar( buffer[i] ) )
478 {
479 return false;
480 }
481
482 return true;
483}
Note: See TracBrowser for help on using the repository browser.