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

📄 ll(1)文法.txt

📁 内有6个源程序代码,均为数据结构的实现代码
💻 TXT
字号:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<string.h>
#include<stdio.h>
#define Q 20
#define N 7
#define M 6
#define P 4
int  table[M][N];     //表table和表content合起来为预测分析表
char content[N][P];     //存放预测分析表中用到的表达式,如'->TE'等

void inittable()     //初始化table表
{
	for(int i=1;i<M;i++)
		for(int j=1;j<N;j++)
			table[i][j]=-1;   //出错位均为-1
		table[1][1]=table[1][4]=0;
		table[2][2]=1;
		table[3][1]=table[3][4]=2;
		table[4][3]=3;
		table[5][4]=4;
		table[5][1]=5;
		table[2][5]=table[2][6]=table[4][2]=table[4][5]=table[4][6]=6;
}
void initcontent()     //初始化产生式表
{
for(int i=0;i<N;i++)
  for(int j=0;j<P;j++)
	  content[i][j]='\0';
  content[0][0]='T';content[0][1]='S';content[0][2]='\0';      //S代替E'
  content[1][0]='+';content[1][1]='T';content[1][2]='S';content[1][3]='\0';
  content[2][0]='F';content[2][1]='Y';content[2][2]='\0';   //  Y代替T'
  content[3][0]='*';content[3][1]='F';content[3][2]='Y';content[3][3]='\0';
  content[4][0]='(';content[4][1]='E';content[4][2]=')';content[4][3]='\0';  
  content[5][0]='i';content[5][1]='\0';
  content[6][0]='$';content[6][1]='\0';       //$代表空串
}
int row(char ch)     //判断字符所处的行号
{
	switch(ch){
	case 'E':return 1;
	case 'S':return 2;
	case 'T':return 3;
	case 'Y':return 4;
	case 'F':return 5;
	default :return 0;
}
}
int col(char ch)     //判断字符所处的列号
{
	switch(ch){
	case 'i':return 1;
	case '+':return 2;
	case '*':return 3;
	case '(':return 4;
	case ')':return 5;
	case '#':return 6;
	default :return 0;
}
}
void analy(char *s)                //分析
{
	int p=0,cx=1,q;
	int i,j;
	char stack[M];      //分析栈
	inittable();       //初始化
	initcontent();     //初始化
	stack[p++]='#';stack[p++]='E';    //初始化堆栈
	while(s)
	{
		j=col(*s);
		i=row(stack[--p]);
		if(j==0)       //表明预测分析表中的列项中没有该非终结符
		{
			cout<<cx<<"\t";
			int k=0;
			while(k<=p)
				cout<<stack[k++];
			cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"不是该文法的终结符!"<<endl;
			exit(1);
		}
		if(i==0)
		{          //说明是终结符
			if(stack[p]==*s)     //与栈顶元素匹配
			{
				cout<<cx++<<"\t";
				int k=0;
		  while(k<=p)
			  cout<<stack[k++];
		  if(*s=='#')      //是结束的符号
		  {
			  cout<<"\t\t"<<s<<setw(25-strlen(s))<<"接受!"<<endl;
			  exit(0); 
		  }
		  cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"匹配!"<<endl;
		  s++;   //输入串自减
	  }
	  else {
		  cout<<cx<<"\t";     //说明是终结符,但不是该文法的终结符
		  int k=0;
		  while(k<=p)
			  cout<<stack[k++];
		  cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"不匹配!"<<endl;
          exit(1);
	  }
  }
  else if(table[i][j]==-1)   //分析表中没有对照的项,表明出错
  {
	  cout<<cx<<"\t";
	  int k=0;
	  while(k<=p)
		  cout<<stack[k++];
	  cout<<"\t\t"<<s<<setw(25-strlen(s))<<*s<<"不匹配!"<<endl;
	  exit(1);
  }
  else{q=table[i][j];
  cout<<cx++<<"\t";
  int k=0;
  while(k<=p)
	  cout<<stack[k++];
  cout<<"\t\t"<<s<<setw(25-strlen(s))<<stack[p]<<"->";
  k=0;
  while(content[q][k]!='\0')     //将表达式输出
  {
	  cout<<content[q][k];
	  k++;
  }
  cout<<'\n';
  k--;
  if(content[q][k]!='$')         //将产生式入栈
	  for(;k>=0;k--)
		  stack[p++]=content[q][k];
  }
}
} 
void main()
{
	int flag=1;
	while(flag)
	{
		char *str,c;
		cout<<"......实验二:LL(1)分析文法......\n给定的LL(1)文法为:\nE->E+T|T\nT->T*F|F\nF->i|(E)\n";
		cout<<"请输入分析串:\n";
		str=new char[Q];
		cin>>str;  
		cout<<"步骤\t分析栈\t\t剩余输入串\t\t所用产生式\n";
		analy(str);
		cout<<"继续?(y/n)\n"<<endl;
		c=getchar();
		if((c=='y')||(c=='Y'))
			flag=1;
		else
			flag=0;
	}
	cout<<"其中S代表次E',Y代表T'."<<endl;
}

⌨️ 快捷键说明

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