Chomsky文法类型判断及消除文法的左递归

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<<"************"<

}

相关文档
最新文档