版权声明:欢迎转载 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;
}
}