⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pas.c

📁 PASCAL语言子集编译器
💻 C
📖 第 1 页 / 共 4 页
字号:
/***************************************/
/*         pas.c                       */
/*          高级语言到四元式           */
/***************************************/

#include  "stdio.h"
#include   "string.h"
#include	"globals.h"
#include	"symtab.h"
//#include	"code.h"
#include     "block.h"
#include     "cgen.h"

#define   ACC   -2
/********************************************/ 
#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/*E and*/
#define    EO          19/*E or*/

#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;
}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},
{"or",op_or},
{"not",op_not}};

struct aa{
	int sy1;
	int pos;
}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;
}fexp[200];
//四元式的结构

int ssp=0;  //指向sstack[100]
struct aa *pbuf=buf;  //指向词法分析缓冲区
int nlength=0;
int lnum=0;  //源程序长度

int tt1=0;
FILE *cfile;
FILE *mfile;
FILE *source;
FILE *code; 
int Error=FALSE;
/**********************************************/
int newt=0;
//临时变量
int nxq=100;
//*nxq指向下一个形成的四元式的地址
int lr;
int lr1;
int sp=0;
//状态栈定义
int stack1[100];
int sp1=0;
//状态栈1的定义
int num=0;
struct ll{
	int nxq1;
	int tc1;
	int fc1;
}labelmark[10];
int labeltemp[10];
int pointmark=-1,pointtemp=-1;
int sign=0;
//sign=1,表达式为赋值语句;sign=2,表达式为布尔表达式
/********************************************************/
static int action[19][13]=
/*0*/   {{2,-1,-1,3,4,-1,-1,5,-1,-1,10,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,-115,-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*/     {104,104,104,104,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*/     {101,101,5,101,101,101,-1},
/*8*/     {102,102,102,102,102,102,-1},
/*9*/     {103,103,103,103,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,105,-1,-1,-1},
/*10*/    {107,-1,107,-1,107,-1,-1,107,-1,-1,-1},
/*11*/    {-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},
/*12*/    {-1,103,-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}}; 
/*********************从文件读一行到缓冲区*******************************/

readline()
{
	char ch1;
	pline=line;
	ch1=getc(cfile);
	while (ch1!='\n')
	{
		*pline=ch1;
		pline++;
		ch1=getc(cfile);
	}
	*pline='\0';
	pline=line;
}
/*******************从缓冲区读一个字符***************/

readch()
{
	if(ch=='\0')
	{
		readline();
		lnum++;
	}
	ch=*pline;
	pline++;
}

/**************标志符和关键字的识别***********************/

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;
}

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]=' ';
}
/*******************数字的识别************************/

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--;
}
/***********************扫描主函数*************************/

scan()
{
	//int i;
	while(!feof(cfile))
	{
		switch(ch)
		{
		case ' ':
			break;
		case 'a':
		case 'b':
		case 'c':
		case 'd':
		case 'e':
		case 'f':
		case 'g':
		case 'h':
		case 'i':
		case 'j':
		case 'k':
		case 'l':
		case 'm':
		case 'n':
		case 'o':
		case 'p':
		case 'q':
		case 'r':
		case 's':
		case 't':
		case 'u':
		case 'v':
		case 'w':
		case 'x':
		case 'y':
		case 'z':
			identifier();
			break;
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			number();
			break;
		case '<':
			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++;
			break;
		case '>':
			readch();
			if(ch=='=')
			{
				buf[count].pos=2;
			}
			else
			{
				buf[count].pos=3;
				pline--;
			}
			buf[count].sy1=rop;
			count++;
			break;
		case '(':
			buf[count].sy1=lparent;
			count++;
			break;
		case ')':
			buf[count].sy1=rparent;
			count++;
			break;
		case '#':
			buf[count].sy1=jinghao;
			count++;
			break;
		case '+':
			buf[count].sy1=plus;
			count++;
			break;
		case '*':
			buf[count].sy1=times;
			count++;
			break;
		case ':':
			readch();
			if(ch=='=')
			buf[count].sy1=becomes;
			count++;
			break;
		case '=':
			buf[count].sy1=rop;
			buf[count].pos=5;
			count++;
			break;
		case ';':
			buf[count].sy1=semicolon;
			count++;
			break;
		}
			readch();
	}
			buf[count].sy1=-1;
}
/****************************************************************/

readnu()
{
	if(pbuf->sy1>=0)
	{
		n.sy1=pbuf->sy1;
		n.pos=pbuf->pos;
		pbuf++;
	}
}
/*****************************中间变量的生成*************************/

newtemp()
{
	newt++;
	return newt;
}
/*********************生成四元式**************************/

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;
}
/*****************布尔表达式的匹配***********************/

merg(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;
	}
}

backpatch(int p,int t)
{
	int tempq;
	int q;
	q=p;
	while(q!=0)
	{
		tempq=fexp[q].result;
		fexp[q].result=t;
		q=tempq;
	}
}
/************************************************************/

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:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -