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

📄 ll1.cpp

📁 编译原理中间代码生成器的设计
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#define        N             50
#define        MAX           100
#define      SEM      1             /*语义*/
#define      SYN      0				/*算符*/
struct LL{
	int  num  ;
	char name[4] ;
};
/*P表示将字符压栈*/
/*Q表示字符*/
/*H表示E'*/
/*X表示GRE(+)*/
/*Y表示GRE(-)*/
/*0表示空*/
/*I表示T'*/
/*W表示GRE(*)*/
/*U表示GRE(/)*/
char str[MAX] ;
char synstack[MAX] ;   /*算符栈数组*/
int  ksyn = 0    ;   /*算符栈顶指针*/    
char semstack[MAX] ;   /*语义栈数组*/
int  ksem = 0    ;   /*语义栈顶指针*/
char qt[N][10]   ;   /*四元式字符串*/
int  kqt         ;   /*四元式字符串当前个数*/
LL ll[N] ;      /*文法数组*/
/*  i , + , - , * , / , ( , ) , # , */
int analysit[5][8] = {
	1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 ,
	0 , 2 , 3 , 0 , 0 , 0 , 4 , 4 ,
	5 , 0 , 0 , 0 , 0 , 5 , 0 , 0 ,
	0 , 8 , 8 , 6 , 7 , 0 , 8 , 8 ,
	9 , 0 , 0 , 0 , 0 , 10 , 0 , 0 
};             /*分析表*/

int isVt(char w) ;
int isVn(char w) ;
void initll() ;
int L(char, char) ;
int char_int(char) ;

int analysis() ;
int  push(char stack[] , char w , int flag) ;
char pop (char stack[] , int flag) ;

void initll()
{
	int i = 0 , j=0 ;
	FILE * in ;
	in = fopen("test1.txt" , "r") ;
	if(in == NULL)
	{
		printf("test1.txt不存在\n") ;
		return ;
	}
	for(i = 0 ; i<10 ; i++)
	{
		for(j=0 ; j<4 ; j++)
			fscanf(in , "%s" , &ll[i].name[j]) ;
		fscanf(in , "%d" , &ll[i].num) ;
	}
	return ;
}
int char_int(char w)
{
	char x = 0 ;
	if(w>='a'&&w<='z'||(w>='0'&&w<='9'))
		x = 0  ;
	switch(w)
	{
	case 'E':
		x = 0 ;
		break ;
	case 'H':
		x = 1 ;
		break ;
	case 'T':
		x = 2 ;
		break ;
	case 'I':
		x = 3 ;
		break ;

	case 'F':
		x = 4 ;
		break ;
	case '#':
		x = 7 ;
		break ;
	case '*':
		x = 3 ;
		break ;
	case '/':
		x = 4 ;
		break ;
	case '+':
		x = 1 ;
		break ;
	case '-':
		x = 2 ;
		break ;
	case '(':
		x=5 ;
		break ;
	case ')':
		x = 6 ;
		break ;
	}
	return x ;
}
int L(char x , char w)
{
	if(analysit[char_int(x)][char_int(w)] >0)
		return analysit[char_int(x)][char_int(w)] ;
	return 0 ;
}

int isVn(char w) 
{
	if(w>='A'&&w<='Z')
		return 1 ;
	return 0 ;
}

int isVt(char w)
{
	if(w>='a'&&w<='z'||(w>='0'&&w<='9')||w == '+'||
		w=='-'||w=='*'||w=='/'||w=='('||w==')')
		return 1 ;
	return 0 ;
}
char pop(char stack[] , int flag)
{
	char w ;
	if(flag == SEM)
	{
		if(ksem == 0)
		{
			printf("栈空\n") ;
			return -1 ;
		}
		w = stack[ksem-1] ;
		ksem -- ;
		return w ;
	}
	if(flag == SYN)
	{
		if(ksyn == 0)
		{
			printf("栈空\n") ;
			return -1 ;
		}
		w = stack[ksyn-1] ;
		ksyn-- ;
		return w ;
	}
}
int push(char stack[] , char w , int flag)
{
	if(ksyn==N-1||ksem == N-1)
	{
		printf("栈溢出\n") ;
		return 1 ;
	}
	else
	{
		if(SYN == flag)
		{
			stack[ksyn] = w ;
			ksyn++ ;
		}
		if(SEM == flag)
		{
			stack[ksem] = w ;
			ksem ++ ;
		}
		
	}
	return 0 ;
}
void record(char x)
{
	char asem=0 , bsem= 0 , syn= 0 ;
	asem = pop(semstack , SEM) ;
	bsem = pop(semstack , SEM) ;
//	syn  = pop(synstack , SYN) ;
	if(asem == -1||bsem== -1)
	{
		printf("记录四元式错误\n") ;
		return ;
	}
	else
	{
		int i = 0 ;
		qt[kqt][i++] = '(' ;
		if(x=='X')
			qt[kqt][i++] = '+' ;
		else if(x=='Y')
			qt[kqt][i++] = '-' ;
		else if(x=='W')
			qt[kqt][i++] = '*' ;
		else
			qt[kqt][i++] = '/' ;
		qt[kqt][i++] = ',' ;
		qt[kqt][i++] = bsem ;
		qt[kqt][i++] = ',' ;
		qt[kqt][i++] = asem ;
		qt[kqt][i++] = ',' ;
		qt[kqt][i++] = 't' ;
		qt[kqt][i++] = ')' ;
		push(semstack , 't' , SEM) ;
		kqt++ ;
		if(kqt==N)
		{
			printf("四元式数组满\n") ;
			return ;
		}
	}
	return ;
}
void output()
{
	int i = 0;
	for(i =0 ; i<kqt ; i++)
		printf("%s\n" , qt[i]) ;
}
int analysis()
{
	int i = 0 ;
	char w = 0  , x = 0 ;
	push(synstack , '#' , SYN) ;
	push(synstack , 'E' , SYN) ;
	while(i<strlen(str)) 
	{
t1:		w = str[i++] ;
t2:		x = pop(synstack , SYN) ;
		if(isVt(x))
		{
			if(x==w)
			{
				goto t1 ;
			}
			else
			{
				printf("\nError\n") ;
				return 1 ;
			}
		}
		else 
		{
			if(isVn(x))
			{
				if(x == 'X'||x=='Y'||x=='W'||x=='U')
				{
					record(x) ;
					goto t2 ;
				}
				if(x == 'P')
					goto t2 ;
				int t = 0 ;
				t = L(x , w) ;
				if(0==t)
					return 1 ;
				else
				{
					int i = 0 ;
					for(i = ll[t-1].num-1 ; i>=0 ; i--)
					{
						if(ll[t-1].name[i] == 'Q')
							push(synstack , w , SYN) ;
 						else if(ll[t-1].name[i] == 'P')
						{
							push(synstack , 'P' , SYN) ;
							push(semstack , w , SEM) ;
						}
						else
							push(synstack , ll[t-1].name[i] , SYN) ;
					}
					goto t2 ;
				}
			}
			else
			{
				if(x=='#')
					return 0 ;
				else
				{
					printf("\nError\n") ;
					return 1 ;
				}
			}
		}
	}
}
int main()
{
	fgets(str , MAX  , stdin) ;
	initll() ;
	analysis() ;
    output() ;
	return 0 ;
}

⌨️ 快捷键说明

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