正规文法转换成正规式(C++)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <iostream>
#include <set>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
multimap<char, string> production;
set<char> unFinal;
set<char> final;
char S;
void Input()
{
char ch;
string str;
cout<<"非终结符(以0 结尾):";
while(cin>>ch && ch!='0')
unFinal.insert(ch);
cout<<"终结符(以F 结尾):";
while(cin>>ch && ch!='F')
final.insert(ch);
cout<<"开始符: ";
cin>>S;
cout<<"产生式(以0 0 结尾):"<<endl;
while(cin>>ch>>str && ch!='0')
production.insert(make_pair(ch, str));
}
string solve(char ch)
{
string str("(");
string re("");
string ch_1[8];
string str1[8],str2[8];
int len,i,j,flag=10,strlen,sslen,lslen,num=0;
multimap<char, string>::iterator iter = production.find(ch);
int n = production.count(ch);
for(i=0; i<n; i++, ++iter)
{
len=iter->second.size();
str1[i].append(iter->second);
str2[i]=str1[i];
str2[i].replace(1,1,"|");
ch_1[i]=iter->second.substr(len-1);
}
for(i=0; i<n; i++)
if(ch_1[i]>="A"&&ch_1[i]<="Z")
{
for( j=i+1;j<n;j++)
if(ch_1[i]==ch_1[j])
{
flag=i;
str.push_back('(');
str.append(str2[i].substr(0));
str.append(str2[j].substr(0));
for( ;j<n;j++)
{
str1[j].assign(str1[j+1]);
ch_1[j].assign(ch_1[j+1]);
}
}
if(i==flag)
{
strlen=str.size();
str.replace(strlen-1,1,")");
str.append(ch_1[i]);
str.push_back('|');
}
else
{
str.append(str1[i].substr(0));
if(n>=2)//相同左部产生式个数大于等于2个时,才输出"|"
str.push_back('|');
}
}
sslen=str.size();
for(i=0; i<n; i++)
if(ch_1[i]<"A"||ch_1[i]>"Z")
num++;
if(num>=2)
str.push_back('(');
for(i=0; i<n; i++)
if(ch_1[i]<"A"||ch_1[i]>"Z")
{
str.append(ch_1[i]);
if(i!=n-1)
str.push_back('|');
}
if(num>=2)
str.push_back(')');
lslen=str.size();
for(int i=0; i<str.size(); i++)
{
if(unFinal.find(str[i])!=unFinal.end()) //str[i]是非终结符if(str[i] != ch)
{ //是其他非终结符
re = solve(str[i]);
str.replace(i, 1, re);
i += re.size()-1; //下标后移Notice!
}
else
{//此非终结符就是ch
str.replace(i, 1, "*");
str.replace(sslen-1,lslen-sslen+1,str.substr(sslen));
}
}
str.push_back(')');
return str;
}
int main()
{
Input();
cout<<endl<<"输出正规式:";
string str = solve(S);
cout<<str;
cout<<endl<<endl;
system("pause");
return 0; }。

相关文档
最新文档