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

📄 ll1.cpp

📁 LL(1)分析法 1、LL(1)分析法的功能 LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表
💻 CPP
字号:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
# define SIZE 40

/*int char_num(char ch)
{
	switch(ch)
	{
	case '+':return 0;
	case '-':return 1;
	case '*':return 2;
	case '/':return 3;
	case '(':return 4;
	case ')':return 5;
	case 'i':return 6;
	case '#':return 7;
	
	default :return -1;
	}
}
int expression_num(char ch)
{
	switch(ch)
	{

	case 'E':return 0;
	case 'T':return 1;
	case 'G':return 2;
	case 'F':return 3;
	case 'S':return 4;
	default :return -1;
	}
}*/

int char_num(char ch)
{
	switch(ch)
	{
	case 'i':return 0;
	case '+':return 1;
	case '*':return 2;
	case '(':return 3;
	case ')':return 4;
	case '#':return 5;
	default :return -1;
	}
}
int expression_num(char ch)
{
	switch(ch)
	{
	case 'E':return 0;
	case 'G':return 1;
	case 'T':return 2;
	case 'S':return 3;
	case 'F':return 4;
	default :return -1;
	}
}
struct anay_str {
	char *str;
};

struct analysis_stack {
	char *base;
	char *top;
	int stacksize;
};

char Pop(analysis_stack& S)
{
	if(S.base==S.top) cout<<"字符栈为空,不能输出";
	char x=*(--S.top);
	//cout<<"出栈字符为"<<x<<endl;
	return x;
}
void InitStack_stack(analysis_stack& S)
{
	S.base=(char *)malloc(SIZE *sizeof(char));
	if(!S.base) {
		cout<<"errer abc"<<endl;
        exit(1);
	}
	S.top=S.base;
	S.stacksize=40;
}

void Push(analysis_stack& S,char e)
{
	*S.top++=e;
	//cout<<e<<"已经被放入字符栈中"<<endl;
}

void out_string(char* ch,int n)
{
	while(ch[n])
	{
		cout<<ch[n];
		n++;
	}
}

void out_stack(analysis_stack& S)
{
	int i=0;
	while((S.base+i)!=S.top)
	{
		cout<<*(S.base+i);
		i++;
	}
}
void main()
{
	analysis_stack m;
	InitStack_stack(m);
	int len=0,num1,num2; 
	/*struct anay_str store[5][8]={{{""},{""},{""},{""},{"TG"},{""},{"TG"}},
	{{""},{""},{""},{""},{"FS"},{""},{"FS"}},
	{{"+TG"},{"-TG"},{""},{""},{""},{"e"},{""},{"e"}},
	{{""},{""},{""},{""},{"(E)"},{""},{"i"}},
	{{"e"},{"e"},{"*FS"},{"/FS"},{""},{"e"},{""},{"e"}},
	};*/

	struct anay_str store[5][6]={{{"TG"},{""},{""},{"TG"}},
	{{""},{"+TG"},{""},{""},{"e"},{"e"}},
	{{"FS"},{""},{""},{"FS"}},
	{{""},{"e"},{"*FS"},{""},{"e"},{"e"}},
	{{"i"},{""},{""},{"(E)"}},
	};

	char* In_putstr;
	In_putstr="i+i*i#";
	cout<<In_putstr<<endl;

	int j=0,k=1;

	*m.top++='#';
	*m.top++='E';

	cout<<"步骤 	    分析栈 	        剩余输入串 	       所用产生式 \n";
	while(*(m.top-1)!='#'||In_putstr[j]!='#')
	{	
		cout<<"\n"<<k++<<"\t\t";
		out_stack(m);
		cout<<"\t\t";
		out_string(In_putstr,j);
		cout<<"\t\t\t";
			
		if(!(expression_num(*(m.top-1))||char_num(*(m.top-1)))||char_num(In_putstr[j])==-1)/////////////////////////////////////////////////////
		{
			cout<<"输入的输入串有错误"<<endl;
			break;
		}
		else 
		{	
			if(char_num(*(m.top-1))>=0)
			{
				if(*(m.top-1)==In_putstr[j])
				{
			    	Pop(m);
			        cout<<"\""<<In_putstr[j]<<"\""<<"匹配";
				    j++;
				    continue;
				}
				else
				{
					cout<<"匹配错误"<<endl;
					break;
				}
			}
			else
			{
			   len=strlen(store[expression_num(*(m.top-1))][char_num(In_putstr[j])].str);
			   cout<<Pop(m)<<"-->"<<store[expression_num(*(m.top-1))][char_num(In_putstr[j])].str;
			   num1=expression_num(*(m.top));
			   num2=char_num(In_putstr[j]);
			   for(int i=len-1;i>=0;i--)  ///////////////////////
				   Push(m,store[num1][num2].str[i]);
			   
			
			  if(*(m.top-1)=='e')
			  {
				Pop(m);
				continue;
			  }    
			}
		}
	}
	if(*(m.top-1)=='#'&&In_putstr[j]=='#')
	{
		cout<<endl;
		cout<<k<<"\t\t"<<'#'<<"\t\t"<<'#'<<"\t\t\t"<<"接受\n";

		cout<<"恭喜,语句分析成功\n";
	}
	else 
		cout<<"语句分析失败";
}

⌨️ 快捷键说明

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