LL1源码Word文档格式.docx
- 文档编号:6636945
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:25
- 大小:18.94KB
LL1源码Word文档格式.docx
《LL1源码Word文档格式.docx》由会员分享,可在线阅读,更多相关《LL1源码Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
EERRORERROR0ERROR0ERROR
A1ERRORERROR2ERROR2
TERRORERROR3ERROR3ERROR
B54ERROR5ERROR5
FERRORERROR6ERROR7ERROR
三.源码
/*
LL
(1)预测分析表的构造,空字用符号~表示
Thisprocedureiswrittenbyfanxiangchao.
*/
#include<
stdio.h>
string.h>
stdlib.h>
ctype.h>
malloc.h>
#defineFALSE0
#defineTRUE1
#defineMAX100
#defineNULL0
#defineERROR-1
/***********************定义结构体*********************************/
//1.定义非终结符的结构体
structno_terminal_sign
{
charno_ter;
//非终结符
charfirst[MAX];
//非终结符的first集合
charfollow[MAX];
//非终结符的follow集合
};
//2.定义候选式的结构体
structcandidate_formular
charcandidate[MAX];
//候选式串
//候选式的first集合
//3.定义产生式的结构体
typedefstructproduce
charleft;
//产生式左部
charright[MAX];
//产生式右部
}chanshengshi;
//4.定义终结符的结构体
structterminal_sign
charter;
//终结符
//终结符的first集合
/******************************************************************/
//函数定义
intis_include(char*a,charb)//一个终结符属于某个集合
inti;
for(i=0;
a[i]!
='
\0'
;
i++)
if(b==a[i])
returnTRUE;
returnFALSE;
}
voidadd_ter(char*a,charsign)//向一个集合中添加一个终结符
intlength;
if(!
is_include(a,sign)){
length=strlen(a);
a[length]=sign;
a[length+1]='
}
voidadd_ter_to_first(structno_terminal_sign*a,charsign)//向一个终结符的first集合中添加一个终结符
is_include(a->
first,sign)){
length=strlen(a->
first);
a->
first[length]=sign;
first[length+1]='
voidadd_ter_to_candidate_first(structcandidate_formular*a,charsign)//向一个候选式的first集合中添加一个终结符
length=strlen(a->
voidadd_ter_to_follow(structno_terminal_sign*a,charsign)//向一个终结符的follow集合中添加一个终结符
follow,sign)){
follow);
follow[length]=sign;
a->
follow[length+1]='
intis_terminal(charsign,structterminal_sign*a)//判断一个符号是终结符还是非终结符
structterminal_sign*p;
if(sign=='
~'
)return-1;
for(p=a;
p->
ter!
=NULL;
p++)
if(p->
ter==sign)
intis_include_null(structno_terminal_sign*a)//判断一个非终结符的first集合中包含空字
a->
first[i]!
if(a->
first[i]=='
)
voidsubtract_null(char*a)//将一个集合减去空字
inti,mark;
if(a[i]=='
break;
mark=i;
for(i=mark;
i<
(signed)strlen(a);
a[i]=a[i+1];
voidmerge_to_first(structno_terminal_sign*a,char*b)//将集合b添加到非终结符的first集合a中
inti,n;
n=strlen(a->
b[i]!
if(!
first,b[i]))
a->
first[n++]=b[i];
first[n]='
voidmerge_to_candidate_first(structcandidate_formular*a,char*b)//将集合b添加到候选式的first集合a中
voidmerge_to_follow(structno_terminal_sign*a,char*b)//将集合b添加到非终结符的first集合a中
follow,b[i]))
follow[n++]=b[i];
follow[n]='
structno_terminal_sign*search_by_sign(charsign,structno_terminal_sign*a)//根据一个非终结符找到对应的结构体
structno_terminal_sign*p;
no_ter!
no_ter==sign)
returnp;
returnNULL;
intsum_first(structno_terminal_sign*a)//所有first集合元素的和
intsum=0;
structno_terminal_sign*p;
sum+=strlen(p->
returnsum;
intsum_follow(structno_terminal_sign*a)//所有follow集合元素的和
structcandidate_formular*search_by_string(char*a,structcandidate_formular*b)//根据产生式右部找到候选式的结构体
structcandidate_formular*p;
for(p=b;
candidate!
p++)
if(strcmp(p->
candidate,a)==0)
inttotal_ter(structterminal_sign*a)//终结符的个数
structterminal_sign*p;
intn=0;
n++;
returnn;
inttotal_no_ter(structno_terminal_sign*a)//非终结符的个数
//1.非终结符first集合的构造
voidno_ter_first_create(chanshengshi*formular,structno_terminal_sign*no_terminal,structterminal_sign*terminal)
chanshengshi*p;
intn,i;
structno_terminal_sign*q;
chartemp[MAX]="
"
//临时数组变量
for(p=formular;
left!
{
n=0;
q=search_by_sign(p->
left,no_terminal);
//根据产生式左部找到对应的非终结符结构体
right,"
~"
)==0)//如果产生式右部为空字
continue;
structno_terminal_sign*r;
for(i=0;
right[i]!
{
if(!
is_terminal(p->
right[i],terminal))
{
r=search_by_sign(p->
right[i],no_terminal);
//根据非终结符找到对应的非终结符结构体
if(is_include_null(r))
n++;
elsebreak;
}
elsebreak;
}
n;
r=search_by_sign(p->
strcpy(temp,"
);
//临时数组变量赋空串
strcpy(temp,r->
subtract_null(temp);
//减空字
merge_to_first(q,temp);
//将所有非空元素加入左部非终结符的first
if(n>
=(signed)strlen(p->
right))
add_ter_to_first(q,'
else
if(is_terminal(p->
right[n],terminal))
add_ter_to_first(q,p->
right[n]);
else{
right[n],no_terminal);
merge_to_first(q,r->
//将所有元素加入左部非终结符的first(已确定不含空字)
//2.候选式first集合的构造
voidcandidate_first_create(chanshengshi*formular,structno_terminal_sign*no_terminal,structterminal_sign*terminal,structcandidate_formular*candi)
intn=0,i;
chartemp[MAX];
chanshengshi*p;
structcandidate_formular*q;
structno_terminal_sign*r;
p++){
q=search_by_string(p->
right,candi);
i++){
right[i],terminal)){
else
break;
}else
break;
merge_to_candidate_first(q,temp);
//将所有非空元素加入到候选式的first
right)){
add_ter_to_candidate_first(q,'
}else{
add_ter_to_candidate_first(q,p->
merge_to_candidate_first(q,r->
//3.非终结符follow集合的构造
voidno_ter_follow_create(chanshengshi*formular,structno_terminal_sign*no_terminal,structterminal_sign*terminal,structcandidate_formular*candi)
structno_terminal_sign*q,*r,*s;
(signed)strlen(p->
right)-1;
//根据非终结符找到对应的非终结符结构体r,即当前需要求follow集合的非终结符
intn=i+1;
//记录当前非终结符的标号
for(intj=i+1;
j<
right);
j++){
if(!
right[j],terminal)){
s=search_by_sign(p->
right[j],no_terminal);
if(is_include_null(s))
n++;
else
break;
}else
break;
}
for(j=i+1;
s=search_by_sign(p->
strcpy(temp,"
strcpy(temp,s->
subtract_null(temp);
merge_to_follow(r,temp);
//将所有非空元素加入当前非终结符的follow集合
}
//如果当前非终结符后面的符号都含空字,则将左部非终结符的follow加入到该终结符的follow集合
if(n>
{
merge_to_follow(r,q->
}else
if(is_terminal(p->
add_ter_to_follow(r,p->
else{
merge_to_follow(r,s->
//将所有元素加入当前非终结符的follow
}
//如果右部的最后一个字符是非终结符,则将左部的follow加到该非终结符的follow
merge_to_follow(r,q->
//主函数
voidmain()
//构造一个预测分析表,一个二维数组,行代表非终结符序号,列代表非结符序号
intanalysis[MAX][MAX];
//定义非终结符集
structno_terminal_signno_terminal[MAX];
//定义终结符集
structterminal_signterminal[MAX];
//定义开始符号
charstart_sign;
//定义产生式集合
chanshengshiformular[MAX];
structcandidate_formularcandi[MAX];
intt1,t2,i,j;
/**********************************************************************/
//读取存放产生式的文件
FILE*in;
if((in=fopen("
chanshengshi.txt"
"
r"
))==NULL){
printf("
cannotopenfile!
\n"
return;
charsign;
intno_ter_num=0,ter_num=0,chanshengshi_num=0,candidate_num=0;
sign=fgetc(in);
start_sign=sign;
//读取的第一个符号为开始符号
rewind(in);
//文件指针重新回到文件头部
//产生式添加并赋初值
while(fscanf(in,"
%s"
temp)!
=-1)
formular[chanshengshi_num].left=temp[0];
strcpy(formular[chanshengshi_num].right,temp+3);
chanshengshi_num++;
formular[chanshengshi_num].left=NULL;
strcpy(formular[chanshengshi_num].right,"
//非终结符和终结符添加并赋初值
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LL1 源码