BF编译器

· · 个人记录

Brainfuck

//For Brainfuck
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<windows.h>
#include<conio.h>
#include<ctime>
using namespace std;
clock_t t1,t2;
int ti;
POINT pt;
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)
HWND hConsole=FindWindow("ConsoleWindowClass",NULL);
void colset(int a){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void Goto(int Y,int X){
    COORD C; C.X=X; C.Y=Y; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),C);   
}
void Hide(){ 
    CONSOLE_CURSOR_INFO cursor_info={1,0}; 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
bool got(){
    GetCursorPos(&pt);
    ScreenToClient(hConsole,&pt);
    fflush(stdin);
    return true;
}
int pan(int x,int y){
    if(x<0||x>64)   return 0;
    y/=8;
    ++y;
    if(y>=3&&y<=10) return 1;
    if(y>=13&&y<=20)    return 2;
    if(y>=23&&y<=28)    return 3;
    if(y>=31&&y<=42)    return 4;
    if(y>=45&&y<=50)    return 5;
    if(y>=53&&y<=57)    return 6;
    if(y>=60&&y<=71)    return 7;
    if(y>=74&&y<=80)    return 8;
    return 0;
}
int by[10000002];
char lo[10000002],sc[10000002];
bool bp[10000002];
int now=1,ma,s=-1,nnnn=0,cs,mn;
bool ok=false,xr;
int q=0,lk;
bool aaa;
bool co(int be,int en){
    if(be>en){
        printf("Runtime Error: There's no anything in it\n");
        for(int i=1;i<en;i++)   printf("%c",lo[i]);
        colset(12);
        for(int i=en;i<=be;i++) printf("%c",lo[i]);
        colset(15);
        for(int i=be+1;i<=q;i++)    printf("%c",lo[i]);
        printf("\n");
        aaa=false;
        lk=lk+3+(q-1)/175;
        printf("-----------------------------------\n");
    }
    int nn=be;
    while(nn<=en){
        if(lo[nn]=='<'){
            --now;
            if(now==0){
                printf("Memory Limit Exceed: No variable position there\n");
                for(int i=1;i<nn;i++)   printf("%c",lo[i]);
                colset(12);
                printf("%c",lo[nn]);
                colset(15);
                for(int i=nn+1;i<=q;i++)    printf("%c",lo[i]);
                printf("\n");
                aaa=false;
                lk=lk+3+(q-1)/175;
                printf("-----------------------------------\n");
            }
        }
        else if(lo[nn]=='>'){
            ++now;
            if(now>10000000){
                printf("Memory Limit Exceed: I don\'t know why you want so big memories or... more than 1000,0000 bytes!\n");
                aaa=false;
                printf("-----------------------------------\n");
                lk=lk+3+(q-1)/175;
            }
        }
        else if(lo[nn]=='+'){
            ;
        }
        else if(lo[nn]=='-'){
            ;
        }
        else if(lo[nn]=='.'){
            ;
        }
        else if(lo[nn]==','){
            ;
        }
        else if(lo[nn]=='['){
            int nnn=nn+1,no=1;
            while(no!=0 && nnn<=en){
                if(lo[nnn]=='[')    ++no;
                if(lo[nnn]==']')    --no;
                ++nnn;
            }
            if(nnn!=en+1||no==0){
                aaa=co(nn+1,nnn-2);
            }
            else{
                printf("Compile Error: I can\'t find the last part there\n");
                for(int i=1;i<nn;i++)   printf("%c",lo[i]);
                colset(12);
                printf("%c",lo[nn]);
                colset(15);
                for(int i=nn+1;i<=q;i++)    printf("%c",lo[i]);
                printf("\n");
                aaa=false;
                printf("-----------------------------------\n");
                lk=lk+3+(q-1)/175;
            }
            nn=nnn-1;
        }
        else if(lo[nn]==' '){;}
        else if(lo[nn]==']'){
            printf("Comlple Error: I can\'t the first part there\n");
            for(int i=1;i<nn;i++)   printf("%c",lo[i]);
            colset(12);
            printf("%c",lo[nn]);
            colset(15);
            for(int i=nn+1;i<=q;i++)    printf("%c",lo[i]);
            printf("\n");
            aaa=false;
            printf("-----------------------------------\n");
            lk=lk+3+(q-1)/175;
        }
        else{
            printf("Compile Error: I don\'t know what \'%c\' is\n",lo[nn]);
            for(int i=1;i<nn;i++)   printf("%c",lo[i]);
            colset(12);
            printf("%c",lo[nn]);
            colset(15);
            for(int i=nn+1;i<=q;i++)    printf("%c",lo[i]);
            printf("\n");
            aaa=false;
            printf("-----------------------------------\n");
            lk=lk+3+(q-1)/175;
        }
        ++nn;
    }
    return aaa;
}
int ssc,sg=0,sg2,sg3=0,sg4;
void sou1(int be,int en){
    int nn=be;
    while(nn<=en){
        if(bp[nn]){
            t2=clock();
            ti=ti+(t2-t1);
            Goto(7+sg3,0);
            printf("Breakpoint there!\n");
            for(int i=1;i<nn;i++)   printf("%c",lo[i]);
            colset(10);
            printf("%c",lo[nn]);
            colset(15);
            for(int i=nn+1;i<=q;i++)    printf("%c",lo[i]);
            printf("\n");
            printf("You can look at the data\n");
            printf("+----++----+\n");
            printf("|Look||Quit|\n");
            printf("|   L||   Q|\n");
            printf("+----++----+\n");
            while(1){
                if(kbhit()){
                    char haha=getch();
                    if(haha=='L'||haha=='l'){
                        int h=(mn+9)/10;
                        for(int i=0;i<h;i++){
                            for(int j=0;j<10;j++){
                                if(i*10+j+1==now)   colset(12);
                                printf(" %3d |",by[i*10+j+1]);
                                colset(15);
                            }
                            printf("\n");
                            if((now+9)/10==i+1){
                                for(int j=1;j<(now%10);j++) printf("      ");
                                printf(" ^^^\n");
                            }
                        }
                        printf("Continue...\n");
                        Sleep(3000);
                        Goto(7+sg3,0);
                        printf("                    \n");
                        for(int i=1;i<=q;i++)   printf(" ");
                        printf("\n");
                        printf("                                              \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        for(int i=0;i<h;i++){   
                            for(int j=0;j<10;j++){
                                printf("      ");
                            }
                            printf("\n");
                            if((now+9)/10==i+1){
                                for(int j=1;j<(now%10);j++) printf("      ");
                                printf("     \n");
                            }
                        }
                        printf("              \n");
                        break;
                    }
                    if(haha=='Q'||haha=='q'){
                        printf("Continuing\n");
                        Sleep(3000);
                        Goto(7+sg3,0);
                        printf("                    \n");
                        for(int i=1;i<=q;i++)   printf(" ");
                        printf("\n");
                        printf("                                              \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("              \n");
                        break;
                    } 
                }
                if(KEY_DOWN(MOUSE_MOVED)){
                    got();
                    if(pt.y>(10+sg3+(q-1)/175)*16&&pt.y<(14+sg3+(q-1)/175)*16&&pt.x>0&&pt.x<48){
                        int h=(mn+9)/10;
                        for(int i=0;i<h;i++){
                            for(int j=0;j<10;j++){
                                if(i*10+j+1==now)   colset(12);
                                printf(" %3d |",by[i*10+j+1]);
                                colset(15);
                            }
                            printf("\n");
                            if((now+9)/10==i+1){
                                for(int j=1;j<(now%10);j++) printf("      ");
                                printf(" ^^^\n");
                            }
                        }
                        printf("Continue...\n");
                        Sleep(3000);
                        Goto(7+sg3,0);
                        printf("                    \n");
                        for(int i=1;i<=q;i++)   printf(" ");
                        printf("\n");
                        printf("                                              \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        for(int i=0;i<h;i++){   
                            for(int j=0;j<10;j++){
                                printf("      ");
                            }
                            printf("\n");
                            if((now+9)/10==i+1){
                                for(int j=1;j<(now%10);j++) printf("      ");
                                printf("     \n");
                            }
                        }
                        printf("              \n");
                        break;
                    }
                    if(pt.y>(10+sg3+(q-1)/175)*16&&pt.y<(14+sg3+(q-1)/175)*16&&pt.x>48&&pt.x<96){
                        printf("Continue...\n");
                        Sleep(3000);
                        Goto(7+sg3,0);
                        printf("                    \n");
                        for(int i=1;i<=q;i++)   printf(" ");
                        printf("\n");
                        printf("                                              \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("                  \n");
                        printf("              \n");
                        break;
                    }
                }
            }           
            t1=clock();
        }
        if(lo[nn]=='<') --now;
        else if(lo[nn]=='>'){
            ++now;
            if(mn<now)  mn=now;
        }
        else if(lo[nn]=='+'){
            ++by[now];
            while(by[now]<0)    by[now]+=128;
            while(by[now]>127)  by[now]-=128;
        }
        else if(lo[nn]=='-'){
            --by[now];
            while(by[now]<0)    by[now]+=128;
            while(by[now]>127)  by[now]-=128;
        }
        else if(lo[nn]=='.'){
            while(by[now]<0)    by[now]+=128;
            while(by[now]>127)  by[now]-=128;
            if(by[now]=='\n'){
                ++sg3;
                Goto(5+sg3,9);
                printf("|");
                for(int i=0;i<sg4;i++)  printf(" ");
                printf("|");
                Goto(6+sg3,9);
                printf("+");
                for(int i=0;i<sg4;i++)  printf("-");
                printf("+");
                sg=0;
            }
            else{
                ++sg;
                if(sg>sg4){
                    for(int i=0;i<=sg3;i++){
                        Goto(5+i,9+sg);
                        printf(" |");
                    }
                    Goto(4,9+sg4+1);
                    for(int i=0;i<sg-sg4;i++)   printf("-");
                    printf("+");
                    Goto(6+sg3,9+sg4+1);
                    for(int i=0;i<sg-sg4;i++)   printf("-");
                    printf("+");
                    sg4=sg;
                }
                Goto(5+sg3,9+sg);
                printf("%c",by[now]);
            }
        }
        else if(lo[nn]==','){
            Goto(7+sg3,0);
            t2=clock();
            ti=ti+t2-t1;
            printf("Waiting for read in No. %d\n",nn);
            for(int i=1;i<nn;i++)   printf("%c",lo[i]);
            colset(12);
            printf("%c",lo[nn]);
            colset(15);
            for(int i=nn+1;i<=q;i++)    printf("%c",lo[i]);
            printf("\n");
            char haha;
            haha=getch();
            by[now]=(int)haha;
            if(by[now]==13){
                Goto(1,10+sg2);
                printf("--+");
                Goto(2,10+sg2);
                printf("\\n|");
                Goto(3,10+sg2);
                printf("--+");
                sg2+=2;
                by[now]=10;
            }
            else{
                Goto(1,10+sg2);
                printf("-+");
                Goto(2,10+sg2);
                printf("%c|",haha);
                Goto(3,10+sg2);
                printf("-+");
                ++sg2;
            }
            Goto(7+sg3,0);
            printf("                                 \n");
            for(int i=1;i<=q;i++)   printf(" ");
            t1=clock();
        }
        else if(lo[nn]=='['){
            int nnn=nn+1,no=1;
            while(no!=0){
                if(lo[nnn]=='[')    ++no;
                if(lo[nnn]==']')    --no;
                ++nnn;
            }
            while(by[now]!=0){
                sou1(nn+1,nnn-2);
                ++cs;
                if(cs>1000000){
                    Goto(7,0);
                    printf("\nRuntime Error: soo many loops or... more than 100,0000 times!\n");
                    ++ssc;
                    return;
                }
            }
            nn=nnn-1;
        }
        ++nn;
    }
}
int K=0;
bool com(){
    now=1;
    s=-1;
    nnnn=0;
    aaa=true;
    return co(1,q);
}
void run(){
    memset(by,0,sizeof(by));
    system("cls");
    Goto(0,0);
    mn=1;
    s=-1;
    ssc=0;
    printf("\n+-----+  ++\n");
    printf("|Input|  ||\n");
    printf("+-----+  ++\n");
    printf("+-----+  ++\n");
    printf("|Ouput|  ||\n");
    printf("+-----+  ++");
    sg=0;
    sg2=0;
    sg3=0;
    sg4=0;
    cs=0;
    ti=0;
    t1=clock();
    sou1(1,q);
    t2=clock();
    ti=ti+t2-t1;
    Goto(0,0); 
    printf("Use %d ms to run...",ti);
    Sleep(1000);
}
void bpt(){
    int qw=1;
    colset(15);system("cls");
    printf("\n---------------------\n");
    int qwe=(q-1)/175+1;
    Goto(3,0);
    for(int i=0;i<qwe;i++){
        for(int j=1;j<=(i==qwe-1?(q-1)%175+1:175);j++){
            if(bp[i*175+j]) colset(10);
            if(i*175+j==1)  colset(12);
            printf("%c",lo[i*175+j]);
            colset(15);
        }
    }
    printf("\n");
    printf("      +----+\n");
    printf("      | Up |\n");
    printf("      |   W|\n");
    printf("      +----+\n");
    printf("+----++----++-----+\n");
    printf("|Left||Done||Right|\n");
    printf("|   A||  \\n||    D|\n");
    printf("+----++----++-----+\n");
    printf("+----++----+\n");
    printf("|Quit||Down|\n");
    printf("|   Q||   S|\n");
    printf("+----++----+\n");
    printf("\n---------------------\n");
    while(1){
        if(kbhit()){
            char hhhh=getch();
            if(hhhh=='A'||hhhh=='a'||hhhh=='D'||hhhh=='d'
                ||hhhh=='S'||hhhh=='s'||hhhh=='W'||hhhh=='w'){
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(15);
                if(bp[qw])  colset(10);
                printf("%c",lo[qw]);
            }
            if(hhhh=='A'||hhhh=='a'){
                --qw;
                if(qw<1)    qw+=q;
                while(lo[qw]=='['||lo[qw]==']'){
                    --qw;
                    if(qw<0)    qw+=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }
            else if(hhhh=='D'||hhhh=='d'){
                ++qw;
                if(qw>q)    qw-=q;
                while(lo[qw]=='['||lo[qw]==']'){
                    ++qw;
                    if(qw>q)    qw-=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }
            else if(hhhh=='w'||hhhh=='W'){
                qw-=175;
                if(qw<1){
                    while(qw<1) qw+=175;
                }
                while(lo[qw]=='['||lo[qw]==']'){
                    ++qw;
                    if(qw>q)    qw-=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }       
            else if(hhhh=='s'||hhhh=='S'){
                qw+=175;
                if(qw>q){
                    while(qw>q) qw-=175;
                }
                while(lo[qw]=='['||lo[qw]==']'){
                    ++qw;
                    if(qw>q)    qw-=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }       
            else if(hhhh==13){
                bp[qw]=!bp[qw];
                Goto(0,0);
                colset(12);
                if(bp[qw])  printf("Now there is a breakpoint.");
                else    printf("Now there is not a breakpoint.");
                printf("Press or click to continue...");
                while(1){
                    if(kbhit()||KEY_DOWN(MOUSE_MOVED))  return;
                }
                break;
            }
            if(hhhh=='Q'||hhhh=='q')    break;
        }
        if(KEY_DOWN(MOUSE_MOVED)){
            Sleep(100);
            got();
            if((pt.y>0+(4+(q-1)/175)*16&&pt.y<64+(4+(q-1)/175)*16&&pt.x>48&&pt.x<96)
               ||(pt.y>64+(4+(q-1)/175)*16&&pt.y<128+(4+(q-1)/175)*16&&pt.x>0&&pt.x<48)
               ||(pt.y>64+(4+(q-1)/175)*16&&pt.y<128+(4+(q-1)/175)*16&&pt.x>96&&pt.x<136)
               ||(pt.y>128+(4+(q-1)/175)*16&&pt.y<192+(4+(q-1)/175)*16&&pt.x>48&&pt.x<96)){
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(15);
                if(bp[qw])  colset(10);
                printf("%c",lo[qw]);
            }
            if(pt.y>0+(4+(q-1)/175)*16&&pt.y<64+(4+(q-1)/175)*16&&pt.x>48&&pt.x<96){
                qw-=175;
                if(qw<1){
                    while(qw<1) qw+=175;
                }
                while(lo[qw]=='['||lo[qw]==']'){
                    ++qw;
                    if(qw>q)    qw-=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }
            if(pt.y>64+(4+(q-1)/175)*16&&pt.y<128+(4+(q-1)/175)*16&&pt.x>0&&pt.x<48){
                --qw;
                if(qw<1)    qw+=q;
                while(lo[qw]=='['||lo[qw]==']'){
                    --qw;
                    if(qw<0)    qw+=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }   
            if(pt.y>64+(4+(q-1)/175)*16&&pt.y<128+(4+(q-1)/175)*16&&pt.x>48&&pt.x<96){
                bp[qw]=!bp[qw];
                Goto(0,0);
                colset(12);
                if(bp[qw])  printf("Now there is a breakpoint.");
                else    printf("Now there is not a breakpoint.");
                printf("Press or click to continue...");
                if(kbhit()||KEY_DOWN(MOUSE_MOVED))  return;
                break;
            }
            if(pt.y>64+(4+(q-1)/175)*16&&pt.y<128+(4+(q-1)/175)*16&&pt.x>96&&pt.x<136){
                ++qw;
                if(qw>q)    qw-=q;
                while(lo[qw]=='['||lo[qw]==']'){
                    ++qw;
                    if(qw>q)    qw-=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }   
            if(pt.y>128+(4+(q-1)/175)*16&&pt.y<192+(4+(q-1)/175)*16&&pt.x>48&&pt.x<96){
                qw+=175;
                if(qw>q){
                    while(qw>q) qw-=175;
                }
                while(lo[qw]=='['||lo[qw]==']'){
                    ++qw;
                    if(qw>q)    qw-=q;
                }
                Goto((qw-1)/175+3,(qw-1)%175);
                colset(12);
                printf("%c",lo[qw]);
            }   
            if(pt.y>128+(4+(q-1)/175)*16&&pt.y<192+(4+(q-1)/175)*16&&pt.x>0&&pt.x<48)   return;
        }
    }
    colset(15);system("cls");
}
bool r;
char haha;
void mdf(){
    colset(15);system("cls");
    colset(15);
    printf("+----+\n");
    printf("|Done|\n");
    printf("|   D|\n");
    printf("+----+\n");
    printf("Put the code there...\n");
    printf("Input D/d or press to select\n");
    printf("Because of some reason , we will change it to 1 line...\n");
    memset(lo,0,sizeof(lo));
    q=0;
    while(1){
        if(kbhit()){
            haha=getch();
            if(haha=='D'||haha=='d')    return;
            if(haha==13)    haha=10;
            if(haha==8){
                if(q!=0)    --q;
                Goto(7+q/175,q%175);
                printf(" ");
            }
            else if(haha==10||haha==32||haha==9){;}
            else{
                lo[++q]=haha;
                Goto(7+(q-1)/175,(q-1)%175);
                printf("%c",haha);
            }
        }
        if(KEY_DOWN(MOUSE_MOVED)){
            got();
            if(pt.y>0&&pt.y<64&&pt.x>0&&pt.x<48)    return;
        }
    }
}
int mnn,zz,zz2,uu;
bool aaaa;
void im(int be,int en){
    int nn=be;
    int su=(q-1)/175+1;
    while(nn<=en&&aaaa){
        got();
        if(KEY_DOWN(MOUSE_MOVED)){
            if(pt.y>32&&pt.y<48){ 
                colset(15);
                Goto(1,2);
                printf("Pause...");
                while(KEY_DOWN(MOUSE_MOVED)){
                    Sleep(50);
                    got();
                    if(pt.x<0)  pt.x=0;
                    if(pt.x>790)    pt.x=790;
                    Goto(2,uu/5-2);
                    printf("---");
                    Goto(2,99);
                    printf("  ");
                    Goto(2,pt.x/8);
                    printf("■");
                    uu=pt.x/16*10+10;
                    Goto(0,8);
                    printf("%3d",uu);
                }
                Goto(1,2);
                printf("        ");
            }
            if(pt.y>0&&pt.y<64&&pt.x>808&&pt.x<856) return;
        }
        if(kbhit()){
            char haha=getch();
            if(haha==9){
                aaaa=false;
                return;
            }
            if(haha==-32){
                haha=getch();
                colset(15);
                Goto(2,uu/5-2);
                printf("---");
                Goto(2,99);
                printf("  ");
                if(haha==75)    uu=uu-10;
                if(haha==77)    uu=uu+10;
                if(uu<10)   uu=10;
                if(uu>500)  uu=500;
                Goto(2,uu/5-2);
                printf("■");
                Goto(0,8);
                printf("%3d",uu);
                colset(12);
            }
        }
        if(zz!=now){
            colset(11);
            Goto(4*(zz/34)+9+su,5*(zz%34)+1);
            printf("   ");
            zz=now;
            Goto(4*(now/34)+9+su,5*(now%34)+1);
            printf("^^^");
            colset(15);
        }
        Goto((nn-1)/175+6,(nn-1)%175);
        colset(12);
        printf("%c",lo[nn]);
        colset(11);
        if(zz2!=nn){
            Goto((zz2-1)/175+6,(zz2-1)%175);
            colset(11);
            printf("%c",lo[zz2]);
        }
        zz2=nn;
        if(lo[nn]=='<'){
            colset(11);
            Goto(4*(now/34)+9+su,5*(now%34)+1);
            printf("   ");
            --now;
            Goto(4*(now/34)+9+su,5*(now%34)+1);
            printf("^^^");
            zz=now;
            colset(15);
        }
        else if(lo[nn]=='>'){
            colset(11);
            Goto(4*(now/34)+9+su,5*(now%34)+1);
            printf("   ");
            ++now;
            Goto(4*(now/34)+9+su,5*(now%34)+1);
            printf("^^^");
            colset(15);
            if(mnn<now){
                mnn=now;
                colset(15-now%8);
                Goto(4*(now/34)+6+su,5*(now%34));
                printf("+---+");
                Goto(4*(now/34)+7+su,5*(now%34));
                printf("|  0|");
                Goto(4*(now/34)+8+su,5*(now%34));
                printf("+---+");
            }
            zz=now;
        }
        else if(lo[nn]=='+'){
            ++by[now];
            while(by[now]<0)    by[now]+=128;
            while(by[now]>127)  by[now]-=128;
            Goto(4*(now/34)+7+su,5*(now%34)+1);
            colset(15-now%8);
            printf("%3d",by[now]);
        }
        else if(lo[nn]=='-'){
            --by[now];
            while(by[now]<0)    by[now]+=128;
            while(by[now]>127)  by[now]-=128;
            Goto(4*(now/34)+7+su,5*(now%34)+1);
            colset(15-now%8);
            printf("%3d",by[now]);
        }
        else if(lo[nn]=='.'){
            while(by[now]<0)    by[now]+=128;
            while(by[now]>127)  by[now]-=128;
            Goto(5,++s);
            if(by[now]!=10) printf("%c",by[now]);
            else{
                printf("\\n");
                ++s;
            }
        }
        else if(lo[nn]==','){
            Goto(4,0);
            colset(12);
            printf("Waiting for read");
            char haha;
            while(1){
                got();
                if(KEY_DOWN(MOUSE_MOVED)){
                    if(pt.y>32&&pt.y<48){ 
                        colset(15);
                        Goto(1,2);
                        printf("Pause...");
                        while(KEY_DOWN(MOUSE_MOVED)){
                            Sleep(50);
                            got();
                            if(pt.x<0)  pt.x=0;
                            if(pt.x>790)    pt.x=790;
                            Goto(2,uu/5-2);
                            printf("---");
                            Goto(2,99);
                            printf("  ");
                            Goto(2,pt.x/8);
                            printf("■");
                            uu=pt.x/16*10+10;
                            Goto(0,8);
                            printf("%3d",uu);
                        }
                        Goto(1,2);
                        printf("        ");
                        colset(12);
                    }
                    if(pt.y>0&&pt.y<64&&pt.x>808&&pt.x<856) return;
                }
                if(kbhit()){        
                    haha=getch();
                    if(haha==9){
                        aaaa=false;
                        return;
                    }
                    else if(haha==-32){
                        haha=getch();
                        colset(15);
                        Goto(2,uu/5-2);
                        printf("---");
                        Goto(2,99);
                        printf("  ");
                        if(haha==75)    uu=uu-10;
                        if(haha==77)    uu=uu+10;
                        if(uu<10)   uu=10;
                        if(uu>500)  uu=500;
                        Goto(2,uu/5-2);
                        printf("■");
                        Goto(0,8);
                        printf("%3d",uu);
                        colset(12);
                    }
                    else{
                        by[now]=(int)haha;
                        break;
                    }
                }
            }
            if(by[now]==13) by[now]=10;
            Goto(4,0);
            printf("                ");
            Goto(4*(now/34)+7+su,5*(now%34)+1);
            colset(15-now%8);
            printf("%3d",by[now]);
        }
        else if(lo[nn]=='['){
            int nnn=nn+1,no=1;
            while(no!=0){
                if(lo[nnn]=='[')    ++no;
                if(lo[nnn]==']')    --no;
                ++nnn;
            }
            while(by[now]!=0)   im(nn+1,nnn-2);
            nn=nnn-1;
        }
        ++nn;
        Sleep(uu);
    }
}
void imt(){
    memset(by,0,sizeof(by));
    colset(15);system("cls");
    printf("You will use this when you use less memorys , ouput , code and time.\n");
    printf("Are you ");
    colset(12);
    printf("SURE");
    colset(15);
    printf("?\n");
    printf("+---++--+\n");
    printf("|Yes||No|\n");
    printf("|  Y|| N|\n");
    printf("+---++--+\n");
    char qwer;
    do{
        if(kbhit()) qwer=getch();
        got();
    }while((qwer!='Y'&&qwer!='y'&&qwer!='N'&&qwer!='n') && !(KEY_DOWN(MOUSE_MOVED)&&pt.y>32&&pt.y<96&&pt.x>0&&pt.x<72));
    if(KEY_DOWN(MOUSE_MOVED)){
        if(pt.x>40&&pt.x<72)  return;
    }
    if(qwer=='N'||qwer=='n')    return;
    uu=100;
    colset(15);system("cls");
    Goto(0,0);
    printf("Speed : 100 ms                                                                                       +----+\n"); 
    printf("←                                                                                               →  |Exit|\n");
    printf("------------------■-------------------------------------------------------------------------------  | Tab|\n");
    printf("                                                                                                     +----+\n");
    mnn=0;
    s=6;
    now=0;
    zz2=1;
    int sua=(q-1)/175+1;
    Goto(6+sua,0);
    colset(15-now%8);
    printf("+---+\n|  0|\n+---+\n ^^^ ");
    zz=1;
    Goto(5,0);
    printf("Ouput:)");
    Goto(6,0);
    uu=100;
    for(int i=0;i<sua;i++){
        for(int j=0;j<(i==sua-1?(q-1)%175+1:175);j++){
            colset(11);
            printf("%c",lo[i*175+j+1]);
        }
    }
    colset(15);
    aaaa=true;
    im(1,q);
    if(haha==9) return;
    Goto(4,0);
    printf("Press to continue...");
    getch();
    colset(15);system("cls");
}
void hlp(){
    system("cls");
    printf("Brainfuck is a minimal computer language created by Urban Muller in 1993 \n");
    printf("> pointer plus one \n< pointer minus one \n+ pointer to byte plus one \n- pointer to byte minus one \n");
    printf(". Output pointer pointing unit content (ASCII code) \n, input content to pointer pointing unit (ASCII code) \n");
    printf("[ jumps back to the next instruction of the corresponding ] instruction if the cell value the pointer points to is zero \n");
    printf("] jumps forward to the corresponding [ next instruction of instruction if the cell value that the pointer points to is not zero.\n");
    printf("+-----+\n|Close|\n|    C|\n+-----+");
    while(1){
        Sleep(50); got();
        if(kbhit()){
            char haha=getch();
            if(haha=='C'||haha=='c')    return;
        }
        if(KEY_DOWN(MOUSE_MOVED) && pt.y>=144 && pt.y<=208)
            if(pt.x>=4 && pt.x<=56) return;
    }
}
void imf(){
    colset(15);system("cls");
    printf("This is a Brainfuck Compile System\n");
    printf("Creater Imformatiom          |Modifier Imformation\n");
    printf("Name:\n");  
    printf("++++++++[->++++++++<]>+++    |+++++++++[->+++++++++<]>+\n");
    printf("++<]>+++.<.<++++++[->++++    |++++++++.++++++++.<++++[-\n");
    printf("+++[->+++<]>+.<              |>++++<]>+++++.< \n");
    printf("Nickname:\n");
    printf("++++++++++[->++++++++++<]    |++++++++[->++++++++<]>++.\n");
    printf(">++++++++++++++++.<+++[->    |<++++++[->++++++<]>++++++\n");
    printf("---<]>--.--.--.<+++[->+++    |+++.++++++++.<++++[->----\n");
    printf("<]>++++.<++++++++[->-----    |<]>--.+++++++++.<+++++++[\n");
    printf("---<]>.--..+++++.<           |->-------<]>------------.\n");
    printf("                             |+.+.<\n");
    printf("-------------------------------------------------------\n");
    printf("+-----+\n");
    printf("|Close|\n");
    printf("|    C|\n");
    printf("+-----+\n");
    while(1){
        Sleep(50);got();
        if(kbhit()){
            char haha=getch();
            if(haha=='C'||haha=='c')    break;
        }
        if(KEY_DOWN(MOUSE_MOVED) && pt.y>=224 && pt.y<=288)
            if(pt.x>=4 && pt.x<=56) return;
    }
    getch();
    colset(15);system("cls");
}
int main(){
    colset(15);
    system("mode con cols=175 lines=50");
    Hide(); 
    r=false;
    xr=false;
    memset(sc,0,sizeof(sc));
    memset(by,0,sizeof(by));
    memset(lo,0,sizeof(lo));
    memset(bp,0,sizeof(bp));
    while(1){
        system("cls");
//        fstream out("testlib.txt",ios::app);
        colset(15);
        printf("|+-------+  +-----+  +----+|");
        printf("|+----------+  +----+|");
        if(!r)  colset(8);
        printf("|+---+  +----------+  +-----+|\n");
        colset(15);
        printf("||Compile|  |Write|  |Edit||");
        printf("||Imfomation|  |Help||");
        if(!r)  colset(8);
        printf("||Run|  |Breakpoint|  |Debug||\n");
        colset(15);
        printf("||     F9|  |    W|  |   E||");
        printf("||         I|  |   H||");
        if(!r)  colset(8);
        printf("||F10|  |         B|  |   F5||\n");
        colset(15);
        printf("|+-------+  +-----+  +----+|");
        printf("|+----------+  +----+|");
        if(!r)  colset(8);
        printf("|+---+  +----------+  +-----+|\n");
        colset(15);
        printf("+----------Coding----------+");
        printf("+-------About--------+");
        if(!r)  colset(8); 
        printf("+-----------Running----------+\n");
        colset(15);
        while(kbhit())  haha=getch();
        while(1){
            Sleep(50); got();
            if(kbhit()){
                char haha=getch();
                if(haha==0){
                    char haha2=getch();
                    if(haha2==63){
                        if(r){
                            imt();
                            break;
                        }
                        else{
                            Goto(5,0);
                            colset(12);
                            printf("Warning : Compile First");
                            colset(15);
                        }
                    }
                    if(haha2==67){
                        system("cls");
                        lk=1;
                        printf("-----------------------------------\n");
                        r=com();
                        if(r){
                            printf("Compile success!\n");
                            printf("-----------------------------------\n");
                            lk+=2;
                        }
                        printf("+-----+\n");
                        printf("|Close|\n");
                        printf("|    C|\n");
                        printf("+-----+\n");
                        if(lk>45)   lk=45;
                        while(1){
                            Sleep(50);got();
                            if(kbhit()){
                                char haha=getch();
                                if(haha=='C'||haha=='c')    break;
                            }
                            if(KEY_DOWN(MOUSE_MOVED)){
                                if(pt.y>lk*16&&pt.y<lk*16+64&&pt.x>0&&pt.x<112) break;
                            }
                        }
                        break;
                    }
                    if(haha2==68){
                        if(r){
                            run();
                            break;
                        }
                        else{
                            Goto(5,0);
                            colset(12);
                            printf("Warning : Compile First");
                            colset(15);
                        }
                    }
                }
                if(haha=='W'||haha=='w'){
                    mdf();
                    r=false;
                    memset(bp,0,sizeof(bp));
                    break;
                }
                if(haha=='E'||haha=='e')    return 0;
                if(haha=='I'||haha=='i'){
                    imf();
                    break;
                }
                if(haha=='H'||haha=='h'){
                    hlp();
                    break; 
                }
                if(haha=='B'||haha=='b'){
                    if(r){
                        bpt();
                        break;
                    }
                    else{
                        Goto(5,0);
                        colset(12);
                        printf("Warning : Compile First");
                        colset(15);
                    }
                }
            }
            if(KEY_DOWN(MOUSE_MOVED)&&pan(pt.y,pt.x)){
                if(pan(pt.y,pt.x)==1){
                    system("cls");
                    lk=1;
                    printf("-----------------------------------\n");
                    r=com();
                    if(r){
                        printf("Compile succeed!\n");
                        printf("-----------------------------------\n");
                        lk+=2;
                    }
                    printf("+-----+\n");
                    printf("|Close|\n");
                    printf("|    C|\n");
                    printf("+-----+\n");                       
                    if(lk>45)   lk=45;
                    while(1){
                        Sleep(50);got();
                        if(kbhit()){
                            char haha=getch();
                            if(haha=='C'||haha=='c')    break;
                        }
                        if(KEY_DOWN(MOUSE_MOVED)){
                            if(pt.y>lk*16&&pt.y<lk*16+64&&pt.x>0&&pt.x<56) break;
                        }
                    }
                    break;
                }
                if(pan(pt.y,pt.x)==2){
                    mdf();
                    r=false;
                    break;
                }
                if(pan(pt.y,pt.x)==3)   return 0;
                if(pan(pt.y,pt.x)==4){
                    imf();
                    break;
                }
                if(pan(pt.y,pt.x)==5){
                    hlp();
                    break;
                }
                if(pan(pt.y,pt.x)==6){
                    if(!r){
                        Goto(5,0);
                        colset(12);
                        printf("Warning : Compile First");
                        colset(15);
                    }
                    else{
                        run();
                        break;
                    }

                }
                if(pan(pt.y,pt.x)==7){
                    if(!r){
                        Goto(5,0);
                        colset(12);
                        printf("Warning : Compile First");
                        colset(15);
                    }
                    else{
                        bpt();
                        break;
                    }
                }
                if(pan(pt.y,pt.x)==8){
                    if(!r){
                        Goto(5,0);
                        colset(12);
                        printf("Warning : Compile First");
                        colset(15);
                    }
                    else{
                        imt();
                        break;
                    }
                }
            }
        }
    }
}