#include "stdafx.h" #include #include "../BasicCompiler_Common/common.h" void ChangeReturnCode(char *buffer) { bool isMustChange = false; for( int i=0; ; i++ ){ if( buffer[i] == '\0' ){ break; } if( buffer[i]=='\n' ) { if( i>0 ) { if( buffer[i-1] == '\r' ) { isMustChange = true; } } } } if( !isMustChange ) { // 改行コードの変換は必要ない return; } #ifdef _DEBUG //改行コードの整合性チェック for( int i=0; ; i++ ){ if( buffer[i] == '\0' ){ break; } if( buffer[i]!='\r' && buffer[i+1]=='\n' || buffer[i]=='\r' && buffer[i+1]!='\n' ){ char temporary[255]; strncpy( temporary, buffer + i-100, 130 ); temporary[130] = 0; for(int i2=0; ;i2++){ if(temporary[i2]=='\r') temporary[i2]='A'; if(temporary[i2]=='\n') temporary[i2]='B'; if(temporary[i2]=='\0') break; } MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION ); } } #endif ChangeReturnCodeImpl(buffer); } void DeleteComment(char *buffer){ //注釈「'」の取り除き int i,i2,i3,IsStr; char *temporary=(char *)calloc(lstrlen(buffer)+1,sizeof (char)); for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){ if(buffer[i]=='\"') IsStr^=1; if(buffer[i]=='\n'||buffer[i]=='\0'){ if(i2 > 0){ i2--; while(temporary[i2]==' '||temporary[i2]=='\t') i2--; i2++; } if(i3){ //複数行に渡る注釈文の中に改行が存在するとき memset(temporary+i2,'\n',i3); i2+=i3; i3=0; } } if(buffer[i]=='\''&&IsStr==0){ //注釈文 i2--; while(temporary[i2]==' '||temporary[i2]=='\t') i2--; i2++; while(buffer[i]!='\n'&&buffer[i]!='\0') i++; } if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){ //注釈文(複数行) i+=2; i3=0; while(!(buffer[i]=='*'&&buffer[i+1]=='/')){ if(buffer[i]=='\n') i3++; if(buffer[i]=='\0') break; i++; } if(buffer[i]){ i+=2; } i--; i2--; continue; } temporary[i2]=buffer[i]; if(buffer[i]=='\0') break; } lstrcpy(buffer,temporary); free(temporary); } void CheckParenthesis(char *buffer){ int i,IsStr,PareNum,sw; _int8 bracket[1024]; for(i=0,IsStr=0,PareNum=0,sw=0;;i++){ if(buffer[i]=='\"'){ IsStr^=1; continue; } else if(buffer[i]=='('&&IsStr==0){ bracket[PareNum]=0; PareNum++; } else if(buffer[i]=='['&&IsStr==0){ bracket[PareNum]=1; PareNum++; } else if(buffer[i]==')'&&IsStr==0){ PareNum--; if(bracket[PareNum]!=0||PareNum<0){ //"カッコ \'( )\'" compiler.errorMessenger.Output(4,STRING_PARENTHESIS,i); return; } } else if(buffer[i]==']'&&IsStr==0){ PareNum--; if(bracket[PareNum]!=1||PareNum<0){ //"カッコ \'( )\'" compiler.errorMessenger.Output(4,STRING_PARENTHESIS,i); return; } } else if(buffer[i]=='\n'||buffer[i]=='\0'){ //"カッコ \'( )\'" if(PareNum!=0) compiler.errorMessenger.Output(4,STRING_PARENTHESIS,i); if(IsStr!=0) compiler.errorMessenger.Output(5,NULL,i); if(buffer[i]=='\0') break; PareNum=0; IsStr=0; sw=0; } else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){ //不正な文字コード if(sw==0){ //全角スペース if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40) compiler.errorMessenger.Output(20,NULL,i); //その他の全角文字 else compiler.errorMessenger.Output(8,NULL,i); sw=1; } } } } BOOL CheckParenthesis2(char *buffer){ int i,IsStr,PareNum,sw; _int8 bracket[1024]; for(i=0,IsStr=0,PareNum=0,sw=0;;i++){ if(buffer[i]=='\"'){ IsStr^=1; continue; } else if(buffer[i]=='('&&IsStr==0){ bracket[PareNum]=0; PareNum++; } else if(buffer[i]=='['&&IsStr==0){ bracket[PareNum]=1; PareNum++; } else if(buffer[i]==')'&&IsStr==0){ PareNum--; if(bracket[PareNum]!=0||PareNum<0){ //"カッコ \'( )\'" return 0; } } else if(buffer[i]==']'&&IsStr==0){ PareNum--; if(bracket[PareNum]!=1||PareNum<0){ //"カッコ \'( )\'" return 0; } } else if(buffer[i]=='\n'||buffer[i]=='\0'){ //"カッコ \'( )\'" if(PareNum!=0){ return 0; } if(IsStr!=0){ return 0; } if(buffer[i]=='\0') break; PareNum=0; IsStr=0; sw=0; } else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){ //不正な文字コード if(sw==0){ //全角スペース if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40){ return 0; } //その他の全角文字 else return 0; sw=1; } } } return 1; } inline int FindLineEnd(char const *basbuf, int i2){ for(;;i2++){ if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break; } return i2; } void DirectiveCheck(void){ extern char *basbuf; extern char BasicCurDir[MAX_PATH]; int i,i2,i3; char temporary[VN_SIZE]; for(i=0;;i++){ if(basbuf[i]=='\0') break; if(((basbuf[i-2]==0&&basbuf[i-1]==-1)||basbuf[i-1]=='\n')&& basbuf[i]=='#'){ for(i2=i+1,i3=0;;i2++,i3++){ if(!IsVariableChar(basbuf[i2])){ temporary[i3]=0; break; } temporary[i3]=basbuf[i2]; } if( lstrcmp( temporary, "static_link" ) == 0 ) { // 静的リンクライブラリ while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++; if(basbuf[i2]!='\"'){ compiler.errorMessenger.Output(1,NULL,i2); return; } for(i3=0,i2++;;i2++,i3++){ if(basbuf[i2]=='\"'){ temporary[i3]=0; break; } temporary[i3]=basbuf[i2]; } GetFullPath(temporary,BasicCurDir); compiler.staticLibraryFilePaths.push_back( temporary ); i2 = FindLineEnd(basbuf, i2); SlideString(basbuf+i2,i-i2); } else if( lstrcmpi( temporary, "_core" ) == 0 ) { // #_core // コアモジュール compiler.SetCoreMark( true ); i2 = FindLineEnd(basbuf, i2); SlideString(basbuf+i2,i-i2); } else if(lstrcmpi(temporary,"noprompt")==0){ //#noprompt //旧機能なので、無視 i2 = FindLineEnd(basbuf, i2); SlideString(basbuf+i2,i-i2); } else if(lstrcmpi(temporary,"strict")==0){ //#strict //旧機能なので、無視 i2 = FindLineEnd(basbuf, i2); SlideString(basbuf+i2,i-i2); } else if(lstrcmpi(temporary,"struct")==0){ //#struct code //旧機能なので、無視 i2 = FindLineEnd(basbuf, i2); SlideString(basbuf+i2,i-i2); } else if(lstrcmpi(temporary,"resource")==0){ //#resource while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++; if(basbuf[i2]!='\"'){ compiler.errorMessenger.Output(1,NULL,i2); return; } for(i3=0,i2++;;i2++,i3++){ if(basbuf[i2]=='\"'){ temporary[i3]=0; break; } temporary[i3]=basbuf[i2]; } GetFullPath(temporary,BasicCurDir); extern char ResourceFileName[MAX_PATH]; lstrcpy(ResourceFileName,temporary); i2 = FindLineEnd(basbuf, i2); SlideString(basbuf+i2,i-i2); } } } } void NextCommandFormat(char *buffer){ int i,i2,i3; char temporary[255]; //Next命令語のフォーマット for(i=0;;i++){ if(buffer[i]=='\n'||buffer[i]==':'||i==0){ if(buffer[i]=='\n'||buffer[i]==':') i++; while(buffer[i]==' '||buffer[i]=='\t') i++; while(buffer[i]>='0'&&buffer[i]<='9') i++; while(buffer[i]==' '||buffer[i]=='\t') i++; if((buffer[i]=='n'||buffer[i]=='N')&&(buffer[i+1]=='e'||buffer[i+1]=='E')&&(buffer[i+2]=='x'||buffer[i+2]=='X')&&(buffer[i+3]=='t'||buffer[i+3]=='T')&& (buffer[i+4]==' '||buffer[i+4]=='\t')){ i2=i+5; while(buffer[i2]==' '||buffer[i2]=='\t') i2++; if(buffer[i2]!='\n'){ lstrcpy(temporary,"NEXT"); for(i3=0;;i2++){ if(buffer[i2]=='\n'||buffer[i2]==':'||buffer[i2]=='\0') break; if(buffer[i2]==','){ lstrcat(temporary,":NEXT"); i3=1; } } if(i3){ i3=lstrlen(temporary); SlideString(buffer+i2,i-i2+i3); memcpy(buffer+i,temporary,i3); } } } } if(buffer[i]=='\0') break; } } void SetEscapeSequenceFormat(char *buffer){ /*「MOD」「AND」「OR」 その他制御文字をエスケープシーケンスを使用した記号へ変換 */ int i,i2,i3,i4,i5,i6,sw1,IsStr; char *temporary,temp2[VN_SIZE]; bool isBeforeCharDelimitation = true; temporary=(char *)calloc((lstrlen(buffer)+255)*2,sizeof (char)); for(i=0,i2=0,IsStr=0;;i++,i2++){ if(buffer[i]=='\"') IsStr^=1; if(buffer[i]=='-'&&buffer[i+1]=='>'&&IsStr==0){ buffer[i]=1; buffer[i+1]=ESC_PSMEM; } if( buffer[i] && IsCommandDelimitation( buffer[i] ) ){ isBeforeCharDelimitation = true; temporary[i2]=buffer[i]; continue; } if(IsVariableChar(buffer[i])&&IsStr==0){ i3=i2; for(;;i++,i2++){ if(!IsVariableChar(buffer[i])){ temporary[i2]=0; break; } temporary[i2]=buffer[i]; } bool isAfterCharBlank = false; if( IsBlank( buffer[i] ) ){ isAfterCharBlank = true; } if(lstrcmpi(temporary+i3,"End")==0) i6=1; else if(lstrcmpi(temporary+i3,"Exit")==0) i6=2; else if(lstrcmpi(temporary+i3,"Select")==0) i6=3; else if(lstrcmpi(temporary+i3,"Case")==0) i6=4; else if(lstrcmpi(temporary+i3,"Else")==0) i6=5; else i6=0; if(i6){ i4=i; while(buffer[i4]==' '||buffer[i4]=='\t') i4++; for(i5=0;;i4++,i5++){ if(!IsVariableChar(buffer[i4])){ temp2[i5]=0; break; } temp2[i5]=buffer[i4]; } sw1=0; if(i6==3){ //Select〜 if(lstrcmpi(temp2,"Case")==0) sw1=1; } else if(i6==4){ //Case〜 if(lstrcmpi(temp2,"Else")==0) sw1=1; } else if(i6==5){ //Else If if(lstrcmpi(temp2,"If")==0) sw1=1; } else if(i6==1){ //End〜 switch(temp2[0]){ case 'c': case 'C': if(lstrcmpi(temp2,"Class")==0) sw1=1; break; case 'e': case 'E': if(lstrcmpi(temp2,"Enum")==0) sw1=1; break; case 'i': case 'I': if(lstrcmpi(temp2,"If")==0) sw1=1; else if(lstrcmpi(temp2,"Interface")==0) sw1=1; break; case 'f': case 'F': if(lstrcmpi(temp2,"Function")==0) sw1=1; break; case 'm': case 'M': if(lstrcmpi(temp2,"Macro")==0) sw1=1; break; case 'n': case 'N': if(lstrcmpi(temp2,"Namespace")==0) sw1=1; break; case 's': case 'S': if(lstrcmpi(temp2,"Sub")==0) sw1=1; else if(lstrcmpi(temp2,"Select")==0) sw1=1; break; case 't': case 'T': if(lstrcmpi(temp2,"Try")==0) sw1=1; else if(lstrcmpi(temp2,"Type")==0) sw1=1; break; case 'w': case 'W': if(lstrcmpi(temp2,"With")==0) sw1=1; break; } } else if(i6==2){ //Exit〜 if( lstrcmpi(temp2,"For")==0|| lstrcmpi(temp2,"While")==0|| lstrcmpi(temp2,"Do")==0|| lstrcmpi(temp2,"Function")==0|| lstrcmpi(temp2,"Sub")==0|| lstrcmpi(temp2,"Macro")==0 ) sw1=1; } if(sw1){ i=i4; memcpy(temporary+i2,temp2,i5); i2+=i5; temporary[i2]=0; } } i--; i2--; switch(temporary[i3]){ case '_': if(lstrcmpi(temporary+i3,"_ClearNamespaceImported")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CLEARNAMESPACEIMPORTED; } if(lstrcmpi(temporary+i3,"_System_Static_New")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_SYSTEM_STATIC_NEW; } break; case 'a': case 'A': if(lstrcmpi(temporary+i3,"And")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_AND; } else if(lstrcmpi(temporary+i3,"Abstract")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ABSTRACT; } else if(lstrcmpi(temporary+i3,"As")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_AS; } break; case 'b': case 'B': if(lstrcmpi(temporary+i3,"ByVal")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_BYVAL; } else if(lstrcmpi(temporary+i3,"ByRef")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_BYREF; } break; case 'c': case 'C': if(lstrcmpi(temporary+i3,"Catch")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CATCH; } else if(lstrcmpi(temporary+i3,"Continue")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CONTINUE; } else if(lstrcmpi(temporary+i3,"cdecl")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CDECL; } else if(lstrcmpi(temporary+i3,"Case")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CASE; } else if(lstrcmpi(temporary+i3,"CaseElse")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CASEELSE; } else if(lstrcmpi(temporary+i3,"Const")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CONST; } else if(lstrcmpi(temporary+i3,"Class")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_CLASS; } break; case 'd': case 'D': if(lstrcmpi(temporary+i3,"Declare")==0){ i2=i3; int i9=i2; temporary[i2]=1; temporary[++i2]=ESC_DECLARE; i++; while(buffer[i]==' '||buffer[i]=='\t') i++; // Sub/Function for(i4=0;;i++,i4++){ if(!IsVariableChar(buffer[i])){ temp2[i4]=0; break; } temp2[i4]=buffer[i]; } if(lstrcmpi(temp2,"Sub")==0) temporary[++i2]=ESC_SUB; else if(lstrcmpi(temp2,"Function")==0) temporary[++i2]=ESC_FUNCTION; while(buffer[i]==' '||buffer[i]=='\t') i++; // 関数名 for(i2++;;i++,i2++){ if(!IsVariableChar(buffer[i])){ i2--; break; } temporary[i2]=buffer[i]; } while(buffer[i]==' '||buffer[i]=='\t') i++; for(i4=0;;i++,i4++){ if(!IsVariableChar(buffer[i])){ temp2[i4]=0; break; } temp2[i4]=buffer[i]; } if(lstrcmpi(temp2,"cdecl")==0){ temporary[++i2]=1; temporary[++i2]=ESC_CDECL; while(buffer[i]==' '||buffer[i]=='\t') i++; for(i4=0;;i++,i4++){ if(!IsVariableChar(buffer[i])){ temp2[i4]=0; break; } temp2[i4]=buffer[i]; } } if(lstrcmpi(temp2,"Lib")==0) temporary[++i2]=','; while(buffer[i]==' '||buffer[i]=='\t') i++; if(buffer[i]=='\"'){ temporary[++i2]=buffer[i]; for(i++,i2++;;i++,i2++){ temporary[i2]=buffer[i]; if(buffer[i]=='\"'){ i++; break; } if(buffer[i]=='\0') break; } } else{ for(i2++;;i++,i2++){ if(!IsVariableChar(buffer[i])){ i2--; break; } temporary[i2]=buffer[i]; } } while(buffer[i]==' '||buffer[i]=='\t') i++; temporary[++i2]=','; if( memicmp( buffer + i, "Alias", 5 ) ==0 ){ i+=5; for(i++,i2++;;i++,i2++){ temporary[i2]=buffer[i]; if(buffer[i]=='('){ i2--; break; } if(buffer[i]=='\0') break; } } temporary[++i2]=','; i--; } else if(lstrcmpi(temporary+i3,"Def")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_DEF; } else if( lstrcmpi(temporary+i3,"Delegate")==0 ) { i2=i3; temporary[i2++]=1; temporary[i2]=ESC_DELEGATE; } break; case 'e': case 'E': if(lstrcmpi(temporary+i3,"ElseIf")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ELSEIF; } else if(lstrcmpi(temporary+i3,"Else")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ELSE; } else if(lstrcmpi(temporary+i3,"Export")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_EXPORT; } else if(lstrcmpi(temporary+i3,"Enum")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENUM; } else if(temporary[i3+1]=='n'||temporary[i3+1]=='N'){ //終了記述 if(lstrcmpi(temporary+i3,"EndIf")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDIF; } else if(lstrcmpi(temporary+i3,"EndFunction")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDFUNCTION; } else if(lstrcmpi(temporary+i3,"EndSub")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDSUB; } else if(lstrcmpi(temporary+i3,"EndMacro")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDMACRO; } else if(lstrcmpi(temporary+i3,"EndNamespace")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDNAMESPACE; } else if(lstrcmpi(temporary+i3,"EndClass")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDCLASS; } else if(lstrcmpi(temporary+i3,"EndInterface")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDINTERFACE; } else if(lstrcmpi(temporary+i3,"EndTry")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDTRY; } else if(lstrcmpi(temporary+i3,"EndType")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDTYPE; } else if(lstrcmpi(temporary+i3,"EndEnum")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDENUM; } else if(lstrcmpi(temporary+i3,"EndSelect")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDSELECT; } else if(lstrcmpi(temporary+i3,"EndWith")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_ENDWITH; } } else if(temporary[i3+1]=='x'||temporary[i3+1]=='X'){ if(lstrcmpi(temporary+i3,"ExitFor")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_EXITFOR; } else if(lstrcmpi(temporary+i3,"ExitWhile")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_EXITWHILE; } else if(lstrcmpi(temporary+i3,"ExitDo")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_EXITDO; } else if(lstrcmpi(temporary+i3,"ExitFunction")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_EXITFUNCTION; } else if(lstrcmpi(temporary+i3,"ExitSub")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_EXITSUB; } else if(lstrcmpi(temporary+i3,"ExitMacro")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_EXITMACRO; } } break; case 'f': case 'F': if(lstrcmpi(temporary+i3,"Finally")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_FINALLY; } else if(lstrcmpi(temporary+i3,"Function")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_FUNCTION; } break; case 'i': case 'I': if(lstrcmpi(temporary+i3,"If")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_IF; } else if(lstrcmpi(temporary+i3,"Imports")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_IMPORTS; } else if(lstrcmpi(temporary+i3,"Inherits")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_INHERITS; } else if( lstrcmpi( temporary + i3, "Implements" ) == 0 ) { i2 = i3; temporary[i2++] = 1; temporary[i2] = ESC_IMPLEMENTS; } else if(lstrcmpi(temporary+i3,"Interface")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_INTERFACE; } break; case 'm': case 'M': if(lstrcmpi(temporary+i3,"Mod")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_MOD; } else if(lstrcmpi(temporary+i3,"Macro")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_MACRO; } break; case 'n': case 'N': if(isBeforeCharDelimitation && lstrcmpi(temporary+i3,"Namespace")==0 && isAfterCharBlank ){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_NAMESPACE; } else if(lstrcmpi(temporary+i3,"New")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_NEW; } else if(lstrcmpi(temporary+i3,"Not")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_NOT; } break; case 'o': case 'O': if(lstrcmpi(temporary+i3,"Or")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_OR; } else if(lstrcmpi(temporary+i3,"Override")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_OVERRIDE; } else if(lstrcmpi(temporary+i3,"Operator")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_OPERATOR; } break; case 's': case 'S': if(lstrcmpi(temporary+i3,"Sub")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_SUB; } else if(lstrcmpi(temporary+i3,"SelectCase")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_SELECTCASE; } else if(lstrcmpi(temporary+i3,"Static")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_STATIC; } break; case 't': case 'T': if(lstrcmpi(temporary+i3,"Then")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_THEN; } else if(lstrcmpi(temporary+i3,"Throw")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_THROW; } else if(lstrcmpi(temporary+i3,"Try")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_TRY; } else if(lstrcmpi(temporary+i3,"Type")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_TYPE; } else if(lstrcmpi(temporary+i3,"TypeDef")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_TYPEDEF; } break; case 'u': case 'U': if(lstrcmpi(temporary+i3,"Using")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_USING; } break; case 'v': case 'V': if(lstrcmpi(temporary+i3,"Virtual")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_VIRTUAL; } break; case 'w': case 'W': if(lstrcmpi(temporary+i3,"With")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_WITH; } break; case 'x': case 'X': if(lstrcmpi(temporary+i3,"Xor")==0){ i2=i3; temporary[i2++]=1; temporary[i2]=ESC_XOR; } break; } continue; } if( !IsBlank( buffer[i] ) ){ isBeforeCharDelimitation = false; } temporary[i2]=buffer[i]; if(buffer[i]=='\0') break; } lstrcpy(buffer,temporary); free(temporary); } void DefCommandFormat(char *buffer){ int i,i2,PareNum; char temporary[255]; //Def命令語からFunction命令語へ for(i=0;;i++){ if(buffer[i]==1&&buffer[i+1]==ESC_DEF){ buffer[i+1]=ESC_FUNCTION; i+=2; while(buffer[i]==' '||buffer[i]=='\t') i++; for(i2=0;;i++,i2++){ if(!IsVariableChar(buffer[i])){ temporary[i2]=0; break; } temporary[i2]=buffer[i]; } while(buffer[i]==' '||buffer[i]=='\t') i++; if(buffer[i]!='('){ compiler.errorMessenger.Output(1,NULL,i); return; } i++; while(1){ while(buffer[i]==' '||buffer[i]=='\t') i++; if(buffer[i]==')') break; SlideString(buffer+i,2); buffer[i]=1; buffer[i+1]=ESC_BYVAL; i+=2; PareNum=0; for(;;i++){ if(buffer[i]=='(') PareNum++; if(buffer[i]==')'){ PareNum--; if(PareNum<0) break; } if(buffer[i]==','&&PareNum==0) break; } if(buffer[i]==')') break; i++; } i++; while(buffer[i]==' '||buffer[i]=='\t') i++; if(buffer[i]!='='){ compiler.errorMessenger.Output(1,NULL,i); break; } i2=lstrlen(temporary); SlideString(buffer+i,i2+1); buffer[i]=':'; i++; memcpy(buffer+i,temporary,i2); i+=i2; while(!IsCommandDelimitation(buffer[i])) i++; SlideString(buffer+i,3); buffer[i]=':'; buffer[i+1]=1; buffer[i+2]=ESC_ENDFUNCTION; } if(buffer[i]=='\0') break; } } void ChangeOneIf(char *write,int &wp,char *read,int &rp){ int IsStr,sw; //ブロック形式でないときはThenの後に区切り文字を入れる for(IsStr=0,sw=0;;wp++,rp++){ if(read[rp]=='\"') IsStr^=1; write[wp]=read[rp]; if(IsCommandDelimitation(read[rp])&&IsStr==0) return; if(read[rp]==1&&read[rp+1]==ESC_THEN&& (read[rp+2]==' '||read[rp+2]=='\t')){ write[wp+1]=read[rp+1]; write[wp+2]=':'; rp+=3; wp+=3; while(read[rp]==' '||read[rp]=='\t') rp++; if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){ memcpy(write+wp,"Goto ",5); wp+=5; } break; } } //Elseの後に区切り文字を入れる for(IsStr=0;;wp++,rp++){ if(read[rp]=='\"') IsStr^=1; write[wp]=read[rp]; if(read[rp]=='\n'||read[rp]=='\0') break; if(read[rp]==1&&read[rp+1]==ESC_IF){ write[wp+1]=read[rp+1]; wp+=2; rp+=2; ChangeOneIf(write,wp,read,rp); wp--; rp--; continue; } if(read[rp]==1&&read[rp+1]==ESC_ELSE){ write[wp++]=':'; write[wp]=read[rp]; write[wp+1]=read[rp+1]; wp+=2; rp+=2; write[wp++]=':'; while(read[rp]==' '||read[rp]=='\t') rp++; if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){ memcpy(write+wp,"Goto ",5); wp+=5; } break; } } //"End If" を付加 for(;;rp++,wp++){ if(read[rp]=='\n'||read[rp]=='\0') break; if(read[rp]==1&&read[rp+1]==ESC_IF){ write[wp+1]=read[rp+1]; wp+=2; rp+=2; ChangeOneIf(write,wp,read,rp); wp--; rp--; continue; } if(read[rp]==1&&read[rp+1]==ESC_ELSE) break; write[wp]=read[rp]; } write[wp]=':'; write[wp+1]=1; write[wp+2]=ESC_ENDIF; wp+=3; } void OutsideIfFormat(char *write,int &wp,char *read,int &rp){ int ElseCount=1; for(;;rp++,wp++){ if(read[rp]==1){ if(read[rp+1]==ESC_IF){ write[wp++]=read[rp++]; write[wp++]=read[rp++]; OutsideIfFormat(write,wp,read,rp); wp--,rp--; continue; } if(read[rp+1]==ESC_ENDIF){ for(;ElseCount>0;wp+=3,ElseCount--){ write[wp]=1; write[wp+1]=ESC_ENDIF; write[wp+2]=':'; } rp+=2; break; } if(read[rp+1]==ESC_ELSEIF){ write[wp]=1; write[wp+1]=ESC_ELSE; write[wp+2]=':'; write[wp+3]=1; write[wp+4]=ESC_IF; wp+=4; rp++; ElseCount++; continue; } } write[wp]=read[rp]; if(read[rp]=='\0') break; } } void IfCommandFormat(char *buffer){ int i,i2; char *temporary = (char*)malloc(strlen(buffer)*2+1024); //1行Ifをブロック形式にする for(i=0,i2=0;;i++,i2++){ if(buffer[i]==1&&buffer[i+1]==ESC_IF){ temporary[i2++]=buffer[i++]; temporary[i2++]=buffer[i++]; ChangeOneIf(temporary,i2,buffer,i); i2--,i--; continue; } temporary[i2]=buffer[i]; if(buffer[i]=='\0') break; } //ElseIfを入れ子構造に変更する for(i=0,i2=0;;i++,i2++){ if(temporary[i]==1&&temporary[i+1]==ESC_IF){ buffer[i2++]=temporary[i++]; buffer[i2++]=temporary[i++]; OutsideIfFormat(buffer,i2,temporary,i); i2--,i--; continue; } buffer[i2]=temporary[i]; if(temporary[i]=='\0') break; } free(temporary); } void CheckPareCommand(void){ extern char *basbuf; int i2,i3; int FuncNum=0; int FuncType=0; int FuncPtr=-1; for(i2=0;;i2++){ if(basbuf[i2]=='\0') break; if(IsCommandDelimitation(basbuf[i2])){ if(basbuf[i2+1]==1){ i2++; switch(basbuf[i2+1]){ case ESC_FUNCTION: case ESC_SUB: case ESC_MACRO: if(FuncNum!=0){ if(FuncType==ESC_FUNCTION) compiler.errorMessenger.Output(54,"End Function",FuncPtr); else if(FuncType==ESC_SUB) compiler.errorMessenger.Output(54,"End Sub",FuncPtr); else if(FuncType==ESC_MACRO) compiler.errorMessenger.Output(54,"End Macro",FuncPtr); return; } FuncType=basbuf[i2+1]; FuncNum++; FuncPtr=i2; break; case ESC_ENDFUNCTION: case ESC_ENDSUB: case ESC_ENDMACRO: if(basbuf[i2+1]==ESC_ENDFUNCTION) i3=ESC_FUNCTION; else if(basbuf[i2+1]==ESC_ENDSUB) i3=ESC_SUB; else if(basbuf[i2+1]==ESC_ENDMACRO) i3=ESC_MACRO; FuncNum--; if(FuncNum!=0||i3!=FuncType){ if(basbuf[i2+1]==ESC_ENDFUNCTION) compiler.errorMessenger.Output(12,"End Function",i2); else if(basbuf[i2+1]==ESC_ENDSUB) compiler.errorMessenger.Output(12,"End Sub",i2); else if(basbuf[i2+1]==ESC_ENDMACRO) compiler.errorMessenger.Output(12,"End Macro",i2); return; } break; } } } } }