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

📄 lcsgrammer.cpp

📁 用c语言实现简单的编译原理中的一条语句的词法分析。
💻 CPP
字号:
# include "stdio.h"
# include "string.h"

# define SUCCESS        1
# define ERROR          0
# define MAXINPUT       300
# define MAXSTACK       100
# define STARTSYMBOL    'S'

int prioriy[6][6]={
	{-1,-1,-1,-1, 0, 4},
	{ 4, 4, 1, 1, 1, 1},
	{-1,-1, 1, 1, 1, 1},
	{-1,-1,-1, 1, 1, 1},
	{ 4, 4, 1, 1, 1, 1},
    {-1,-1,-1,-1, 4, 4}};

char VtList[6]={'(','i','*','+',')','#'};

char character[MAXINPUT];

int stack[MAXSTACK],a[MAXINPUT];
int Reduce(int,int,int);
int prioriycmp(int,int);
int transferCHARtoINT(char);
char transferINTtoCHAR(int);
int parser (void);
int IsVt(int);



int main ()
{   
	int Result;

	printf("欢迎进入ARMOSEE语法分析程序\n本程序分析由以下文法生成的一个句子\nE->E+T|T\nT->T*F|F\nF->(E)|i\n");
	printf("请输入该文法的句子,以#结束:\n");
    scanf("%s",&character);
	while(character[strlen(character)-1]!='#')
	{
		printf("输入句子不合法,没有以#结束!请重新输入:\n");
        scanf("%s",&character);
	}

	for(int i=0;i<strlen(character);i++)
		a[i]=transferCHARtoINT(character[i]);

	printf("当前输入串\t\t当前状态栈\t\n");
	Result=parser();
	
	if(Result==0)
		printf("\n分析失败!\n");
	else 
		printf("\n分析成功!\n");

	return (0);

}
int Reduce(int begin,int end,int len)
{
	switch(end)
	{
	   case 7: return(6);break;
	   case 8: return(7);break;
	   case 4: 
	   case 1: return(8);break;
	   default:break;
	}

}
int IsVt(int character)
{
    if(character>=0&&character<6)
	return(1);
	else return(0);
}

int prioriycmp(int character1,int character2)
{
	return(prioriy[character1][character2]);
}

int transferCHARtoINT(char character)
{
	switch(character)
	{
	   case '(': return(0);break;
	   case 'i': return(1);break;
	   case '*': return(2);break;
	   case '+': return(3);break;
	   case ')': return(4);break;
	   case '#': return(5);break;
	   case 'E': return(6);break;
	   case 'T': return(7);break;
	   case 'F': return(8);break;
	   default : break;
	}

}

char transferINTtoCHAR(int num)
{
	switch(num)
	{
	   case 0: return('(');break;
	   case 1: return('i');break;
	   case 2: return('*');break;
	   case 3: return('+');break;
	   case 4: return(')');break;
	   case 5: return('#');break;
	   case 6: return('E');break;
	   case 7: return('T');break;
	   case 8: return('F');break;
	   default : break;
	}

}

int parser (void)
{
	int i,k,r,NewVn;
	i=0;
	k=0;
	stack[0]=5;

	for(int count=i;count<strlen(character);count++)
		     printf("%c",transferINTtoCHAR(a[count]));
	printf("\t\t\t");
	for(int num=0;num<=k;num++)
		     printf("%c",transferINTtoCHAR(stack[num]));
	do
	{
		printf("\n");
		for(int count=i+1;count<strlen(character);count++)
		     printf("%c",transferINTtoCHAR(a[count]));
		printf("\t\t\t");
		int j;
		r=a[i++];
		if (IsVt(stack[k])) j=k;
		else j=k-1;
		while (prioriycmp(stack[j],r)==1)
		{
			int q;
			do
			{
				q=stack[j];
				if(IsVt(stack[j-1])) j--;
				else j-=2;
			}while (prioriycmp(stack[j],q)!=-1);
			NewVn=Reduce(stack[j+1],stack[k],k-j);
			k=j+1;
			stack[k]=NewVn;
			
		}
		if(r!=5)
		{
		   if (prioriycmp(stack[j],r)==-1||prioriycmp(stack[j],r)==0)
			stack[++k]=r;
		   else return ERROR;
		}
		for(int num=0;num<=k;num++)
		        printf("%c",transferINTtoCHAR(stack[num]));
		
	}while(r!=5);
	return SUCCESS;
}

⌨️ 快捷键说明

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