📄 cpp2.cpp
字号:
#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存放关键字
int e=0;//e记录已扫描原代码的个数
char C[20][10];//C存放标识符
int r=1;//r记录已存标识符的个数
float D[20];//存放常数
int u=1;//记录已存放常数的个数
char E[23][10]={{" "},{"-"},{"+"},{"*"},{"/"},{"%"},{"="},{"!"},{"<"},{">"},{"&"},{"|"},{","},{"("},
{")"},{"["},{"]"},{"=="},{">="},{"<="},{"!="},{"&&"},{"||"}};//存放运算符
char F[4]={' ',';','{','}'};//存放界符
typedef struct
{char name[10];
int address;
}node;
node two[50];//存放原代码的二元组
int v=0;//v记录已存二元组的个数
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 关键字\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 标识符\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 数字\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 运算符\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()为获得一下个字符
if(c==' ')//)||(c==13)||(c==10))
{state=0;
break;
}
else
if(c=='#')//#为原程序结束标志
{j=1;
break;
}
else
{state=fail();//fail()为切换状态表
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()为判断是否为数字
{state=2;
L[i]=c;
i=i+1;
break;
}
else
if(c=='#')
{L[i]='\0';
if(k=GorB(L))//GorB()判断是否为关键字
important(k,L);//important()输出关键字并将起存放
else
mark(L);//mark()输出标识符并将起存放(两个表)
j=1;
break;
}
else
if(c==' ')
{state=4;
L[i]='\0';
if(k=GorB(L))//GorB()判断是否为关键字
{//L[i]='\0';
important(k,L);//important()输出关键字并将起存放
i=0;}
else
{//L[i]='\0';
mark(L);//mark()输出标识符并将起存放
i=0;
}
break;
}
else
{L[i]=c;
i=i+1;
state=3;
break;
}
case 3:
c=nextchar();
if(c=='#')
{L[i]='\0';
printf("%s 错误\n",L);
j=1;
break;
}
else
if(c==' ')
{state=4;
L[i]='\0';
printf("%s 错误\n",L);
i=0;
break;
}
else
{state=3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -