📄 编译程序.cpp
字号:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define ACC -2
//===while if 语法===
#define sy_if 0
#define sy_then 1
#define sy_else 2
#define sy_while 3
#define sy_begin 4
#define sy_do 5
#define sy_end 6
#define a 7
#define semicolon 8
#define e 9
#define jinghao 10
#define S 11
#define L 12
#define tempsy 15
#define EA 18
#define EO 19
//===布尔运算===
#define plus 34
#define times 36
#define becomes 38
#define op_and 39
#define op_or 40
#define op_not 41
#define rop 42
#define lparent 48
#define rparent 49
#define ident 56
#define intconst 57
//********************
char ch='\0';//当前字符
int count=0;
static char spelling[10]={""};//存放识别的字
static char line[81]={""};//一行字符缓冲区
char *pline;//字符缓冲区指针
static char ntab1[100][10];//存放识别的标识符
struct ntab
{
int tc;
int fc;
};
struct ntab ntab2[200];
int label=0;//存放临时变量的表的定义
//===存放文件的结构===
struct rwords
{
char sp[10];
int sy;
} ;
struct rwords reswords[10]=
{{"if",sy_if},{"do",sy_do},{"else",sy_else},{"while",sy_while},{"then",sy_then},{"begin",sy_begin},
{"end",sy_end},{"and",op_and},{"of",op_or},{"not",op_not}};
struct aa
{
int sy1;
int pos;
};
struct aa buf[1000]; //词法分析缓冲区
struct aa n; //当前字符
struct aa n1; //当前表达式中的字符
struct aa E; //非终结符
struct aa sstack[100]; //符号栈
struct aa ibuf[100];
struct aa stack[1000];
struct aa oth;
//===四元式结构===
struct fourexp
{
char op[10];
struct aa arg1;
struct aa arg2;
int result;
};
struct fourexp fexp[200];
int ssp=0;
struct aa *pbuf=buf;
int nlength=0;
int lnum=0;
int tt1=0;
FILE *cfile;
FILE *mfile;
//*****************************
int newt=0;
int nxq=100;
int lr;
int lr1;
int sp=0;
int stack1[100];
int sp1=0;
int num=0;
struct ll
{
int nxq1;
int tc1;
int fc1;
};
struct ll labelmark[10];
int labeltemp[10];
int pointmark=-1;
int pointtemp=-1;
int sign=0;
//***************************
static int action[19][13]=
/*0*/ {{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,1,-1},
/*1*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},
/*2*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},
/*3*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},
/*4*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},
/*5*/ {-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},
/*6*/ {-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*7*/ {-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},
/*8*/ {-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},
/*9*/ {-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},
/*10*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},
/*11*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1},
/*12*/ {-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1},
/*13*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16},
/*14*/ {-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*15*/ {-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1},
/*16*/ {-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},
/*17*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1},
/*18*/ {-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}};
static int action1[10][7]=
/*0*/ {{3,-1,-1,2,-1,-1,1},
/*1*/ {-1,4,5,-1,-1,ACC,-1},
/*2*/ {3,-1,-1,2,-1,-1,6},
/*3*/ {-1,104,104,-1,104,104,-1},
/*4*/ {3,-1,-1,2,-1,-1,7},
/*5*/ {3,-1,-1,2,-1,-1,8},
/*6*/ {-1,4,5,-1,9,-1,-1},
/*7*/ {-1,101,5,-1,101,101,-1},
/*8*/ {-1,102,102,-1,102,102,-1},
/*9*/ {-1,103,103,-1,103,103,-1}};
static int action2[16][11]=
/*0*/ {{1,-1,4,-1,5,-1,-1,-1,13,7,8},
/*1*/ {-1,2,-1,101,-1,101,101,101,-1,-1,-1},
/*2*/ {3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*3*/ {-1,-1,-1,102,-1,102,102,102,-1,-1,-1},
/*4*/ {1,-1,4,-1,5,-1,-1,-1,11,7,8},
/*5*/ {1,-1,4,-1,5,-1,-1,-1,6,7,8},
/*6*/ {-1,-1,-1,104,-1,9,10,104,-1,-1,-1},
/*7*/ {1,-1,4,-1,5,-1,-1,-1,14,7,8},
/*8*/ {1,-1,4,-1,5,-1,-1,-1,15,7,8},
/*9*/ {105,-1,105,-1,105,-1,-1,-1,-1,-1,-1},
/*10*/ {107,-1,107,-1,107,-1,-1,-1,-1,-1,-1},
/*11*/ {-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},
/*12*/ {-1,-1,-1,103,-1,103,103,103,-1,-1,-1},
/*13*/ {-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},
/*14*/ {-1,-1,-1,106,-1,9,10,106,-1,-1,-1},
/*15*/ {-1,-1,-1,108,-1,9,10,108,-1,-1,-1}};
//*********************************************************
//===从文件读一行到缓冲区===
void readline()
{
char ch1;
pline=line;
ch1=getc(cfile);
while(ch1!='\n')
{
*pline=ch1;
pline++;
ch1=getc(cfile);
}
*pline='\0';
pline=line;
}
//===从缓冲区读一个字符===
void readch()
{
if(ch=='\0')
{
readline();
lnum++;
}
ch=*pline;
pline++;
}
//===标志符和关键字的识别===
int find(char spel[])
{
int ss1=0;
int ii=0;
while((ss1==0)&&(ii<nlength))
{
if(!strcmp(spel,ntab1[ii]))
ss1=1;
ii++;
}
if(ss1==1) return ii-1;
else return -1;
}
void identifier()
{
int iii=0,j,k;
int ss=0;
k=0;
do
{
spelling[k]=ch;
k++;
readch();
}while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')));
pline--;
spelling[k]='\0';
while((ss==0)&&(iii<10))
{
if(!strcmp(spelling,reswords[iii].sp))
ss=1;
iii++;
}
if(ss==1)
{
buf[count].sy1=reswords[iii-1].sy;
}
else
{
buf[count].sy1=ident;
j=find(spelling);
if(j==-1)
{
buf[count].pos=tt1;
strcpy(ntab1[tt1],spelling);
tt1++;
nlength++;
}
else buf[count].pos=j;
}
count++;
for(k=0;k<10;k++)
spelling[k]=' ';
}
//===数字的识别===
void number()
{
int ivalue=0;
int digit;
do
{
digit=ch-'0';
ivalue=ivalue*10+digit;
readch();
}while((ch>='0')&&(ch<='9'));
buf[count].sy1=intconst;
buf[count].pos=ivalue;
count++;
pline--;
}
//===扫描主函数===
void scan()
{
while(ch!='~')
{
if((ch>='a')&&(ch<='z'))
identifier();
else if((ch>='0')&&(ch<='9'))
number();
else if(ch=='<')
{
readch();
if(ch=='=')
{
buf[count].pos=0;
}
else
{
if(ch=='>')
buf[count].pos=4;
else
{
buf[count].pos=1;
pline--;
}
}
buf[count].sy1=rop;
count++;
}
else if(ch=='>')
{
readch();
if(ch=='=')
{
buf[count].pos=2;
}
else
{
buf[count].pos=3;
pline--;
}
buf[count].sy1=rop;
count++;
}
else if(ch=='(')
{
buf[count].sy1=lparent;
count++;
}
else if(ch==')')
{
buf[count].sy1=rparent;
count++;
}
else if(ch=='#')
{
buf[count].sy1=jinghao;
count++;
}
else if(ch=='+')
{
buf[count].sy1=plus;
count++;
}
else if(ch=='*')
{
buf[count].sy1=times;
count++;
}
else if(ch==';')
{
buf[count].sy1=semicolon;
count++;
}
else if(ch=='=')
{
readch();
if(ch=='=')
{
buf[count].sy1=rop;
buf[count].pos=5;
}
else
{
buf[count].sy1=becomes;
pline--;
}
count++;
}
else
{
//什么也不做
}
readch();
}//循环结束
buf[count].sy1=-1;
}
//*************************************************************
//===
void readnu()
{
if(pbuf->sy1>=0)
{
n.sy1=pbuf->sy1;
n.pos=pbuf->pos;
pbuf++;
}
}
int newtemp()//中间变量的生成
{
newt++;
return newt;
}
//===生成四元式===
int gen(char op1[],struct aa arg11,struct aa arg22,int result1)
{
strcpy(fexp[nxq].op,op1);
fexp[nxq].arg1.sy1=arg11.sy1;
fexp[nxq].arg1.pos=arg11.pos;
fexp[nxq].arg2.sy1=arg22.sy1;
fexp[nxq].arg2.pos=arg22.pos;
fexp[nxq].result=result1;
nxq++;
return nxq-1;
}
//===布尔表达式匹配===
int merge(int p1,int p2)
{
int p;
if(p2==0) return p1;
else
{
p=p2;
while(fexp[p].result!=0) p=fexp[p].result;
fexp[p].result=p1;
return p2;
}
}
//===回填四元式表格===
void backpatch(int p,int t)
{
int tempq;
int q;
q=p;
while(q!=0)
{
tempq=fexp[q].result;
fexp[q].result=t;
q=tempq;
}
}
int change1(int chan)
{
switch(chan)
{
case ident:
case intconst:
return 0;
case plus:
return 1;
case times:
return 2;
case lparent:
return 3;
case rparent:
return 4;
case jinghao:
return 5;
case tempsy:
return 6;
}
}
change2(int chan)
{
switch(chan)
{
case ident:
case intconst:
return 0;
case rop:
return 1;
case lparent:
return 2;
case rparent:
return 3;
case op_not:
return 4;
case op_and:
return 5;
case op_or:
return 6;
case jinghao:
return 7;
case tempsy:
return 8;
case EA:
return 9;
case EO:
return 10;
}
}
//*******赋值语句分析********
void lrparse1(int num)
{
lr1=action1[stack1[sp1]][change1(n1.sy1)];
if(lr1==-1)
{
printf("\n算术表达式或赋值语句出错!\n");
getch();
exit(0);
}
if((lr1<10)&&(lr1>=0))
{
sp1++;
stack1[sp1]=lr1;
if(n1.sy1!=tempsy)
{
ssp++;
num++;
sstack[ssp].sy1=n1.sy1;
sstack[ssp].pos=n1.pos;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -