str preprocess(str code) { //препроцессор: вставляет другие файлы в текст str res=""; unsigned long long int ptr=1,lastptr=1; ptr = code.Pos("#"); if(ptr==0) return code; while(ptr!=0) { code=code.SubString(lastptr,code.Length()); lastptr=1; ptr = code.Pos("#"); if (ptr==0) { res=res+code.SubString(lastptr,code.Length()); break; } else res=res+code.SubString(lastptr,ptr-1); if(code.SubString(ptr+1,7).UpperCase()=="INCLUDE") { ptr+=8; while(ptr<=code.Length() && code[ptr]==' ') ptr++; str filename =""; unsigned long long int tmp=ptr; while(tmp<=code.Length() && (code[tmp]!='\r' && code[tmp]!=' ' && code[tmp]!='\n')) filename+=code[tmp++]; char cstr=0; ifstream f; f.open(filename.c_str()); while(!f.eof()) { f.get(cstr); if(!f.eof()) res=res+cstr; //memset(strtmp, 0, sizeof(strtmp)); } res=res+" "; lastptr=tmp; f.close(); } } //ShowMessage(res); return res; }
vector<str> parseCode(str code) { //парсер: разбивает код по пробельным символам и ищет строки vector<str> res; str now; code=code.Trim(); for(int i=1;i<=code.Length();i++) { if(code[i]!=' ' && code[i]!='\r' && code[i]!='\t' && code[i]!='\n') { if(code[i]=='\"') { i++; while(i<=code.Length()) { if(code[i]=='\"' && code[i-1]!='\\') break; now=now+code[i]; i++; } str tmp=""; // ShowMessage("0"+now+"0"); for(int i =1; i<=now.Length();i++) { if(now[i]==' ') tmp=tmp+"\\s"; else tmp=tmp+now[i]; } now=tmp; // ShowMessage("0"+now+"0"); res.push_back("STR"); } else now=now+code[i]; } else { while(i<=code.Length() && (code[i]==' ' || code[i]=='\t' || code[i]=='\n' || code[i]=='\r')) i++; i--; res.push_back(now.Trim()); now=""; } } if(now!="") res.push_back(now.Trim()); return res; }
str escape(str t) { //обработка escape последовательностей в строке str res=""; t=t+" "; for(int i=1;i<=t.Length()-1;i++) if(t[i]=='\\' && t[i+1]=='\\') res=res+t[i++] ; else if(t[i]=='\\' && t[i+1]=='n') { res=res+'\n'; i++; } else if(t[i]=='\\' && t[i+1]=='s') { res=res+' '; i++; } else if(t[i]=='\\') res=res+t[++i]; else res=res+t[i]; return res; }
void setCh(unsigned long long int n, char value) { if(n>size) *s=*s+*new str(" ",n-size); (*s)[n]=value; size=s->Length(); }