【编译原理算符优先矩阵的构造】算符优先法中算符优先矩阵的构造需要求出firstTerm以及lastTerm,由于这个是在预测分析法上进行修改的,结构体的定义并未进行修改,其中包含该非终结符a以及其对应的first(即为firstTerm)和follow(即为lastTerm),输入格式如下(以#结束输入)
Z::=E
E::=T|E+T
T::=F|T*F
F::=(E)|i
#
#include
using namespace std;
//判断终结符和非终结符 返回1是非终结符 返回0是终结符
int Norterminal(char c)
{
if(c>='A'&&c<='Z')
return 1;
else if(c!=':'&&c!='='&&c!='<'&&c!='>'&&c!=' '&&c!='|')
return 0;
}
struct GRAM
{
//$代表空
stringa;
string first;
string follow;
};
struct LIST
{
int num;
string s;
};
int main()
{
GRAM gram[50];
string grammer;
cout<<"请输入文法(以#结束)"< strN;
cin>>grammer;
//输入规则
strN.push_back(grammer);
char str[10][80];
const char *ch = "|";
char *result;
vector strN1;
//存处理过“|”规则的 for(int i=0;
i>grammer;
strN.push_back(grammer);
/*处理转换的规则形式输入部分*/
for(int h=0;
h=0;
i--)
{
for(unsigned l=0;
l1;
l++)
{
if(gram[l].a[0]==strN1[i][0])
{
for(unsigned h=0;
h1;
h++)
{
if(strN1[i][4]==gram[h].a[0]&&strN1[i][4]!=strN1[i][0])
{gram[l].first+=gram[h].first;
string ustr(gram[l].first);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
gram[l].first=ustr;
break;
}
}
}
}}
cout<<"firstTerm集合为:"<=0;
i++)
{if(strN1[i].find("::")==-1)
{
string add="";
add=add+strN1[i-1][0]+"::="+strN1[i];
strN1[i]=add;
}
cout*获取lastTerm*/
//直接获取lastTerm
for(int i=0;
i=0;
i--)
{
for(unsigned l=0;
l1;
l++)
{
if(gram[l].a[0]==strN1[i][0])
{
for(unsigned h=0;
h1;
h++)
{
int k=strN1[i].length();
if(Norterminal(strN1[i][k-1]))
{for(unsigned h1=0;
h11;
h1++)
if(gram[h1].a[0]==strN1[i][k-1])
{
gram[l].follow+=gram[h1].follow;
string ustr(gram[l].follow);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
gram[l].follow=ustr;
break;
}}
}
}
}}
cout<<"lastTerm集合为:"<=0;
i--)
{
for(int k=0;
k1if(Norterminal(strN1[i][k]))
{
if(!Norterminal(strN1[i][k-1])&&!Norterminal(strN1[i][k+1]))
{
cout<1]<1]<"<<"|";
}
cout<
运行结果如下:
文章图片