编译原理—实验四 LL(1)语法分析(三)

版权声明:欢迎转载 https://blog.csdn.net/wl1780852311/article/details/90054573

实验四 LL(1)语法分析(三)(2学时)
一、实验目的
1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题。
2. 复习高级语言及线性表、栈、图等典型数据结构,进一步加强用高级语言来解决实际问题的能力。
二、实验内容
将实验三编写的程序的基础之上,实现下面的功能:
按照教材5.2节算法,求出各个产生式的select集(预测分析表),并采用适当的数据结构存储,并在屏幕上显示结果。
算法描述:
求某产生式的select集
扫描产生式的右部,分为下面几种情况:
(1)若是终结符,则将该终结符加入该产生式的select集,扫描下一个产生式;
(2)若是“ε”,将左部非终结符的follow集加入该产生式的select集;
(3)若是非终结符,将该非终结符的 first集— {ε} 加入该产生式的select集,然后检查该非终结符是否可以推出空,若可以为空,则扫描本产生式的下一符号;
若是“\0”,则将该产生式的左部非终结符的follow集加入该产生式的select集。

#include<bits/stdc++.h>
using namespace std;
int zjf(char c)
{
	if(c>='A'&&c<='Z')
	{
		return 0;
	}
	else if(c=='@')
	{
		return 0;
	}
	else if(c==','||c=='.'||c==':'||c=='?')
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
int main()
{
	int biaoji;
	//-->@
	map<char,int>X;
	X['S']=1;
	X['A']=1;
	X['B']=1;
	X['C']=0;
	X['D']=0;
	//FIRST
	map<char,set<char> > first;
	first['S'].insert('b');
	first['S'].insert('a');
	first['S'].insert('*');
	first['A'].insert('b');
	first['A'].insert('*');
	first['B'].insert('a');
	first['B'].insert('*');
	first['C'].insert('b');
	first['C'].insert('a');
	first['C'].insert('c');
	first['D'].insert('a');
	first['D'].insert('c');
	//follow
	map<char,set<char> > follow;
	follow['S'].insert('#');
	follow['A'].insert('#');
	follow['A'].insert('a');
	follow['A'].insert('c');
	follow['B'].insert('#');
	follow['C'].insert('#');
	follow['D'].insert('#');
	map<string,set<char> > select;
	int n;
	cout<<"输入文法产生式的个数(<=50):";
	cin>>n;
	string s[51];
	cout<<"输入各产生式(每行一条,空用'@'表示):"<<endl;
	for(int i=0; i<n; i++)
	{
		cout<<"("<<i+1<<"):";
		cin>>s[i];
	}
	for(int i=0; i<n; i++)
	{
		for(int j=3; j<s[i].size(); j++)
		{
			biaoji=0;
			if(zjf(s[i][j]))
			{
				select[s[i]].insert(s[i][j]);
				break;
			}
			if(s[i][j]=='@')
			{
				select[s[i]].insert(follow[s[i][0]].begin(),follow[s[i][0]].end());
			}
			if(zjf(s[i][j])==0)
			{
				set<char>::iterator it;
				for(it = first[s[i][j]].begin(); it!=first[s[i][j]].end(); it++)
				{
					if(*it!='*')
						select[s[i]].insert(*it);
				}
				if(X[s[i][j]])
				{
					biaoji=j;
				}
			}
			if(biaoji==s[i].size()-1)
			{
				select[s[i]].insert(follow[s[i][0]].begin(),follow[s[i][0]].end());
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		cout<<"SELECT("<<s[i]<<")={ ";
		set<char>::iterator it;
		for(it = select[s[i]].begin(); it!=select[s[i]].end(); it++)
		{
			cout<<*it<<" ";
		}
		cout<<"}"<<endl;
	} 
}

猜你喜欢

转载自blog.csdn.net/wl1780852311/article/details/90054573
今日推荐