?? cpp2.cpp
字號(hào):
#include<stdio.h>
#include<string.h>
int start=0,state=0;
char A[200];//A存放原代碼
char B[16][10]={{" "},{"void"},{"main"},{"int"},{"float"},{"char"},{"if"},{"else"},{"switch"},{"case"},
{"while"},{"for"},{"do"},{"continue"},{"break"},{"return"}};//B存放關(guān)鍵字
int e=0;//e記錄已掃描原代碼的個(gè)數(shù)
char C[20][10];//C存放標(biāo)識(shí)符
int r=1;//r記錄已存標(biāo)識(shí)符的個(gè)數(shù)
float D[20];//存放常數(shù)
int u=1;//記錄已存放常數(shù)的個(gè)數(shù)
char E[23][10]={{" "},{"-"},{"+"},{"*"},{"/"},{"%"},{"="},{"!"},{"<"},{">"},{"&"},{"|"},{","},{"("},
{")"},{"["},{"]"},{"=="},{">="},{"<="},{"!="},{"&&"},{"||"}};//存放運(yùn)算符
char F[4]={' ',';','{','}'};//存放界符
typedef struct
{char name[10];
int address;
}node;
node two[50];//存放原代碼的二元組
int v=0;//v記錄已存二元組的個(gè)數(shù)
int fail()
{
switch(state)
{case 0: start=1;break;
case 4: start=0;break;
case 1: start=5;break;
case 14: start=0;break;
case 5: start=15;break;
case 19: start=0;break;
case 15: start=20;break;
case 23: start=0;break;
}
return start;
}
char nextchar()
{char c;
c=A[e];
e=e+1;
return c;
}
int isletter(char s)
{if(((s>='a')&&(s<='z'))||((s>='A')&&(s<='Z')))
return 1;
else
return 0;
}
int isdigit(char s)
{if((s>='0')&&(s<='9'))
return 1;
else
return 0;
}
int GorB(char s[10])
{int i;
for(i=0;i<16;i++)
{
if(strcmp(B[i],s)==0)
break;
}
if(i==16)
return 0;
else
return i;
}
void important(int t,char s[10])
{printf("%s 關(guān)鍵字\n",s);
int i;
for(i=0;i<10;i++)
two[v].name[i]=s[i];
two[v].address=t;
v=v+1;
}
void mark(char s[10])
{printf("%s 標(biāo)識(shí)符\n",s);
int j;
for(j=1;j<r;j++)
if(strcmp(C[j],s)==0)
{int t;
for(t=0;t<10;t++)
two[v].name[t]=s[t];
two[v].address=j;
v=v+1;
break;
}
if(j==r)
{int i;
for(i=0;i<10;i++)
{C[r][i]=s[i];
two[v].name[i]=s[i];
}
two[v].address=r;
v=v+1;
r=r+1;
}
}
void cunbiao(char h[10],float k)
{int j;
for(j=1;j<u;j++)
if(D[j]==k)
{int t;
for(t=0;t<10;t++)
two[v].name[t]=h[t];
two[v].address=j;
v=v+1;
break;
}
if(j==u)
{int i;
for(i=0;i<10;i++)
{D[u]=k;
two[v].name[i]=h[i];
}
two[v].address=u;
v=v+1;
u=u+1;
}
}
void digit(char s[10])
{int i,j;
char L[10];
float zhengshu=0.0;
float result=0.0;
float xiaoshu=0;
int jishu=0;
if(s[0]=='-')
{i=1;
while(s[i]!='\0')
{
if(isdigit(s[i]))
{L[i]=s[i];
i=i+1;
}
else
break;
}
int k;
for(k=1;k<i;k++)
zhengshu=zhengshu*10+(L[k]-'0');
result=zhengshu;
if(s[i]=='.')
{i=i+1;
k=i;
while(s[i]!='\0')
{
if(isdigit(s[i]))
{L[i]=s[i];
i=i+1;
}
else
break;
}
int t;
for(t=i-1;t>=k;t--)
xiaoshu=xiaoshu/10+(float)(L[t]-'0')/10;
result=zhengshu+xiaoshu;
}
if(s[i]=='e')
{i=i+1;
if(s[i]=='-')
{int a;
i=i+1;
a=i;
while(s[i]!='\0')
{L[i]=s[i];
i=i+1;
}
while(a<i)
{jishu=jishu*10+(L[a]-'0');
a=a+1;
}
int b;
for(b=0;b<jishu;b++)
result=result/10;
}
else
{int c=i;
while(s[i]!='\0')
{L[i]=s[i];
i=i+1;
}
while(c<i)
{jishu=jishu*10+(L[c]-'0');
c=c+1;
}
int d;
for(d=0;d<jishu;d++)
result=result*10;
}
}
result=0-result;
}
else
{j=0;
while(s[j]!='\0')
{
if(isdigit(s[j]))
{L[j]=s[j];
j=j+1;
}
else
break;
}
int x;
for(x=0;x<j;x++)
zhengshu=zhengshu*10+(L[x]-'0');
result=zhengshu;
if(s[j]=='.')
{j=j+1;
x=j;
while(s[j]!='\0')
{
if(isdigit(s[j]))
{L[j]=s[j];
j=j+1;
}
else
break;
}
int y;
for(y=j-1;y>=x;y--)
xiaoshu=xiaoshu/10+(float)(L[y]-'0')/10;
result=zhengshu+xiaoshu;
}
if(s[j]=='e')
{j=j+1;
if(s[j]=='-')
{int z;
j=j+1;
z=j;
while(s[j]!='\0')
{L[j]=s[j];
j=j+1;
}
while(z<j)
{jishu=jishu*10+(L[z]-'0');
z=z+1;
}
int n;
for(n=0;n<jishu;n++)
result=result/10;
}
else
{int m=j;
while(s[j]!='\0')
{L[j]=s[j];
j=j+1;
}
while(m<j)
{jishu=jishu*10+(L[m]-'0');
m=m+1;
}
int h;
for(h=0;h<jishu;h++)
result=result*10;
}
}
}
printf("%f 數(shù)字\n",result);
cunbiao(s,result);
}
int isyunsuanfu1(char s)
{char L[10];
L[0]=s;
L[1]='\0';
int j=1;
while(j<23)
{if(strcmp(E[j],L)==0)
break;
else
j=j+1;
}
if(j==23)
return 0;
else
return j;
}
int isyunsuanfu2(char s[10])
{int j=1;
while(j<23)
{if(strcmp(E[j],s)==0)
break;
else
j=j+1;
}
if(j==23)
return 0;
else
return j;
}
void yunsuanfu(char s[10],int t)
{printf("%s 運(yùn)算符\n",s);
int i;
for(i=0;i<10;i++)
two[v].name[i]=s[i];
two[v].address=t;
v=v+1;
}
int isjiefu(char s)
{int i=1;
while(i<4)
{if(F[i]==s)
break;
else
i=i+1;
}
if(i==4)
return 0;
else
return i;
}
void jiefu(char s[10],int t)
{printf("%s 界符\n",s);
int i;
for(i=0;i<10;i++)
two[v].name[i]=s[i];
two[v].address=t;
v=v+1;
}
void nexttaken()
{
char L[10];//L存放以掃描的字符
int i=0;
//L[i]='\0';
int j=0;
int k;
int p,q;
int h;
char c;
while(1){
switch(state){
case 0:
c=nextchar();//nextchar()為獲得一下個(gè)字符
if(c==' ')//)||(c==13)||(c==10))
{state=0;
break;
}
else
if(c=='#')//#為原程序結(jié)束標(biāo)志
{j=1;
break;
}
else
{state=fail();//fail()為切換狀態(tài)表
e=e-1;
break;
}
case 1:
c=nextchar();
if(isletter(c))//isletter()為判斷是否為字母
{state=2;
L[i]=c;
i=i+1;
break;
}
else
if(c=='#')
{L[i]='\0';
j=1;
break;
}
else
{state=fail();
e=e-1;
break;
}
case 2:
c=nextchar();
if(isletter(c)||isdigit(c))//isdigit()為判斷是否為數(shù)字
{state=2;
L[i]=c;
i=i+1;
break;
}
else
if(c=='#')
{L[i]='\0';
if(k=GorB(L))//GorB()判斷是否為關(guān)鍵字
important(k,L);//important()輸出關(guān)鍵字并將起存放
else
mark(L);//mark()輸出標(biāo)識(shí)符并將起存放(兩個(gè)表)
j=1;
break;
}
else
if(c==' ')
{state=4;
L[i]='\0';
if(k=GorB(L))//GorB()判斷是否為關(guān)鍵字
{//L[i]='\0';
important(k,L);//important()輸出關(guān)鍵字并將起存放
i=0;}
else
{//L[i]='\0';
mark(L);//mark()輸出標(biāo)識(shí)符并將起存放
i=0;
}
break;
}
else
{L[i]=c;
i=i+1;
state=3;
break;
}
case 3:
c=nextchar();
if(c=='#')
{L[i]='\0';
printf("%s 錯(cuò)誤\n",L);
j=1;
break;
}
else
if(c==' ')
{state=4;
L[i]='\0';
printf("%s 錯(cuò)誤\n",L);
i=0;
break;
}
else
{state=3;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -