📄 语法分析.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include <iostream>
int row=1,col=0,num=0,numtest=0,done=1;
char token[20];
struct store
{
int idnum;
int rownum;
int colnum;
char idy[10];
};
struct table
{
int id;
char code[10];
};
struct store tablet[300];
struct table key[31] = {{1,"if"}};
int reserve(char* p)
{ int i=0;
if(strcmp(p,key[i].code)==0)
return(key[i].id);
else
return(-1);
}
void scanner()
{
char ch,p[100];
int i=0,tn=0;
printf("请输入程序片段:\n");
gets(p);
//scanf("%[^#]",p);
while((ch=p[tn])!='#')
{
//col++;
if(isalpha(ch))//为字母时
{
token[0]=ch;
i=1;
tn=tn+1;
ch=p[tn];
//col++;
while(isalpha(ch)||isalnum(ch))
{
token[i]=ch;
i++;
tn=tn+1;
ch=p[tn];
}
//col++;
//tn=tn-1;
//col--;
token[i]='\0';
int c=reserve(token);
if(c!=-1)
{
//output(c,row,col,token);
tablet[num].idnum=1;
tablet[num].rownum=row;
tablet[num].colnum=col;
int j=0;
while(token[j]!='\0')
{
tablet[num].idy[j]=token[j];
j++;
}
tablet[num].idy[j]='\0';
//output1(token);
num++;
}
else
{
//output(10,row,col,token);//变量
//output1(token);
col++;
tablet[num].idnum=10;
tablet[num].rownum=row;
tablet[num].colnum=col;
int j=0;
while(token[j]!='\0')
{
tablet[num].idy[j]=token[j];
j++;
}
tablet[num].idy[j]='\0';
num++;
}
//tn=tn+1;
}
else if(isdigit(ch)) //为数字时
{
token[0]=ch;
tn=tn+1;
ch=p[tn];
//col++;
i=1;
while(isdigit(ch))
{
token[i]=ch;
i++;
tn=tn+1;
ch=p[tn];
}
token[i]='\0';
//fseek(fp,-1,1);
//tn=tn-1;
//output(11,row,col,token);//数字
col++;
tablet[num].idnum=11;
tablet[num].rownum=row;
tablet[num].colnum=col;
int j=0;
while(token[j]!='\0')
{
tablet[num].idy[j]=token[j];
j++;
}
tablet[num].idy[j]='\0';
num++;
//output1(token);
}
else
switch(ch)
{
case'=':tn=tn+1;
ch=p[tn];
//col++;
if(ch=='=')
{
//output(39,row,col,"==");
col++;
tablet[num].idnum=40;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='=';
tablet[num].idy[1]='=';
num++;
tn=tn+1;
}
//output1("==");
else
{
//fseek(fp,-1,1);//回指针
//tn=tn-1;
//output(21,row,col,"=");
col++;
tablet[num].idnum=21;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='=';
num++;
//output1("=");
}
break;
case'+'://output(22,row,col,"+");
//output1("+");
col++;
tablet[num].idnum=22;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='+';
num++;
tn=tn+1;
break;
case'-'://output(23,row,col,"-");
//output1("-");
col++;
tn=tn+1;
tablet[num].idnum=23;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='-';
num++;
break;
case'*'://output(24,row,col,"*");
col++;
tn=tn+1;
tablet[num].idnum=24;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='*';
num++;
//output1("*");
break;
case'/'://output(25,row,col,"/");
col++;
tn=tn+1;
tablet[num].idnum=25;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='/';
num++;
//output1("/");
break;
case'('://output(26,row,col,"(");
//output1("(");
col++;
tn=tn+1;
tablet[num].idnum=26;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='(';
num++;
break;
case')'://output(27,row,col,")");
//output1(")");
col++;
tn=tn+1;
tablet[num].idnum=27;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]=')';
num++;
break;
/*case'['://output(28,row,col,"[");
//output1("[");
col++;
tablet[num].idnum=28;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='[';
num++;
break;
case']':output(29,row,col,"]");
//output1("]");
tablet[num].idnum=29;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]=']';
num++;
break;*/
case'{'://output(30,row,col,"{");
//output1("{");
col++;
tn=tn+1;
tablet[num].idnum=30;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='{';
num++;
break;
case'}'://output(31,row,col,"}");
//output1("}");
col++;
tn=tn+1;
tablet[num].idnum=31;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]='}';
num++;
break;
/*case',':output(32,row,col,",");
tablet[num].idnum=32;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]=',';
num++;
//output1(",");
break;
case':':output(33,row,col,":");
//output1(":");
tablet[num].idnum=39;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]=':';
num++;
break;*/
case';'://output(34,row,col,";");
//output1(";");
col++;
tn=tn+1;
tablet[num].idnum=39;
tablet[num].rownum=row;
tablet[num].colnum=col;
tablet[num].idy[0]=';';
num++;
break;
case '\n':row++;
col=0;
break;
//
}
}
}
int if_PA1()
{
if(tablet[numtest].idnum==10||tablet[numtest].idnum==11)
numtest++;
else
{
printf("Error!缺少id|num 应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
int if_PA()
{
if(tablet[numtest].idnum==10)
{
numtest++;
if(tablet[numtest].idnum==40)
{
numtest++;
if_PA1();
}
else
{
printf("Error!缺少== 应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
else
{
printf("Error!缺少id应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
int if_ps()
{
if(tablet[numtest].idnum==26)//if
{
numtest++;
if_PA();
//numtest++;
if(tablet[numtest].idnum==27)
numtest++;
else
{
printf("Error!缺少)应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
else
{
printf("Error!缺少(应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
/* }
else if(tablet[numtest].idnum==10)//ID
{
numtest++;
pid();
}
else
printf("ERROR!不能以数字开头");
}*/
int id_PA1()
{
if(tablet[numtest].idnum==11||tablet[numtest].idnum==10)
{ numtest++;
//printf("%d\n",numtest);
}
else
{
printf("Error!运算错误!不是num|id 应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
int id_PA()
{
if(tablet[numtest].idnum==21)
{
numtest++;
id_PA1();
if(tablet[numtest].idnum==22||tablet[numtest].idnum==23||tablet[numtest].idnum==24||tablet[numtest].idnum==25)
{
numtest++;
id_PA1();
}
else
{
printf("Error!运算错误!缺少操作符应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
else
{
printf("Error!缺少= 应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
/*if(tablet[numtest].idnum==10)
{
numtest++;
if(tablet[numtest].idnum==21||tablet[numtest].idnum==22||tablet[numtest].idnum==23||tablet[numtest].idnum==24)
{
numtest++;
id_PA1();
}
else
{
printf("Error!运算错误!2缺少操作符");
return;
}
}
else
{
printf("Error!运算错误!3不是数字|id");
return;
} */
}
int id_ps()
{
if(tablet[numtest].idnum==10)
{
numtest++;
id_PA();
//if(tablet[numtest].idnum==10||tablet[numtest].idnum==11)
//numtest++;
//numtest++;
if(tablet[numtest].idnum==39)
numtest++;
else
{
printf("Error!缺少 ;应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
}
int ps()
{
if(tablet[numtest].idnum==1)
{
numtest++;
if_ps();
if(tablet[numtest].idnum==30)
{
numtest++;
id_ps();
numtest++;
}
else
{
printf("Error! 缺少{应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
if(tablet[numtest-1].idnum!=31)
{
printf("Error! 缺少}应添加在第%d单词后\n",tablet[numtest].colnum);
done=0;
return 0;
}
}
else if(tablet[numtest].idnum==10)
{
id_ps();
}
}
int main()
{
scanner();
//printf("词法成功");
numtest=0;
//printf("%d\n",num);
//for(int i=0;i<num;i++)
//{
// printf("%d\n",tablet[i].idnum);
//}
while(numtest<num)
{
ps();
if(done==1)
printf("语法分析成功!");
}
while(1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -