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

📄 ll1.cpp

📁 C实现的LL1文法!!! 是我们编译原理课程的一个小实验
💻 CPP
字号:
#include"iostream.h"
#include"string.h"
#include "iomanip.h"
#include "stdlib.h"

struct stack
{
	int top;
	char s[10];
}*sign;


char *M[5][6]={
{"TP","$","$","TP","$","$"},
{"$","+TP","$","$","e","e"},
{"FQ","$","$","FQ","$","$"},
{"$","e","*FQ","$","e","e"},
{"i","$","$","(E)","$","$"}};



int index(char m)
{
	int ID;
         if((m=='E')||(m=='i')) ID=0;
	else if((m=='P')||(m=='+')) ID=1;
	else if((m=='T')||(m=='*')) ID=2;
	else if((m=='Q')||(m=='(')) ID=3;
	else if((m=='F')||(m==')')) ID=4;
	else if(m=='#')             ID=5;
	else                        ID=6;
	return ID;
}

void main()
{
	char instr[15],x,a,*current,left,*right;int i=0,iA,ia,len,top;
	bool flag=true;
	cout<<"参照文法为:\n"<<"E→TE'\n"<<"E'→+TE'|ε\n"<<"T→FT'\n"<<"T'→*FT'|ε\n"<<"F→(E)|i\n";
	cout<<"为编成方便作改写:E'以P、T'以Q  代替."<<endl;
	cout<<"请输入待分析的字符串:(以#结束)\n";
	do
	{
		cin>>instr[i++];
	}
	while(instr[i-1]!='#');
	instr[i]='\0';
	sign=new stack;
	sign->s[0]='#';
	sign->s[1]='E';
	sign->s[2]='\0';
	sign->top=1;
	current=instr;
	a=*current;                                        //a为ip所指向的符号;
	cout<<"步骤"<<setw(22)<<"输入串"<<setw(20)<<"所用产生式\n";
	cout<<sign->s<<setw(24)<<instr<<endl;
	while(flag)
	{
		cout<<setw(20);
		x=sign->s[sign->top];                    //让X等于栈顶符号
		if(x=='#')                                  //if X 是终结符号或# then
		{
			if(x==a)                                //If X=a then  把X从栈顶弹出并使ip指向下一个输入符号
				flag=false;
			else 
			{
				cout<<"此句子不符合该文法!";
				break;
			}
		}
		else if((x=='i')||(x=='+')||(x=='*')||(x=='(')||(x==')')) //else   X 是终结符号
		{
			if(x==a)
			{
				sign->s[sign->top]='\0';
				sign->top--;                                         //从栈中弹出X
				a=*(++current);                                       
				cout<<sign->s<<setw(13+strlen(current))<<current<<endl;
			}
			else
			{	 
				cout<<"此句子不符合该文法!";
				break;
			 }
		}
		else if((x=='E')||(x=='P')||(x=='T')||(x=='Q')||(x=='F'))  //else  X是非终结符号
		{
			iA=index(x);ia=index(a);
			if((iA==6)||(ia==6))
			{
				cout<<"此句子不符合该文法!"<<endl;break;
			}
			len=strlen(M[iA][ia]);left=x;right=M[iA][ia];
			if((len==1)&&(M[iA][ia][0]=='e'))
			{
				sign->s[sign->top]='\0';
				sign->top-=1;                                   //从栈中弹出X
				right="ε";   
			}
			else if((len==1)&&(M[iA][ia][0]=='$'))
			{
				cout<<"此句子不符合该文法!";
				break;
			}
			else 
			{
				top=sign->top;
				for(int j=len-1;j>=0;j--)
					sign->s[top++]=M[iA][ia][j];                //压入栈
				sign->s[top]='\0';              
				sign->top=top-1; 
			}
			cout.setf(ios::left);
			cout<<sign->s<<setw(16)<<current<<left<<"→"<<right<<endl;      //输出产生式
		}
	}
	if(flag==false)                                    
		cout<<"\n分析成功结束!\n\n";
}

⌨️ 快捷键说明

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