LL(1)语法分析程序实验报告Word文件下载.doc
《LL(1)语法分析程序实验报告Word文件下载.doc》由会员分享,可在线阅读,更多相关《LL(1)语法分析程序实验报告Word文件下载.doc(21页珍藏版)》请在冰豆网上搜索。
作者:
龚勋刘栋罗晓波
学号:
200131500342200131500350200131500351
计科系13班
********************************************/
#include<
stdlib.h>
stdio.h>
string.h>
/*******************************************/
intcount=0;
/*分解的产生式的个数*/
intnumber;
/*所有终结符和非终结符的总数*/
charstart;
/*开始符号*/
chartermin[50];
/*终结符号*/
charnon_ter[50];
/*非终结符号*/
charv[50];
/*所有符号*/
charleft[50];
/*左部*/
charright[50][50];
/*右部*/
charfirst[50][50],follow[50][50];
/*各产生式右部的FIRST和左部的FOLLOW集合*/
charfirst1[50][50];
/*所有单个符号的FIRST集合*/
charselect[50][50];
/*各单个产生式的SELECT集合*/
charf[50],F[50];
/*记录各符号的FIRST和FOLLOW是否已求过*/
charempty[20];
/*记录可直接推出^的符号*/
charTEMP[50];
/*求FOLLOW时存放某一符号串的FIRST集合*/
intvalidity=1;
/*表示输入文法是否有效*/
intll=1;
/*表示输入文法是否为LL
(1)文法*/
intM[20][20];
/*分析表*/
charchoose;
/*用户输入时使用*/
charempt[20];
/*求_emp()时使用*/
charfo[20];
/*求FOLLOW集合时使用*/
判断一个字符是否在指定字符串中
intin(charc,char*p)
{
inti;
if(strlen(p)==0)
return(0);
for(i=0;
;
i++)
{
if(p[i]==c)
return
(1);
/*若在,返回1*/
if(i==strlen(p))
return(0);
/*若不在,返回0*/
}
}
得到一个不是非终结符的符号
charc()
charc='
A'
while(in(c,non_ter)==1)
c++;
return(c);
分解含有左递归的产生式
voidrecur(char*point)
{/*完整的产生式在point[]中*/
intj,m=0,n=3,k;
chartemp[20],ch;
ch=c();
/*得到一个非终结符*/
k=strlen(non_ter);
non_ter[k]=ch;
non_ter[k+1]='
\0'
for(j=0;
j<
=strlen(point)-1;
j++)
if(point[n]==point[0])
{/*如果‘|’后的首符号和左部相同*/
for(j=n+1;
{
while(point[j]!
='
|'
&
point[j]!
)
temp[m++]=point[j++];
left[count]=ch;
memcpy(right[count],temp,m);
right[count][m]=ch;
right[count][m+1]='
m=0;
count++;
if(point[j]=='
{
n=j+1;
break;
}
}
}
else
{/*如果‘|’后的首符号和左部不同*/
left[count]=ch;
right[count][0]='
^'
right[count][1]='
count++;
for(j=n;
if(point[j]!
temp[m++]=point[j];
else
left[count]=point[0];
memcpy(right[count],temp,m);
right[count][m]=ch;
right[count][m+1]='
printf("
count=%d"
count);
m=0;
count++;
left[count]=point[0];
memcpy(right[count],temp,m);
right[count][m]=ch;
right[count][m+1]='
m=0;
分解不含有左递归的产生式
voidnon_re(char*point)
intm=0,j;
chartemp[20];
for(j=3;
{
if(point[j]!
temp[m++]=point[j];
{
left[count]=point[0];
right[count][m]='
m=0;
left[count]=point[0];
memcpy(right[count],temp,m);
right[count][m]='
count++;
m=0;
读入一个文法
chargrammer(char*t,char*n,char*left,charright[50][50])
charvn[50],vt[50];
chars;
charp[50][50];
inti,j,k;
printf("
\n请输入文法的非终结符号串:
"
);
scanf("
%s"
vn);
getchar();
i=strlen(vn);
memcpy(n,vn,i);
n[i]='
请输入文法的终结符号串:
vt);
i=strlen(vt);
memcpy(t,vt,i);
t[i]='
printf("
请输入文法的开始符号:
scanf("
%c"
&
s);
请输入文法产生式的条数:
%d"
i);
for(j=1;
=i;
printf("
请输入文法的第%d条(共%d条)产生式:
j,i);
scanf("
p[j-1]);
getchar();
for(j=0;
=i-1;
if(p[j][1]!
-'
||p[j][2]!
>
'
{ printf("
\ninputerror!
validity=0;
return('
}/*检测输入错误*/
for(k=0;
k<
k++)
{/*分解输入的各产生式*/
if(p[k][3]==p[k][0])
recur(p[k]);
non_re(p[k]);
return(s);
将单个符号或符号串并入另一符号串
******************************