📄 parser.cpp
字号:
//**********************************
//语法语义分析程序
//**********************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stack
{
char name[20];
int cod ;
int addr;
} stack ;
typedef struct equ
{
int op ;
int op1;
int op2;
int result;
} equ;
typedef struct var
{
char name[20];
int addr;
int type;
int value;
} var;
#define EXP_LEN 100
#define EQU_LEN 1024
#define ONE 11111
#define ZERO 10000
#define E_EXPR 7
#define IF 8
#define WHILE 9
#define FOR 10
#define REPEAT 11
#define B_EXP 12
FILE *TokenFin ;
FILE *SymbleFin;
FILE *EquFout ;
int code ;
int address;
int LineOfPro;
int LineOfEqu;
stack var_list[EXP_LEN];
stack expr[EXP_LEN];
equ Equ[EQU_LEN];
var TempList[EXP_LEN];
char ID[20];
int var_count ;
int len_count ;
int pos ;
int now_addr;
int temp_count;
int error_count;
int let_count ;
int E_Contrl;
int E_rtn;
int True_address;
int False_address;
int gen_pos;
int EquPush(int op,int a,int b ,int r);
void GetNext();
void Error(int num);
int Num(char cc);
int gen(int op,int a,int b ,int r);
void Declear();
void InitStack();
void Push(int code,int addr);
int NewTemp();
void BackPatch(int addr,int addr2);
//布尔**************************
int B_Analize();
void B_Init();
int B_OR();
int B1_OR(int a);
int L_AND();
int L1_AND(int a);
int M_NOT();
int K_END();
int K_CMP();
//算术**********************************
int E_Analize();
void E_Init();
int E_AddSub();
int E1_AddSub(int a);
int T_MulDiv();
int T1_MulDiv(int a);
int F_Number();
//语句分析**************************
void parser();
int S_Let(int a);
int S_If();
int S_While();
int S_Begin();
int L_Analize();
//*********************
void parser()
{
int gen_pos=0;
int Line ;
int i;
char ch1;
pos=0;
let_count=0;
error_count=0;
LineOfPro=0;
address=0;
LineOfEqu=0;
temp_count=0;
now_addr=0;
len_count=0;
InitStack();
for(i=0;i<EXP_LEN-2;i++)
{
TempList[i].addr=0;
TempList[i].addr-=i;
TempList[i].name[0]='b';
TempList[i].name[1]='x';
}
//建立四元式;
EquFout=fopen("equ.txt","wt+");
if((TokenFin=fopen("token.txt","rt"))==NULL)
{
printf("Cannot open the file token.txt strike any key exit!");
exit(1);
}
printf("********************************************************\n");
printf("* 语法分析程序 *\n");
printf("* *\n");
printf("* 作者: 李国元,夏开宏,毛夏飞 *\n");
printf("********************************************************\n");
GetNext();
if(code==22)
{
GetNext();
if(code==34)
{
GetNext();
if(code==52)
{
GetNext();LineOfPro++;
}
if(code ==31)
Declear();//变量说明分析
if(code ==3) //复合语句分析
{
S_Begin();
if(code!=46)
Error(49);
}
else
Error(50);
}
else
Error(2);
}
else
Error(1);
Line=LineOfEqu;
LineOfEqu=0;
while(gen_pos<Line)
{
gen(Equ[gen_pos].op,Equ[gen_pos].op1,Equ[gen_pos].op2,Equ[gen_pos].result);
gen_pos++;
}
gen(0,0,0,0);
if(error_count)
printf("共计%6d个错误!",error_count);
else
printf("语法分析完毕");
fclose(TokenFin);
printf("产生四元式如下:\n");
rewind(EquFout);
ch1=fgetc(EquFout);
while(ch1!=EOF)
{
printf("%c",ch1);
ch1=fgetc(EquFout);
}
fclose(EquFout);
}
void GetNext()
{
int d1,d2,d3;
fscanf(TokenFin,"%d%s%d%d\n",&d1,ID,&d2,&d3);
code =d2;
address=d3;
}
void Error(int k)
{
switch(k)
{
case 1: printf("格式出错:第一行少'program'\n");break;
case 2: printf("格式出错:第一行少程序名\n ");break;
case 3: printf("第%4d行,说明语句出错 \n",LineOfPro); break;
case 4: printf("第%4d行,赋值语句出错,不匹配或其它错误 \n",LineOfPro);break;
case 5: printf("第%4d行,'end'不匹配\n",LineOfPro );break;
case 6: printf("第%4d行,语句出错 \n",LineOfPro );break;
case 7: printf("第%4d行,表达式语句出错 \n",LineOfPro);break;
case 8: printf("第%4d行,if 语句出错 \n",LineOfPro );break;
case 9: printf("第%4d行,while 语句出错 \n",LineOfPro);break;
case 10: printf("第%4d行,for 语句出错 \n",LineOfPro);break;
case 11: printf("第%4d行,repeat 语句出错 \n",LineOfPro);break;
case 12 : printf("第%4d行,布尔表达式语句出错 \n",LineOfPro);break;
case 49 : printf("程序缺少.号出错.\n");break;
case 50: printf("未写任何语句!\n");printf("\n");break;
case 51: printf("第%4d行,缺少':'\n",LineOfPro);break;
default :printf("未知错误!\n");printf("\n");break;
}
error_count++;
return;
}
int gen(int op,int a,int b,int r)
{
LineOfEqu++;
switch(op)
{
case 0: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('0',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 1: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc(':',EquFout);
fputc('=',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 2: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('+',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 3: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('-',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 4: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('*',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 5: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('/',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 6: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('j',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 7: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('j',EquFout);
fputc('<',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 8: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('j',EquFout);
fputc('=',EquFout);
fputc(' ',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 9: fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('j',EquFout);
fputc('>',EquFout);
fputc('=',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 10:fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('j',EquFout);
fputc('<',EquFout);
fputc('=',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
case 11:fprintf(EquFout,"%5d",LineOfEqu);
fputc(' ',EquFout);
fputc('(',EquFout);
fputc(' ',EquFout);
fputc('j',EquFout);
fputc('<',EquFout);
fputc('>',EquFout);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",a);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",b);
fputc(' ',EquFout);
fprintf(EquFout,"%5d",r);
fputc(' ',EquFout);
fputc(')',EquFout);
fputc('\n',EquFout);
break;
default:break;
}
return LineOfEqu;
}
/********************说明变量语句分析*******************/
void Declear()
{
int a=1,i=0,j=0;
int df;
InitStack();
i=0;
if(code==31)
{
GetNext();
if(code==3){Error(3);return;}
while(code!=3)
{ Push(code,address);
GetNext();
}
i=0;
var_count=0;
while(pos>0)
{ if(expr[i].cod==34)
{ i++;
var_count++;
pos--;
}
else
{ if(expr[i].cod==50)
{ i++;
pos--;
df=expr[i].cod;
if((df!=4)&&(df!=7)&&(df!=16)&&(df!=24))
{ Error(3);
return;
}
else
{ i++;
pos--;
if(expr[i].cod==52) {i++;pos--;LineOfPro++;}
else {Error(51);LineOfPro++;}
}
}
else
{
if(expr[i].cod==44){i++;pos--;}
else {Error(3);return;}
}
}
}
/*************修改符号表*************/
for(i=0;i<EXP_LEN;i++)
{ var_list[i].addr=0;
var_list[i].cod=0;
for(j=0;j<30;j++)
var_list[i].name[j]='\0';
}
if((SymbleFin=fopen("symble.txt","rt"))==NULL)
{
printf("cann't open file symble.txt. strick any key exit");
exit(1);
}
i=0;
while(1)
{ fscanf(SymbleFin,"%d%d%s\n",&var_list[i].addr,&var_list[i].cod,var_list[i].name);
if(var_list[i].addr==0) break;
i++;
}
fclose(SymbleFin);
if((SymbleFin=fopen("symble.txt","wt"))==NULL)
{
printf("cann't open file symble.txt. strick any key exit");
exit(1);
}
a=0;
fprintf(SymbleFin,"%3d 0 0\n",var_count);
while(a<i)
{
fprintf(SymbleFin,"%3d %3d %s\n",var_list[a].addr,var_list[a].cod,var_list[a].name);
a++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -