📄 语法分析.cpp
字号:
#include<iostream>
#include<malloc.h>
using namespace std;
void start();
void dy();
void dan();
void yu();
void can();
void tiao();
void biao();
void jia();
struct shu
{
int hang;
int zhi;
struct shu *next;
};
struct shu *head=NULL,*p=NULL,*q=NULL;
FILE *in=NULL,*out=NULL;
int count=1;
int sti(char s[])
{
int l=0;
unsigned i=0;
for(;i<strlen(s);i++)
{
l=10*l+(int)(s[i]-48);
}
return l;
}
int main()
{
int h,z,m=0,i=0;char c,b[5];
if(in=fopen("result.txt","r"))
{
for(int j=0;j<5;j++)
b[j]='\0';
while(fscanf(in,"%c",&c)!=EOF)
{
if(i==0)
{
if(c>='0'&&c<='9')
{
b[m++]=c;
}
else if(m>0)
{
h=sti(b);
i++;
m=0;
for(int j=0;j<5;j++)
b[j]='\0';
}
}
else if(i==1)
{
if(c>='0'&&c<='9')
{
b[m++]=c;
}
else if(m>0)
{
z=sti(b);
i++;
m=0;
for(int j=0;j<5;j++)
b[j]='\0';
}
}
else if(c=='\n'||c==10||c==13)
{
p=(struct shu *)malloc(sizeof(struct shu));
p->next=NULL;
p->hang=h;
p->zhi=z;
if(head==NULL)
{
head=p;q=p;
}
else
{
q->next=p;q=p;
}
i=0;
}
}
fclose(in);
if(out=fopen("语法分析.txt","w"))
{
p=head;
start();
if(count==1)
{
fprintf(out,"编译完毕 ! 没有发现错误语法 !\n");
}
else
{
fprintf(out,"编译完毕 ! 发现错误 %d 个 !\n",count-1);
}
q=head;
while(q!=NULL)
{
printf("%d %d\n",q->hang,q->zhi);
q=q->next;
}
fclose(out);
}
}
return 0;
}
void tiao()
{
if(p!=NULL&&p->zhi==77)
{
p=p->next;
if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&(p->zhi==58||p->zhi==59||p->zhi==60||p->zhi==61||p->zhi==62||p->zhi==63))
{
p=p->next;
if(p!=NULL&&p->zhi==76)
{
p=p->next;
if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==37)
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少表达式值。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==76)
{
p=p->next;
if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&(p->zhi==58||p->zhi==59||p->zhi==60||p->zhi==61||p->zhi==62||p->zhi==63))
{
p=p->next;
if(p!=NULL&&(p->zhi==76||p->zhi==77))
{
p=p->next;
if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==37)
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少表达式值。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==37)
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少合法表达式。\n",count++,p->hang);
}
}
void yu()
{
if(p!=NULL&&(p->zhi==20||p->zhi==36))//if||while
{
p=p->next;
if(p!=NULL&&p->zhi==37)
{
p=p->next;
tiao();
if(p!=NULL&&p->zhi==38)
{
p=p->next;
if(p->zhi==41)
{
p=p->next;
yu();
if(p->zhi==42)
{
//正确
p=p->next;
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 } 符号。\n",count++,p->hang);
}
}
else//不能判断单语句,语句部分要用{}括起来;
{
fprintf(out,"Error %d : 第 %d 行缺少 { 符号。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ( 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==18)//for
{
fprintf(out,"Error %d : 第 %d 行不识别for语句。\n",count++,p->hang);
p=p->next;
}
else if(p!=NULL&&(p->zhi==76||p->zhi==6||p->zhi==10||p->zhi==24))//表达式
{
biao();
if(p!=NULL&&p->zhi==44)
{
//正确
p=p->next;
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符号。\n",count++,p->hang);
}
p=p->next;
}
else
{
}
if(p!=NULL&&p->zhi==42)
{
//正确
}
else if(p!=NULL&&(p->zhi==20||p->zhi==36||p->zhi==18||p->zhi==76||p->zhi==6||p->zhi==10||p->zhi==24))
{
yu();
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 } 符号。\n",count++,p->hang);
}
}
void jia()
{
if(p!=NULL&&(p->zhi==76||p->zhi==77))
{
p=p->next;
if(p!=NULL&&(p->zhi==53||p->zhi==54||p->zhi==55||p->zhi==56||p->zhi==57))//加减乘除
{
p=p->next;
jia();
if(p!=NULL&&p->zhi==44)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==44)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==37)
{
p=p->next;
jia();
if(p!=NULL&&p->zhi==38)
{
p=p->next;
if(p!=NULL&&(p->zhi==53||p->zhi==54||p->zhi==55||p->zhi==56||p->zhi==57))//加减乘除
{
p=p->next;
jia();
if(p!=NULL&&p->zhi==44)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==44)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行没有赋值 。\n",count++,p->hang);
}
}
void biao()
{
if(p!=NULL)
{
if(p->zhi==76)
{
p=p->next;
if(p!=NULL&&(p->zhi==71||p->zhi==72||p->zhi==73||p->zhi==74||p->zhi==75))//赋值
{
p=p->next;
jia();
if(p->zhi==44)
{
//正确
p=p->next;
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
}
}
else if(p!=NULL&&(p->zhi==46||p->zhi==48))//成员
{
p=p->next;
if(p!=NULL&&p->zhi==76)
{
p=p->next;
if(p!=NULL&&(p->zhi==71||p->zhi==72||p->zhi==73||p->zhi==74||p->zhi==75))//赋值
{
p=p->next;
jia();
if(p->zhi==44)
{
//正确
p=p->next;
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少赋值。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行不是合法标识符。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行不是合法标识符。\n",count++,p->hang);
}
}
else if(p->zhi==6||p->zhi==10||p->zhi==24)//break||continue||return
{
p=p->next;
if(p!=NULL&&p->zhi==44)
{
//正确
p=p->next;
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
}
}
else
{
fprintf(out,"Error %d : 第 %d 行不是合法赋值式。\n",count++,p->hang);
}
}
}
void can()
{
if(p!=NULL&&(p->zhi==8||p->zhi==13||p->zhi==17||p->zhi==21||p->zhi==22||p->zhi==25))
{
p=p->next;
if(p!=NULL&&p->zhi==76)
{
p=p->next;
if(p!=NULL&&p->zhi==43)
{
p=p->next;
can();
if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
}
else if(p!=NULL&&p->zhi==38)
{
//正确
}
else
{
fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -