source: dev/BasicCompiler_Common/Procedure.cpp@ 77

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

デフォルトパラメータに対応。

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