Chomsky文法类型判断及消除文法的左递归
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Chomsky文法类型判断及消除文法的左递归
2008-12-05 22:13
//Chomsky文法类型判断
#include
#include
using namespace std;
#define MAXS 50
int NONE=1;
int RELEFT=1;
string strings,noend,end;
int N;
struct STR
{
string left;
string right;
};
//输出四元组
void print(STR *p)
{
int i;
cout< for(i=0;i cout< "< } //求VN和VT void VNVT(STR *p) { int i,j; for(i=0;i { for(j=0;j<(int)p[i].left.length();j++) { if((p[i].left[j]>='A'&&p[i].left[j]<='Z')) { if(noend.find(p[i].left[j])>100) noend+=p[i].left[j]; } else if(end.find(p[i].left[j])>100) end+=p[i].left[j]; } } for(j=0;j<(int)p[i].right.length();j++) { if(!(p[i].right[j]>='A'&&p[i].right[j]<='Z')) { if(end.find(p[i].right[j])>100) end+=p[i].right[j]; } else { if(noend.find(p[i].right[j])>100) noend+=p[i].right[j]; } } } } //删除无用产生式 void useless(STR *p) { int i,j,k; string vn; vn+=p[0].left; for(j=0;j for(i=0;i { if(noend==vn) return; else if(p[i].left[0]==vn[j]) for(k=0;k if(p[i].right[k]>='A'&&p[i].right[k]<='Z'&&vn.find(p[i].right[ k])>100) vn+=p[i].right[k]; } //cout< for(j=0;j if(vn.find(noend[j])>100) { for(i=0;i if(p[i].left[0]==noend[j]) cout< for(k=i;k p[k]=p[k+1]; N--; } } } //新非终结符 char getnew(char vn) { int i; for(i=0;i<26;i++) { if(vn=='Z') vn='A'-1; vn=vn+1; if(noend.find(vn)>100) { noend+=vn; break; } } return vn; } //消除直接左递归 void releft(STR *p,int i) { int j,k; char c; for(j=0;j if((p[j].left[0]==noend[i])&&(p[j].left[0]==p[j].right[0])) { RELEFT=0; c=getnew(noend[i]); for(k=0;k if((p[k].left[0]==noend[i])&&(p[k].right[0]!=p[k].left[0])) p[k].right+=c; p[j].left[0]=c; p[j].right=p[j].right.erase(0,1); p[j].right+=c; p[N].left=p[j].left; p[N].right="#"; N++; } } //消除间接左递归 int rreleft(STR *p) { int i,j,k,m,s; VNVT(p); for(i=0;i if((p[i].left[0]==p[i].right[0])&&p[i].right.length()==1) for(j=0;j if((p[j].left[0]==p[i].left[0])&&p[j].right[0]=='#') return 0; for(i=0;i { for(j=0;j<=i-1;j++) for(k=0;k if((p[k].left[0]==noend[i])&&(p[k].right[0]==noend[j])) { //cout< "< if(p[m].left[0]==noend[j]) { p[N]=p[k]; p[N].right.replace(0,1,p[m].right); //cout< "< } for(s=k;s p[s]=p[s+1]; N--; /*cout<<"N="< for(s=0;s cout< "< cout<<"************"< } releft(p,i); /*for(s=0;s cout< "< cout<<"************"< }