?? bool完美版.c
字號:
struct key /*關鍵字,運算符,界限符*/
{char str[8];
int i;
int j;
};
struct key a[36]={{{'i','n','t','\0'},0,1},
{{'c','h','a','r','\0'},1,1},
{{'f','l','o','a','t','\0'},2,1},
{{'b','r','e','a','k','\0'},3,1},
{{'c','a','s','e','\0'},4,1},
{{'d','o','\0'},5,1},
{{'e','l','s','e','\0'},6,1},
{{'f','o','r','\0'},7,1},
{{'i','f','\0'},8,1},
{{'s','w','i','t','c','h','\0'},9,1},
{{'r','e','t','u','r','n','\0'},10,1},
{{'s','t','r','u','c','t','\0'},11,1},
{{'m','a','i','n','\0'},12,1},
{{'w','h','i','l','e','\0'},13,1},
{{'d','o','u','b','l','e','\0'},14,1},
{{'v','o','i','d','\0'},15,1},
{{'-','\0'},16,2},
{{'*','\0'},17,2},
{{'+','\0'},18,2},
{{'/','\0'},19,2},
{{'&','\0'},20,2},
{{'|','\0'},21,2},
{{'!','\0'},22,2},
{{'<','\0'},23,2},
{{'>','\0'},24,2},
{{'<','=','\0'},25,2},
{{'>','=','\0'},26,2},
{{'=','=','\0'},27,2},
{{'!','=','\0'},28,2},
{{'=','\0'},29,2},
{{',','\0'},30,2},
{{';','\0'},31,3},
{{'(','\0'},32,3},
{{')','\0'},33,3},
{{'{','\0'},34,3},
{{'}','\0'},35,3}
};
struct ID
{char str[10]; /*標識符長度不能超過10*/
int i;
}; /*用來存儲標識符*/
struct data /*無符號數*/
{char str[10];
int i;
};
struct result
{int i; /*1-關鍵字,2-運算符,3-界線符,4-標識符,5-常數*/
int j; /*在相應的數組中的下標*/
};
struct ID b[50];
struct data c[50];
struct result d[100];
int m,n;
char word[10];
int lengthb=0;
int lengthc=0;
int lengthd=0;
int IsIna()
{int i,j;
for(i=0;i<36;i++)
{j=strcmp(a[i].str,word); /*word 是讀取的單詞,在main中定義*/
if(j==0) return i;
}
return -1;
}
int IsInb()
{int i,j;
for(i=0;i<lengthb;i++)
{j=strcmp(b[i].str,word); /*lengthb 是b[i]的長度*/
if(j==0) return i;
}
return -1;
}
int IsInc()
{int i,j;
for(i=0;i<lengthc;i++)
{j=strcmp(c[i].str,word);
if(j==0) return i;
}
return -1;
}
void InsertID()
{strcpy(b[lengthb].str,word);
b[lengthb].i=lengthb;
lengthb++;
}
void InsertData()
{strcpy(c[lengthc].str,word);
c[lengthc].i=lengthc;
lengthc++;
}
void InsertResult()
{d[lengthd].i=m;
d[lengthd].j=n;
lengthd++;
}
void Initword()
{int i;
for(i=0;i<10;i++)
word[i]='\0';
}
struct tempcode
{int opplace;
int class1;int place1;
int class2;int place2;
int class3;int place3;};
struct tempcode tempcode[20];
int ptempcode=0;
struct LR
{int action;
int jump;
};
struct LR lr[14][9]={{{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,1}},
{{1,5},{1,6},{0,0},{0,0},{0,0},{0,0},{0,0},{3,0},{0,0}},
{{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,7}},
{{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,8}},
{{2,6},{2,6},{0,0},{0,0},{2,6},{0,0},{1,9},{2,6},{0,0}},
{{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,10}},
{{0,0},{0,0},{1,2},{1,3},{0,0},{1,4},{0,0},{0,0},{4,11}},
{{2,3},{2,3},{0,0},{0,0},{2,3},{0,0},{0,0},{2,3},{0,0}},
{{1,5},{1,6},{0,0},{0,0},{1,12},{0,0},{0,0},{0,0},{0,0}},
{{0,0},{0,0},{0,0},{0,0},{0,0},{1,13},{0,0},{0,0},{0,0}},
{{2,1},{1,6},{0,0},{0,0},{2,1},{0,0},{0,0},{2,1},{0,0}},
{{2,2},{2,2},{0,0},{0,0},{2,2},{0,0},{0,0},{2,2},{0,0}},
{{2,4},{2,4},{0,0},{0,0},{2,4},{0,0},{0,0},{2,4},{0,0}},
{{2,5},{2,5},{0,0},{0,0},{2,5},{0,0},{0,0},{2,5},{0,0}}};
int stack1[20];
int pstack1;
struct stack2
{int class; /*6-存儲于數組T中,0-空,100-goto,-1 = 0,-2 = 1*/
int place;
};
struct stack2 stack2[20];
int pstack2;
struct expression
{int col;
int class;
int place;};
struct expression expression[50];
int pexpression,lengthe;
int lengthT=1;
int getrightlength(int x)
{if(x==3) return 2;
else if(x==6) return 1;
else return 3;
}
void regress(int x)
{switch(x)
{case 1:
tempcode[ptempcode].opplace=21;
tempcode[ptempcode].class1=stack2[pstack2-3].class;
tempcode[ptempcode].place1=stack2[pstack2-3].place;
tempcode[ptempcode].class2=stack2[pstack2-1].class;
tempcode[ptempcode].place2=stack2[pstack2-1].place;
tempcode[ptempcode].class3=6;
tempcode[ptempcode].place3=lengthT;
ptempcode++;
pstack2=pstack2-2;
stack2[pstack2-1].class=6;
stack2[pstack2-1].place=lengthT;
lengthT++;
break;
case 2:
tempcode[ptempcode].opplace=20;
tempcode[ptempcode].class1=stack2[pstack2-3].class;
tempcode[ptempcode].place1=stack2[pstack2-3].place;
tempcode[ptempcode].class2=stack2[pstack2-1].class;
tempcode[ptempcode].place2=stack2[pstack2-1].place;
tempcode[ptempcode].class3=6;
tempcode[ptempcode].place3=lengthT;
ptempcode++;
pstack2=pstack2-2;
stack2[pstack2-1].class=6;
stack2[pstack2-1].place=lengthT;
lengthT++;
break;
case 3:
tempcode[ptempcode].opplace=22;
tempcode[ptempcode].class1=stack2[pstack2-1].class;
tempcode[ptempcode].place1=stack2[pstack2-1].place;
tempcode[ptempcode].class2=0;
tempcode[ptempcode].place2=0;
tempcode[ptempcode].class3=6;
tempcode[ptempcode].place3=lengthT;
ptempcode++;
pstack2--;
stack2[pstack2-1].class=6;
stack2[pstack2-1].place=lengthT;
lengthT++;
break;
case 4:
stack2[pstack2-3]=stack2[pstack2-2];
pstack2=pstack2-2;
break;
case 5:
tempcode[ptempcode].opplace=stack2[pstack2-2].place;
tempcode[ptempcode].class1=stack2[pstack2-3].class;
tempcode[ptempcode].place1=stack2[pstack2-3].place;
tempcode[ptempcode].class2=stack2[pstack2-1].class;
tempcode[ptempcode].place2=stack2[pstack2-1].place;
tempcode[ptempcode].class3=100;
tempcode[ptempcode].place3=ptempcode+3;
ptempcode++;
tempcode[ptempcode].opplace=29;
tempcode[ptempcode].class1=-1;
tempcode[ptempcode].place1=0;
tempcode[ptempcode].class2=0;
tempcode[ptempcode].place2=0;
tempcode[ptempcode].class3=6;
tempcode[ptempcode].place3=lengthT;
ptempcode++;
tempcode[ptempcode].opplace=100; /*100-goto*/
tempcode[ptempcode].class1=0;
tempcode[ptempcode].place1=0;
tempcode[ptempcode].class2=0;
tempcode[ptempcode].place2=0;
tempcode[ptempcode].class3=100;
tempcode[ptempcode].place3=ptempcode+2;
ptempcode++;
tempcode[ptempcode].opplace=29;
tempcode[ptempcode].class1=-2;
tempcode[ptempcode].place1=0;
tempcode[ptempcode].class2=0;
tempcode[ptempcode].place2=0;
tempcode[ptempcode].class3=6;
tempcode[ptempcode].place3=lengthT;
ptempcode++;
pstack2=pstack2-2;
stack2[pstack2-1].class=6;
stack2[pstack2-1].place=lengthT;
lengthT++;
break;
}
}
#include <stdio.h>
#include <ctype.h>
main()
{int wordlength=0;
int i,ch;
char cc;
char text[1000];
int textlength=1;
int action,jump,rightlength;
printf("please enter your codes here:\n");
cc=getchar();
text[0]=cc;
while(textlength!=0 && (cc=getchar())!='#')
{ch=cc;
if(text[textlength-1]==' ' && cc==' ')
continue;
else if(text[textlength-1]==' ' && ch==10)
continue;
else if(text[textlength-1]!=' ' && ch==10)
{text[textlength]=' ';textlength++;}
else {text[textlength]=cc;textlength++;}
}
if(text[textlength-1]==' ') textlength--;
printf("\n");
for(i=0;i<textlength;i++)
printf("%c",text[i]);
printf("\n");
for(i=0;i<textlength;)
{Initword();
wordlength=0;
word[0]=text[i];
wordlength++;
if(isdigit(word[0])) /*識別常數*/
{while(isdigit(text[i+1]))
{word[wordlength]=text[i+1];wordlength++;i++;}
{if(IsInc()!=-1) {m=5;n=IsInc();}
else
{InsertData();
m=5;n=lengthc-1;}}
InsertResult();
if(text[i+1]==' ')
{i=i+2;continue;}
else {i++;continue;}
}
else if(isalpha(word[0])) /*識別關鍵字和標識符*/
{while(isalnum(text[i+1]))
{word[wordlength]=text[i+1];
wordlength++;i++;
}
{if(IsIna()!=-1) {m=1;n=IsIna();InsertResult();}
else if(IsInb()!=-1) {m=4;n=IsInb();InsertResult();}
else {InsertID();m=4;n=lengthb-1;InsertResult();}
}
{if(text[i+1]==' ') {i=i+2;}
else {i++;}}
continue;
}
else if(IsIna()>=31 && IsIna()<=35) /*識別界線符*/
{m=3;n=IsIna();
InsertResult();
if(text[i+1]==' ') {i=i+2;continue;}
else {i++;continue;}
}
else if(IsIna()<31 && IsIna()>15)
{if(text[i+1]==' ') /*識別運算符*/
{m=2;n=IsIna(); InsertResult();i=i+2;continue;}
else if(text[i+1]=='=')
{word[1]=text[i+1];
m=2;n=IsIna();InsertResult();
if(text[i+2]==' ') {i=i+3;continue;}
else {i=i+2;continue;}
}
else {m=2;n=IsIna();InsertResult();i++;continue;}
}
else printf("sth wrong in your codes!!!\n");
}
for(i=0;i<lengthd;i++)
{printf("< ");
if(d[i].i==1) printf("guan jian zi,%d >\n",d[i].j);
if(d[i].i==2) printf("yun suan fu,%d >\n",d[i].j);
if(d[i].i==3) printf("jie xian fu,%d >\n",d[i].j);
if(d[i].i==4) printf("biao shi fu,%d >\n",d[i].j);
if(d[i].i==5) printf("chang shu,%d >\n",d[i].j);
}
for(i=0;i<lengthd;i++)
{if(d[i].i==4)
{expression[i].col=5;expression[i].class=4;expression[i].place=d[i].j;}
else if(d[i].i==5)
{expression[i].col=5;expression[i].class=5;expression[i].place=d[i].j;}
else if(d[i].i==2)
{if(d[i].j>=23 && d[i].j<=28)
{expression[i].col=6;expression[i].class=2;expression[i].place=d[i].j;}
else if(d[i].j==20)
{expression[i].col=1;expression[i].class=2;expression[i].place=d[i].j;}
else if(d[i].j==21)
{expression[i].col=0;expression[i].class=2;expression[i].place=d[i].j;}
else if(d[i].j==22)
{expression[i].col=2;expression[i].class=2;expression[i].place=d[i].j;}
else {printf("BOOL表達式中含非法運算符\n");return;}
}
else if(d[i].i==3)
{if(d[i].j==32) {expression[i].col=3;expression[i].class=3;expression[i].place=d[i].j;}
else if(d[i].j==33) {expression[i].col=4;expression[i].class=3;expression[i].place=d[i].j;}
}
else {printf("BOOL表達式中含非法符號\n");return;}
}
lengthe=lengthd+1;
expression[lengthe-1].col=7; /* # */
expression[lengthe-1].class=0;
expression[lengthe-1].place=0;
stack1[0]=0;
pstack1=0;
pstack2=0;
pexpression=0;
lengthT=1;
action=lr[stack1[pstack1]][expression[pexpression].col].action;
jump=lr[stack1[pstack1]][expression[pexpression].col].jump;
while(action!=3)
{if(action==0) {printf("error!\n");return;}
if(action==1)
{stack1[pstack1+1]=jump;
pstack1++;
stack2[pstack2].class=expression[pexpression].class;
stack2[pstack2].place=expression[pexpression].place;
pstack2++;
pexpression++;
}
if(action==2)
{rightlength=getrightlength(jump);
pstack1=pstack1-rightlength+1;
stack1[pstack1]=lr[stack1[pstack1-1]][8].jump;
regress(jump);
}
action=lr[stack1[pstack1]][expression[pexpression].col].action;
jump=lr[stack1[pstack1]][expression[pexpression].col].jump;
}
printf("\n");
for(i=0;i<ptempcode;i++)
{printf(" %d : ",i);
if(tempcode[i].opplace==100)
{printf("[ goto , __ , __ , %d ]\n\n",tempcode[i].place3);
}
else
{printf("[ %s ,",a[tempcode[i].opplace].str);
{if(tempcode[i].class1==-1) printf(" 0 ,");
else if(tempcode[i].class1==-2) printf(" 1 ,");
else if(tempcode[i].class1==0) printf(" __ ,");
else if(tempcode[i].class1==6) printf(" T%d ,",tempcode[i].place1);
else if(tempcode[i].class1==4) printf(" %s ,",b[tempcode[i].place1].str);
else printf(" %s ,",c[tempcode[i].place1].str);}
{if(tempcode[i].class2==0) printf(" __ ,");
else if(tempcode[i].class2==6) printf(" T%d ,",tempcode[i].place2);
else if(tempcode[i].class2==4) printf(" %s ,",b[tempcode[i].place2].str);
else {printf(" %s ,",c[tempcode[i].place2].str);}}
{if(tempcode[i].class3==100) printf(" %d ]\n\n",tempcode[i].place3);
else {printf(" T%d ]\n\n",tempcode[i].place3);} }
}
}
}
輸入
aa>=10 | b<c & (!a) #
回車
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -