编译原理词法分析语法分析实验报告 联系客服

发布时间 : 星期六 文章编译原理词法分析语法分析实验报告更新完毕开始阅读e815a240148884868762caaedd3383c4bb4cb417

本文档如对你有帮助,请帮忙下载支持!

char p[50][50]; int i,j,k;

printf(\请输入文法的非终结符号串:\getchar();

scanf(\ i=strlen(vn); memcpy(n,vn,i);

n[i]='\\0';

printf(\请输入文法的终结符号串:\getchar();

scanf(\ i=strlen(vt); memcpy(t,vt,i);

t[i]='\\0'; scanf(\getchar();

printf(\请输入文法产生式的条数:\getchar(); { }

if(p[j][1]!='-'||p[j][2]!='>') {

printf(\return('\\0'); validity=0;

printf(\请输入文法的第%d条(共%d条)产生式:\scanf(\

printf(\请输入文法的开始符号:\

scanf(\ for(j=1;j<=i;j++)

getchar(); for(j=0;j<=i-1;j++)

} /*检测输入错误*/ for(k=0;k<=i-1;k++)

{ /*分解输入的各产生式*/ if(p[k][3]==p[k][0]) recur(p[k]); }

/******************************************* 将单个符号或符号串并入另一符号串

********************************************/

} return(s);

else

non_re(p[k]);

本文档如对你有帮助,请帮忙下载支持!

void merge(char *d,char *s,int type)

{ /*d是目标符号串,s是源串,type=1,源串中的‘ ^ ’一并并入目串; }

/******************************************* 求所有能直接推出^的符号

********************************************/ void emp(char c)

{ /*即求所有由‘ ^ ’推出的符号*/ }

/******************************************* 求某一符号能否推出‘ ^ ’

char temp[10]; int i;

for(i=0;i<=count-1;i++) { }

if(right[i][0]==c&&strlen(right[i])==1) { }

temp[0]=left[i]; temp[1]='\\0'; merge(empty,temp,1); emp(left[i]);

type=2,源串中的‘ ^ ’不并入目串*/ for(i=0;i<=strlen(s)-1;i++) { }

else { }

for(j=0;;j++) {

if(j

break; {

d[j]=s[i]; d[j+1]='\\0'; break; } ;

int i,j;

if(type==2&&s[i]=='^')

if(j==strlen(d))

本文档如对你有帮助,请帮忙下载支持!

********************************************/ int _emp(char c)

{ /*若能推出,返回1;否则,返回0*/

int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\\0'; merge(empt,temp,1); if(in(c,empty)==1) {

if(i==count)

if(left[i]==c) /*找一个左部为c的产生式*/ {

if(j==1&&in(right[i][0],empty)==1) return(1);

else if(j==1&&in(right[i][0],termin)==1) else {

return(0);

return(1); for(i=0;;i++)

return(0);

j=strlen(right[i]); /*j为右部的长度*/

for(k=0;k<=j-1;k++)

if(in(right[i][k],empt)==1)

}

}

continue; return(1);

else }

for(k=0;k<=j-1;k++) { }

result*=_emp(right[i][k]); temp[0]=right[i][k]; temp[1]='\\0'; merge(empt,temp,1);

mark=1;

if(mark==1)

continue;

{

if(result==0&&i

本文档如对你有帮助,请帮忙下载支持!

}

/******************************************* 判断读入的文法是否正确

********************************************/ int judge() { int i,j; }

/******************************************* 求单个符号的FIRST

********************************************/ void first2(int i)

{ /*i为符号在所有输入符号中的序号*/ char c,temp[20];

int j,k,m; c=v[i]; char ch='^'; emp(ch);

if(in(c,termin)==1) /*若为终结符*/ for(i=0;i<=count-1;i++) { } return(1);

if(in(left[i],non_ter)==0)

{ /*若左部不在非终结符中,报错*/ }

for(j=0;j<=strlen(right[i])-1;j++) { }

if(in(right[i][j],non_ter)==0&&in(right[i][j],termin)==0&&right[i][j]!='^')

{ /*若右部某一符号不在非终结符、终结符中且不为‘ ^ ’,报错*/ }

printf(\validity=0; return(0); printf(\validity=0; return(0);

}

{

first1[i][0]=c;

first1[i][1]='\\0'; }

else if(in(c,non_ter)==1) /*若为非终结符*/