source: dev/BasicCompiler_Common/Procedure.cpp@ 78

Last change on this file since 78 was 78, checked in by dai_9181, 17 years ago

CTypeDef → TypeDef
Houseクラスを追加。
オーバーロードレベルの種類を追加(レベル1に挿入)

File size: 18.9 KB
RevLine 
[74]1#include "common.h"
2
[75]3bool UserProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic ){
4 int i = 0;
5 int i2,i3,sw;
6 char temporary[8192],temp2[VN_SIZE];
7
8 //ソースコードの位置
9 this->codePos = nowLine;
10
11 //パラメータ
12 if(sourceOfParams[i]!='('){
13 SetError(1,NULL,nowLine);
14 return 0;
15 }
16 i++;
17 if(sourceOfParams[i]!=')'&& this->pParentClass ){
18 //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
19 if(this->GetName()[0]=='~'){
20 SetError(114,NULL,nowLine);
21 i=JumpStringInPare(sourceOfParams,i);
22 }
23 }
24 while(1){
25 if(sourceOfParams[i]==')') break;
26
27 //ByRef
28 bool isRef;
29 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
30 isRef = false;
31 i+=2;
32 }
33 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
34 isRef = true;
35 i+=2;
36 }
37 else isRef = false;
38
39 //パラメータ名
40 bool isArray = false;
41 int subScripts[MAX_ARRAYDIM];
42 char name[VN_SIZE];
43 sw=0;
44 for(i2=0;;i++,i2++){
45 if(sourceOfParams[i]=='('){
46 if(!sw) sw=1;
47
48 i3=GetStringInPare(name+i2,sourceOfParams+i);
49 i2+=i3-1;
50 i+=i3-1;
51 continue;
52 }
53 if(sourceOfParams[i]=='['){
54 if(!sw) sw=1;
55
56 i3=GetStringInBracket(name+i2,sourceOfParams+i);
57 i2+=i3-1;
58 i+=i3-1;
59 continue;
60 }
61 if(!IsVariableChar(sourceOfParams[i])){
62 name[i2]=0;
63 break;
64 }
65 name[i2]=sourceOfParams[i];
66 }
67 if(sw){
68 //配列パラメータ
69 if( isRef == false ) SetError(29,NULL,nowLine);
70 isArray = true;
71
72 if((name[i2-2]=='('&&name[i2-1]==')')||
73 (name[i2-2]=='['&&name[i2-1]==']')){
74 subScripts[0]=LONG_MAX;
75 subScripts[1]=-1;
76
77 name[i2-2]=0;
78 }
79 else{
80 GetArrange(name,temp2,subScripts);
81 lstrcpy(name,temp2);
82 }
83
84 i2=lstrlen(name);
85 }
86
87 Type type( DEF_NON );
[77]88 char initValue[8192] = "";
89 if( sourceOfParams[i] == '=' ){
90 i++;
91 i = GetOneParameter( sourceOfParams, i, initValue );
92
93 //エラー用
94 cp = nowLine;
95
96 NumOpe_GetType( initValue, Type::String(), type );
97 }
98 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
[75]99 i+=2;
100
101 i2=0;
102 while(sourceOfParams[i]=='*'){
103 temporary[i2]=sourceOfParams[i];
104 i++;
105 i2++;
106 }
107 for(;;i++,i2++){
108 if(!IsVariableChar(sourceOfParams[i])){
109 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
110 temporary[i2++]=sourceOfParams[i++];
111 temporary[i2]=sourceOfParams[i];
112 continue;
113 }
114 temporary[i2]=0;
115 break;
116 }
117 temporary[i2]=sourceOfParams[i];
118 }
119
120 Type::StringToType( temporary, type );
121
[78]122 /*
123 TODO: 消す(TypeDef関連の変更)
[75]124 if(temporary[0]=='*'&&
125 temporary[1]==1&&
126 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
127 if(sourceOfParams[i]!='('){
128 SetError(10,temporary,nowLine);
129 break;
130 }
131 i3=GetStringInPare(temporary+i2,sourceOfParams+i);
132 i+=i3;
133 i2+=i3;
134
135 if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
136 temporary[i2++]=sourceOfParams[i++];
137 temporary[i2++]=sourceOfParams[i++];
138 for(;;i++,i2++){
139 if(!IsVariableChar(sourceOfParams[i])){
140 temporary[i2]=0;
141 break;
142 }
143 temporary[i2]=sourceOfParams[i];
144 }
145 }
146 }
147 else{
148 //TypeDefをする前のベース型を取得
[78]149 GetOriginalTypeName_Old(temporary);
150 }*/
[75]151
152 if( type.IsNull() ){
153 SetError(3,temporary,nowLine);
154 type.SetBasicType( DEF_PTR_VOID );
155 }
156 }
157 else{
158 type.SetBasicType( GetTypeFromSimpleName(temporary) );
159 SetError(-103,temporary,nowLine);
160 }
161
[78]162 /*
163 TODO: 消す(TypeDef関連の変更)
[75]164 if( type.IsProcPtr() ){
165 //関数ポインタの場合
166 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine) );
[78]167 }*/
[75]168
[77]169 Parameter *pParam = new Parameter( name, type, isRef, initValue );
[75]170 if( isArray ){
171 pParam->SetArray( subScripts );
172 }
173
174 //パラメータを追加
175 this->params.push_back( pParam );
176
177 if(sourceOfParams[i]==','){
178 i++;
179 continue;
180 }
181 else if(sourceOfParams[i]==')') continue;
182 else{
183 SetError(1,NULL,nowLine);
184 break;
185 }
186 }
187 this->secondParmNum = (int)this->params.size();
188 i++;
189 if(sourceOfParams[i]=='('){
190 i++;
191 while(1){
192 if(sourceOfParams[i]==')') break;
193
194 //ByRef
195 bool isRef;
196 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
197 isRef = false;
198 i+=2;
199 }
200 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
201 isRef = true;
202 i+=2;
203 }
204 else isRef = false;
205
206 //パラメータ名
207 bool isArray = false;
208 int subScripts[MAX_ARRAYDIM];
209 char name[VN_SIZE];
210 sw=0;
211 for(i2=0;;i++,i2++){
212 if(sourceOfParams[i]=='('){
213 if(!sw) sw=1;
214
215 i3=GetStringInPare(name+i2,sourceOfParams+i);
216 i2+=i3-1;
217 i+=i3-1;
218 continue;
219 }
220 if(sourceOfParams[i]=='['){
221 if(!sw) sw=1;
222
223 i3=GetStringInBracket(name+i2,sourceOfParams+i);
224 i2+=i3-1;
225 i+=i3-1;
226 continue;
227 }
228 if(!IsVariableChar(sourceOfParams[i])){
229 name[i2]=0;
230 break;
231 }
232 name[i2]=sourceOfParams[i];
233 }
234 if(sw){
235 //配列パラメータ
236 if( isRef == false ) SetError(29,NULL,nowLine);
237 isArray = true;
238
239 if((name[i2-2]=='('&&name[i2-1]==')')||
240 (name[i2-2]=='['&&name[i2-1]==']')){
241 subScripts[0]=LONG_MAX;
242 subScripts[1]=-1;
243
244 name[i2-2]=0;
245 }
246 else{
247 GetArrange(name,temp2,subScripts);
248 lstrcpy(name,temp2);
249 }
250
251 i2=lstrlen(name);
252 }
253
254 //型
255 Type type( DEF_NON );
256 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
257 i+=2;
258
259 i2=0;
260 while(sourceOfParams[i]=='*'){
261 temporary[i2]=sourceOfParams[i];
262 i++;
263 i2++;
264 }
265 for(;;i++,i2++){
266 if(!IsVariableChar(sourceOfParams[i])){
267 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
268 temporary[i2++]=sourceOfParams[i++];
269 temporary[i2]=sourceOfParams[i];
270 continue;
271 }
272 temporary[i2]=0;
273 break;
274 }
275 temporary[i2]=sourceOfParams[i];
276 }
277
278 Type::StringToType( temporary, type );
279
[78]280 /*
281 TODO: 消す(TypeDef関連の変更)
[75]282 if(temporary[0]=='*'&&
283 temporary[1]==1&&
284 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
285 if(sourceOfParams[i]!='('){
286 SetError(10,temporary,nowLine);
287 break;
288 }
289 i3=GetStringInPare(temporary+i2,sourceOfParams+i);
290 i+=i3;
291 i2+=i3;
292
293 if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
294 temporary[i2++]=sourceOfParams[i++];
295 temporary[i2++]=sourceOfParams[i++];
296 for(;;i++,i2++){
297 if(!IsVariableChar(sourceOfParams[i])){
298 temporary[i2]=0;
299 break;
300 }
301 temporary[i2]=sourceOfParams[i];
302 }
303 }
304 }
305 else{
306 //TypeDefをする前のベース型を取得
[78]307 GetOriginalTypeName_Old(temporary);
308 }*/
[75]309
310 if( type.IsNull() ){
311 SetError(3,temporary,nowLine);
312 type.SetBasicType( DEF_PTR_VOID );
313 }
314 }
315 else{
316 type.SetBasicType( GetTypeFromSimpleName(temporary) );
317 SetError(-103,temporary,nowLine);
318 }
319
[78]320 /*
321 TODO: 消す(TypeDef関連の変更)
[75]322 if( type.IsProcPtr() ){
323 //関数ポインタの場合
324 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine) );
[78]325 }*/
[75]326
327 Parameter *pParam = new Parameter( name, type, isRef );
328 if( isArray ){
329 pParam->SetArray( subScripts );
330 }
331
332 //パラメータを追加
333 this->params.push_back( pParam );
334
335 if(sourceOfParams[i]==','){
336 i++;
337 continue;
338 }
339 else if(sourceOfParams[i]==')') continue;
340 else{
341 SetError(1,NULL,nowLine);
342 break;
343 }
344 }
345 i++;
346 }
347
348 if(sourceOfParams[i]){
349 ///////////////////
350 // 戻り値を取得
351 ///////////////////
352
353 if( !this->IsFunction() ){
354 // Sub/Macroの場合
355 SetError(38,this->GetName(),nowLine);
356 }
357
358 if( this->pParentClass ){
359 if( this->GetName() == this->pParentClass->name ||
360 this->GetName()[0]=='~'){
361 //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
362 SetError(115,NULL,nowLine);
363 }
364 }
365
366
367 i2=lstrlen(sourceOfParams)-2;
368
369 int sw_as=0;
370 for(;i2>0;i2--){
371 if(sourceOfParams[i2]==')') break;
372
373 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
374 i2+=2;
375 i3=0;
376 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
377 for(;;i2++,i3++){
378 if(!IsVariableChar(sourceOfParams[i2])){
379 temporary[i3]=0;
380 break;
381 }
382 temporary[i3]=sourceOfParams[i2];
383 }
384 Type::StringToType( temporary, this->returnType );
385 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
386
387 sw_as=1;
388 break;
389 }
390 }
391
392 if(!sw_as){
393 SetError(-104,this->GetName().c_str(),nowLine);
394
395 this->returnType.SetBasicType( DEF_DOUBLE );
396 }
397 }
398 else{
399 //戻り値なしのSub定義
400 this->returnType.SetNull();
401 }
402
403 //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある)
404
405 if( this->pParentClass && isStatic == false ){
406 //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
407 string name = "_System_LocalThis";
408 Type type( DEF_PTR_VOID );
409 this->realParams.push_back( new Parameter( name, type ) );
410 }
411
412 if( this->returnType.IsStruct() ){
413 //構造体を戻り値として持つ場合
414 //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
415
416 string name = this->GetName();
417 if(name[0]==1&&name[1]==ESC_OPERATOR){
418 name="_System_ReturnValue";
419 }
420 Type type( DEF_STRUCT, this->returnType.GetIndex() );
421 this->realParams.push_back( new Parameter( name, type, true ) );
422 }
423
424 //パラメータをコピー
425 foreach( Parameter *pParam, params ){
426 this->realParams.push_back( new Parameter( *pParam ) );
427 }
428
429 return true;
430}
431
432bool DllProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
433 int i = 0;
434 int i2,i3,sw;
435 char temporary[8192],temp2[VN_SIZE];
436
437 //ソースコードの位置
438 this->codePos = nowLine;
439
440 //パラメータ
441 if(sourceOfParams[i]!='('){
442 SetError(1,NULL,nowLine);
443 return 0;
444 }
445 i++;
446
447 while(1){
448 if(sourceOfParams[i]==')') break;
449
450 //ByRef
451 bool isRef;
452 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
453 isRef = false;
454 i+=2;
455 }
456 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
457 isRef = true;
458 i+=2;
459 }
460 else isRef = false;
461
462 //パラメータ名
463 bool isArray = false;
464 int subScripts[MAX_ARRAYDIM];
465 char name[VN_SIZE];
466 sw=0;
467 for(i2=0;;i++,i2++){
468 if(sourceOfParams[i]=='('){
469 if(!sw) sw=1;
470
471 i3=GetStringInPare(name+i2,sourceOfParams+i);
472 i2+=i3-1;
473 i+=i3-1;
474 continue;
475 }
476 if(sourceOfParams[i]=='['){
477 if(!sw) sw=1;
478
479 i3=GetStringInBracket(name+i2,sourceOfParams+i);
480 i2+=i3-1;
481 i+=i3-1;
482 continue;
483 }
484 if(!IsVariableChar(sourceOfParams[i])){
485 name[i2]=0;
486 break;
487 }
488 name[i2]=sourceOfParams[i];
489 }
490 if(sw){
491 //配列パラメータ
492 if( isRef == false ) SetError(29,NULL,nowLine);
493 isArray = true;
494
495 if((name[i2-2]=='('&&name[i2-1]==')')||
496 (name[i2-2]=='['&&name[i2-1]==']')){
497 subScripts[0]=LONG_MAX;
498 subScripts[1]=-1;
499
500 name[i2-2]=0;
501 }
502 else{
503 GetArrange(name,temp2,subScripts);
504 lstrcpy(name,temp2);
505 }
506
507 i2=lstrlen(name);
508 }
509
510 //型
511 Type type( DEF_NON );
512 if(lstrcmp(name,"...")==0) type.SetBasicType( DEF_ELLIPSE );
513 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
514 i+=2;
515
516 i2=0;
517 while(sourceOfParams[i]=='*'){
518 temporary[i2]=sourceOfParams[i];
519 i++;
520 i2++;
521 }
522 for(;;i++,i2++){
523 if(!IsVariableChar(sourceOfParams[i])){
524 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
525 temporary[i2++]=sourceOfParams[i++];
526 temporary[i2]=sourceOfParams[i];
527 continue;
528 }
529 temporary[i2]=0;
530 break;
531 }
532 temporary[i2]=sourceOfParams[i];
533 }
534
535 Type::StringToType( temporary, type );
536
[78]537 /*
538 TODO: 消す(TypeDef関連の変更)
[75]539 if(temporary[0]=='*'&&
540 temporary[1]==1&&
541 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
542 if(sourceOfParams[i]!='('){
543 SetError(10,temporary,nowLine);
544 break;
545 }
546 i3=GetStringInPare(temporary+i2,sourceOfParams+i);
547 i+=i3;
548 i2+=i3;
549
550 if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
551 temporary[i2++]=sourceOfParams[i++];
552 temporary[i2++]=sourceOfParams[i++];
553 for(;;i++,i2++){
554 if(!IsVariableChar(sourceOfParams[i])){
555 temporary[i2]=0;
556 break;
557 }
558 temporary[i2]=sourceOfParams[i];
559 }
560 }
561 }
562 else{
563 //TypeDefをする前のベース型を取得
[78]564 GetOriginalTypeName_Old(temporary);
565 }*/
[75]566
567 if( type.IsNull() ){
568 SetError(3,temporary,nowLine);
569 type.SetBasicType( DEF_PTR_VOID );
570 }
571 }
572 else{
573 type.SetBasicType( GetTypeFromSimpleName(temporary) );
574 SetError(-103,temporary,nowLine);
575 }
576
[78]577 /*
578 TODO: 消す(TypeDef関連の変更)
[75]579 if( type.IsProcPtr() ){
580 //関数ポインタの場合
581 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine ) );
[78]582 }*/
[75]583
584 Parameter *pParam = new Parameter( name, type, isRef );
585 if( isArray ){
586 pParam->SetArray( subScripts );
587 }
588
589 //パラメータを追加
590 this->params.push_back( pParam );
591
592 if(sourceOfParams[i]==','){
593 i++;
594 continue;
595 }
596 else if(sourceOfParams[i]==')') continue;
597 else{
598 SetError(1,NULL,nowLine);
599 break;
600 }
601 }
602 i++;
603
604 if(sourceOfParams[i]){
605 ///////////////////
606 // 戻り値を取得
607 ///////////////////
608
609 i2=lstrlen(sourceOfParams)-2;
610
611 int sw_as=0;
612 for(;i2>0;i2--){
613 if(sourceOfParams[i2]==')') break;
614
615 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
616 i2+=2;
617 i3=0;
618 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
619 for(;;i2++,i3++){
620 if(!IsVariableChar(sourceOfParams[i2])){
621 temporary[i3]=0;
622 break;
623 }
624 temporary[i3]=sourceOfParams[i2];
625 }
626 Type::StringToType( temporary, this->returnType );
627 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
628
629 sw_as=1;
630 break;
631 }
632 }
633 }
634 else{
635 //戻り値なしのSub定義
636 this->returnType.SetNull();
637 }
638
639 return true;
640}
641
642bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
643 int i = 0;
644 int i2,i3,sw;
645 char temporary[8192],temp2[VN_SIZE];
646
647 //ソースコードの位置
648 this->codePos = nowLine;
649
650 //パラメータ
651 if(sourceOfParams[i]!='('){
652 SetError(1,NULL,nowLine);
653 return 0;
654 }
655 i++;
656 while(1){
657 if(sourceOfParams[i]==')') break;
658
659 //ByRef
660 bool isRef;
661 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
662 isRef = false;
663 i+=2;
664 }
665 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
666 isRef = true;
667 i+=2;
668 }
669 else isRef = false;
670
671 //パラメータ名
672 bool isArray = false;
673 int subScripts[MAX_ARRAYDIM];
674 char name[VN_SIZE];
675 sw=0;
676 for(i2=0;;i++,i2++){
677 if(sourceOfParams[i]=='('){
678 if(!sw) sw=1;
679
680 i3=GetStringInPare(name+i2,sourceOfParams+i);
681 i2+=i3-1;
682 i+=i3-1;
683 continue;
684 }
685 if(sourceOfParams[i]=='['){
686 if(!sw) sw=1;
687
688 i3=GetStringInBracket(name+i2,sourceOfParams+i);
689 i2+=i3-1;
690 i+=i3-1;
691 continue;
692 }
693 if(!IsVariableChar(sourceOfParams[i])){
694 name[i2]=0;
695 break;
696 }
697 name[i2]=sourceOfParams[i];
698 }
699 if(sw){
700 //配列パラメータ
701 if( isRef == false ) SetError(29,NULL,nowLine);
702 isArray = true;
703
704 if((name[i2-2]=='('&&name[i2-1]==')')||
705 (name[i2-2]=='['&&name[i2-1]==']')){
706 subScripts[0]=LONG_MAX;
707 subScripts[1]=-1;
708
709 name[i2-2]=0;
710 }
711 else{
712 GetArrange(name,temp2,subScripts);
713 lstrcpy(name,temp2);
714 }
715
716 i2=lstrlen(name);
717 }
718
719 //型
720 Type type( DEF_NON );
721 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
722 i+=2;
723
724 i2=0;
725 while(sourceOfParams[i]=='*'){
726 temporary[i2]=sourceOfParams[i];
727 i++;
728 i2++;
729 }
730 for(;;i++,i2++){
731 if(!IsVariableChar(sourceOfParams[i])){
732 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
733 temporary[i2++]=sourceOfParams[i++];
734 temporary[i2]=sourceOfParams[i];
735 continue;
736 }
737 temporary[i2]=0;
738 break;
739 }
740 temporary[i2]=sourceOfParams[i];
741 }
742
743 Type::StringToType( temporary, type );
744
[78]745 /*
746 TODO: 消す(TypeDef関連の変更)
[75]747 if(temporary[0]=='*'&&
748 temporary[1]==1&&
749 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
750 if(sourceOfParams[i]!='('){
751 SetError(10,temporary,nowLine);
752 break;
753 }
754 i3=GetStringInPare(temporary+i2,sourceOfParams+i);
755 i+=i3;
756 i2+=i3;
757
758 if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
759 temporary[i2++]=sourceOfParams[i++];
760 temporary[i2++]=sourceOfParams[i++];
761 for(;;i++,i2++){
762 if(!IsVariableChar(sourceOfParams[i])){
763 temporary[i2]=0;
764 break;
765 }
766 temporary[i2]=sourceOfParams[i];
767 }
768 }
769 }
770 else{
771 //TypeDefをする前のベース型を取得
[78]772 GetOriginalTypeName_Old(temporary);
773 }*/
[75]774
775 if( type.IsNull() ){
776 SetError(3,temporary,nowLine);
777 type.SetBasicType( DEF_PTR_VOID );
778 }
779 }
780 else{
781 type.SetBasicType( GetTypeFromSimpleName(temporary) );
782 SetError(-103,temporary,nowLine);
783 }
784
[78]785 /*
786 TODO: 消す(TypeDef関連の変更)
[75]787 if( type.IsProcPtr() ){
788 //関数ポインタの場合
789 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine ) );
[78]790 }*/
[75]791
792 Parameter *pParam = new Parameter( name, type, isRef );
793 if( isArray ){
794 pParam->SetArray( subScripts );
795 }
796
797 //パラメータを追加
798 this->params.push_back( pParam );
799
800 if(sourceOfParams[i]==','){
801 i++;
802 continue;
803 }
804 else if(sourceOfParams[i]==')') continue;
805 else{
806 SetError(1,NULL,nowLine);
807 break;
808 }
809 }
810 i++;
811
812 if(sourceOfParams[i]){
813 ///////////////////
814 // 戻り値を取得
815 ///////////////////
816
817 i2=lstrlen(sourceOfParams)-2;
818
819 int sw_as=0;
820 for(;i2>0;i2--){
821 if(sourceOfParams[i2]==')') break;
822
823 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
824 i2+=2;
825 i3=0;
826 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
827 for(;;i2++,i3++){
828 if(!IsVariableChar(sourceOfParams[i2])){
829 temporary[i3]=0;
830 break;
831 }
832 temporary[i3]=sourceOfParams[i2];
833 }
834 Type::StringToType( temporary, this->returnType );
835 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
836
837 sw_as=1;
838 break;
839 }
840 }
841 }
842 else{
843 //戻り値なしのSub定義
844 this->returnType.SetNull();
845 }
846
847 //戻り値のエラーチェック
848 if( IsFunction() ){
849 // Function定義
850
851 if( this->ReturnType().IsNull() ){
852 // 戻り値がない
853 SetError(26,this->GetName(),nowLine);
854 }
855 }
856 else{
857 if( !this->ReturnType().IsNull() ){
858 // Sub定義なのに、戻り値がある
859 SetError(38,this->GetName(),nowLine);
860 }
861 }
862
863 return true;
864}
865
866UserProc *UserProc::pCompilingUserProc = NULL;
Note: See TracBrowser for help on using the repository browser.