📄 词法.cpp
字号:
#include"stdio.h"
#include"iostream.h"
#include"string.h"
#include"malloc.h"
#define NULL 0
typedef struct node
{
char data[20];
int n;
double h;
long g;
struct node *next;
}linklist;
typedef struct node1
{
int n;
char a;
struct node1 *next;
}linklist1;
linklist *build()
{
linklist *head;
head=(linklist *)malloc(sizeof(linklist));
head->next=NULL;
return head;
}
linklist1 *build1()
{
linklist1 *head;
head=(linklist1 *)malloc(sizeof(linklist1));
head->next=NULL;
return head;
}
void Add(linklist *head,char a[20],int n,double h,long g)
{
linklist *s,*r;
r=head;
while(r->next!=NULL)
r=r->next;
s=(linklist *)malloc(sizeof(linklist));
strcpy(s->data,a);
s->n=n;
s->h=h;
s->g=g;
r->next=s;
r=s;
r->next=NULL;
}
void Add1(linklist1 *head,int n,char a)
{
linklist1 *s,*r;
r=head;
while(r->next!=NULL)
r=r->next;
s=(linklist1 *)malloc(sizeof(linklist1));
s->a=a;;
s->n=n;
r->next=s;
r=s;
r->next=NULL;
}
void shucuo(linklist1 *head)
{
linklist1 *r;
r=head->next;
while(r!=NULL)
{
if(r->a=='z')
printf("第%d行出现错误,不是正确整形数!\n",r->n);
else if(r->a=='s')
printf("第%d行出现错误,不是正确浮点形数!\n",r->n);
else if(r->a=='f')
printf("第%d行出现错误,不是正确字符形!\n",r->n);
r=r->next;
}
}
void shuchu(linklist *head)
{
linklist *r;
r=head->next;
while(r!=NULL)
{
if(r->data[0]!='\0')
printf("%s\t\t %d\n",r->data,r->n);
else if(r->h!=NULL)
printf("%lf\t %d\n",r->h-1,r->n);
else if(r->g!=NULL)
printf("%ld\t\t %d\n",r->g-1,r->n);
r=r->next;
}
}
void shuchu1(linklist *zi,linklist *fu,char b[15][10])
{
int r;
printf("\n");
printf("关键字表:\n");
printf("关键字\t\t位置\n");
for(r=0;r<15;r++)
printf("%s\t\t%d\n",b[r],r);
printf("符号表:\n");
printf("\n");
printf("符号\t\t位置\n");
shuchu(fu);
printf("\n");
printf("字符序列表:\n");
printf("\n");
printf("字符\t\t位置\n");
shuchu(zi);
printf("\n");
printf("按任意键字母键继续,按n结束!\n");
}
void Empty(linklist *head)
{
linklist *r,*p;
p=head;
while(p->next!=NULL)
{
r=p->next;
p->next=r->next;
free(r);
}
}
void Empty1(linklist1 *head)
{
linklist1 *r,*p;
p=head;
while(p->next!=NULL)
{
r=p->next;
p->next=r->next;
free(r);
}
}
void main()
{
linklist *zi,*fu;
linklist1 *cuo;
int i_z,j,n,m,i_f,i_b,i,r,hcount,fcount;
long x;
char t,k,key;
double y,s;
char a[20];
char f[23]={'#','\'','\"',';',',','//','?','=','-',')','(','/','||','&&','{','}','-','+','*','\n','\t',' '};
char b[15][10]={"int","float","char","return","printf","do","while","if","else","break","static","auto","double","long","short"};
do
{
hcount=1;
fcount=0;
fu=build();
zi=build();
cuo=build1();
printf("请输入程序\n");
t=getchar();
do
{
i_z=1;
i_f=1;
i_b=1;
if((t==' ')||(t=='\t'))
;
else if(t=='\n')
hcount++;
else if((t<='9')&&(t>='0'))
{
x=0;
y=0.0;
k='m';
while((t!='.')&&(k!='n'))
{
if(t<='9'&&t>='0')
x=x*10+t-'0';
else
i_z=0;
t=getchar();
i=1;
for(r=0;r<23;r++)
if(f[r]==t)
r=23;
{
k='n';
}
}
if(t=='.')
{
n=1;
k='m';
while(k!='n')
{
if(t<='9'&&t>='0')
{
s=(double)t-'0';
for(m=0;m<n;m++)
s=s/10.0;
y=y+s;
n++;
}
else if(t!='.')
i_f=0;
t=getchar();
i=0;
for(r=0;r<23;r++)
if(f[r]==t)
{
r=23;
k='n';
}
}
y=x+y;
}
if((i_z==1)&&(i==1))
{
a[0]='\0';
Add(zi,a,-1,NULL,x+1);
}
else if((i_f==1)&&(i==0))
{
a[0]='\0';
Add(zi,a,-1,y+1,NULL);
}
else if((i_z==0)&&(i==1))
Add1(cuo,hcount,'z');
else if((i_f==0)&&(i==0))
Add1(cuo,hcount,'s');
}
else if(t>='a'&&t<='z') //标识符
{
j=0;
k='m';
while(k!='n'&&t!='.')
{
if(((t>='a')&&(t<='z'))||((t>='0')&&(t<='9')))
{
a[j]=t;
j++;
}
else
i_b=0;
t=getchar();
for(r=0;r<23;r++)
if(f[r]==t)
{
r=23;
k='n';
}
}
if(i_b==1)
{
a[j]='\0';
for(r=0;r<15;r++)
if(strcmp(a,b[r])==0)
{
Add(zi,a,r,NULL,NULL);
r=15;
}
if(r==15)
{
Add(fu,a,fcount,NULL,NULL);
Add(zi,a,fcount,NULL,NULL);
fcount++;
}
}
else if(i_b==0)
Add1(cuo,hcount,'f');
}
if((t!=' ')&&(t!='\n'))
{
a[0]=t;
a[1]='\0';
Add(zi,a,-1,NULL,NULL);
}
t=getchar();
}while(t!='#');
getchar();
printf("\n");
if(i_z==1&&i_f==1&&i_b==1)
printf("程序无错!\n");
shucuo(cuo);
shuchu1(zi,fu,b);
Empty(fu);
Empty(zi);
Empty1(cuo);
printf("是否结束程序,'n'结束!\n");
scanf("%c",&key);
getchar();
}while(key!='n');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -