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

📄 yffx.cpp

📁 编译原理语法分析程序
💻 CPP
字号:
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
char a[50],b[50],d[500],e[100];
char ch;
char y;
int n1,i1=0,flag=1,n=6;
int total=0;
int S();
int S1();
int T();
int G();  //G为T'
void input();
void input1();
void output();
void main()
{
	int f,p,j=0;
	char x;
	
	printf("请输入字符串(长度<50,以#号结束)\n");
	do
	{
		scanf("%c",&y);
		a[j]=y;
		j++;
	}while(y!='#');
	n1=j;
	y=a[0];
	if(y=='a')
	{
		d[0]='S';
		d[1]='=';
		d[2]='>';
		d[3]='a';
		d[4]='#';
		
	}
	else if(y=='^')
	{
		d[0]='S';
		d[1]='=';
		d[2]='>';
		d[3]='^';
		d[4]='#';
		
	}
	else if(y=='(')
	{
		d[0]='S';
		d[1]='=';
		d[2]='>';
		d[3]='(';
		d[4]='T';
		d[5]=')';
		d[6]='#';		
	}
	ch=b[0]=a[0];
	printf("步骤\t文法\t分析串\t\t\t分析字符\t剩余串\n");
	f=S1();
	if(f==0)
		return;
	if(ch=='#')
	{
		printf("accept\n");
		p=0;
		x=d[p];
		while(x!='#')
		{
			printf("%c",x);
			p=p+1;
			x=d[p];
		}	
	}
	else
	{
		printf("error\n");
		printf("回车返回\n");
		getchar();
		getchar();
		return;
	}

	
}
int S1()
{
	int f;
	if(ch=='(')
	{
		b[i1]=ch;
		printf("%d\tS-->(T)\t",total);
		total++;		
		flag=0;
		input();
		input1();
		ch=a[++i1];
		f=T();
		if(f==0)
			return(0);
		if(ch==')')
		{
			b[i1]=ch;
			printf("%d\tS-->(T)\t",total);
			total++;
			flag=0;
			input();
			input1();
			ch=a[++i1];
		}
		else
		{
			printf("error\n");
			return(0);
		}
	}
	else if(ch=='a')
	{
		b[i1]=ch;
		printf("%d\tS-->a\t",total);
		total++;		
		flag=0;
		input();
		input1();
		ch=a[++i1];
	}
	else if(ch=='^')
	{
		b[i1]=ch;
		printf("%d\tS-->^\t",total);
		total++;	
		flag=0;
		input();
		input1();
		ch=a[++i1];
	}
	else
	{
		printf("error\n");
		return(0);
	}
	return(1); 
}


int S()
{
	int f;
	if(ch=='(')
	{
		b[i1]=ch;
		printf("%d\tS-->(T)\t",total);
		total++;
		e[0]='S';
		e[1]='=';
		e[2]='(';
		e[3]='T';
		e[4]=')';
		e[5]='#';
		output();
		flag=0;
		input();
		input1();
		ch=a[++i1];
		f=T();
		if(f==0)
			return(0);
		if(ch==')')
		{
			b[i1]=ch;
			printf("%d\tS-->(T)\t",total);
			total++;
			flag=0;
			input();
			input1();
			ch=a[++i1];
		}
		else
		{
			printf("error\n");
			return(0);
		}
	}
	else if(ch=='a')
	{
		b[i1]=ch;
		printf("%d\tS-->a\t",total);
		total++;
		e[0]='S';
		e[1]='=';
		e[2]='>';
		e[3]='a';
		e[4]='#';
		output();
		flag=0;
		input();
		input1();
		ch=a[++i1];			
	}
	else if(ch=='^')
	{
		b[i1]=ch;
		printf("%d\tS-->^\t",total);
		total++;
		e[0]='S';
		e[1]='=';
		e[2]='>';
		e[3]='^';
		e[4]='#';
		output();
		flag=0;
		input();
		input1();
		ch=a[++i1];
	}
	else
	{
		printf("error\n");
		return(0);
	}
	return(1); 
}
int T()
{
	int f,t;
	printf("%d\tT-->SG\t",total);
	total++;
	e[0]='T';
	e[1]='=';
	e[2]='>';
	e[3]='S';
	e[4]='G';
	e[5]='#';
	output();
	flag=1;
	input();
	input1();
	f=S();
	if(f==0)
		return(0);
	t=G();
	if(t==0)
		return(0);
	else
		return(1);
}
int G()
{
	int f,t;
	if(ch==',')
	{
		b[i1]=ch;
		printf("%d\tG-->,SG\t",total);
		total++;
		e[0]='G';
		e[1]='=';
		e[2]='>';
		e[3]=',';
		e[4]='S';
		e[5]='G';
		e[6]='#';
		output();
		flag=0;
		input();
		input1();
		ch=a[++i1];
		f=S();
		if(f==0)
			return 0;
		t=G();
		if(t==0)
			return 0;
		else
			return 1;
	}
	printf("%d\tG-->~\t",total);//~表是空
	total++;
	e[0]='G';
	e[1]='=';
	e[2]='>';
	e[3]='~';
	e[4]='#';
	output();
	flag=1;
	input();
	input1();
	return 1;
}
void input()                      
{  
	int j=0;
	for (;j<=i1-flag;j++)
		printf("%c",b[j]); 
	if(j<8) printf("\t");
	
  	    printf("\t\t");
	printf("%c\t\t",ch);  
}

void input1()
{  
	int j;
	for (j=i1+1-flag;j<n1;j++)
		printf("%c",a[j]);   
	printf("\n");
}

void output() 
{  
	int m,k,j,q;
	int i=0;
	m=0;k=0;q=0;
	i=n;
	d[n]='=';
	d[n+1]='>';
	d[n+2]='#';
	n=n+2;
	i=n;
	i=i-2;
	while(d[i]!='>'&&i!=0)
			i=i-1;
	i=i+1;
	while(d[i]!=e[0])
			i=i+1;
	q=i;
	m=q;
	k=q;
	while(d[m]!='>')
			m=m-1;
	m=m+1;
	while(m!=q)
	{  
		d[n]=d[m];
		m=m+1;
		n=n+1;
	}
	d[n]='#';
	for(j=3;e[j]!='#';j++)
	{  
		d[n]=e[j];
		n=n+1;
	}
	k=k+1;
	while(d[k]!='=')
	{  
		d[n]=d[k];
		n=n+1;
		k=k+1;
	}
	d[n]='#';
}


⌨️ 快捷键说明

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