LL1文法语法分析编译原理课程设计Word文档格式.docx
《LL1文法语法分析编译原理课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《LL1文法语法分析编译原理课程设计Word文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
2.2程序流程图
3系统实现
3.1上机编程(出于篇幅考虑,此处仅列出核心语法分析代码)
#include<
stdio.h>
stdlib.h>
string.h>
#definemaxlen13
#defineidle5//用来代表"
ε"
的字符
//***************产生式****************
structFl_Node;
typedefstructFl_Node*Fl_PNode;
structFl_Node
{//存储FIRST集与FoLLOW集的终结符
charinfo;
Fl_PNodelink;
};
structJo_F_Node;
typedefstructJo_F_Node*Jo_F_PNode;
structJo_F_Node
{//存储FIRST集与FoLLOW集的结点(非终结符)
Jo_F_PNodelink;
charF;
Fl_PNodenext;
structLinkF_F
{//存储FIRST集与FoLLOW集的头
Jo_F_PNodeknot;
typedefstructLinkF_F*PLinkF_F;
structPr_Node;
typedefstructPr_Node*Pr_PNode;
structPr_Node
{//存储产生式
charhead;
//超能力存储这是个大问题,用到静态存储时,一定要给它分配足够的空间
charinfo[maxlen+1];
//为什么在这里我只定义了9个,在底下它却具有存储11个的能力
Fl_PNodefl;
Pr_PNodelink;
structJo_P_Node;
typedefstructJo_P_Node*Jo_P_PNode;
structJo_P_Node
{//存储产生式的结点
Jo_P_PNodelink;
shortnum;
Pr_PNodenext;
structLinkLead
{//产生式结点的头部
Jo_P_PNodeknot;
typedefstructLinkLead*PLinkLead;
//*************************************
//****************队列*****************
structQ_Node;
typedefstructQ_Node*Q_PNode;
structQ_Node
{
Q_PNodelink;
structLinkQueue
Q_PNodef;
Q_PNoder;
typedefstructLinkQueue*PLinkQueue;
//****************堆栈*****************
structS_Node;
typedefstructS_Node*S_PNode;
structS_Node
S_PNodelink;
structLinkStack
S_PNodetop;
typedefstructLinkStack*PLinkStack;
//****************表格*****************
structT_Node;
typedefstructT_Node*T_PNode;
structT_Node
charrow;
charcolumn;
charinfo[maxlen];
T_PNodedown;
T_PNoderight;
structLinkTable
T_PNodetab;
typedefstructLinkTable*PLinkTable;
booljudgeQueue_link(PLinkQueueplqu,charx)
{//判断字符x有无在队列plqu中
Q_PNodep;
p=plqu->
f;
while(p)
{
if(p->
info==x)
returntrue;
p=p->
link;
}
returnfalse;
}
voidpush_link(PLinkStackplstack,charx)//进栈
S_PNodep;
p=(S_PNode)malloc(sizeof(structS_Node));
if(p==NULL)
printf("
空间申请失败!
\n"
);
else
p->
info=x;
link=plstack->
top;
plstack->
top=p;
voidpush_str_link(PLinkStackplstack,charx[])
{//将分析串x存入plstack堆栈中,要求从字符串的尾部开始进栈
shorti=0;
while(x[i]!
='
\0'
)
i++;
while((--i)>
=0)
info=x[i];
voidprint_result(PLinkTablepltable,PLinkStackplst1,PLinkStackplst2)
shorti=1,k,j;
chars[maxlen];
//
S_PNodep1,p2;
voidpop_link(PLinkStackplstack);
chartop_link(PLinkStackplstack);
voidprintStackStr(shortm,shortn);
voidprintConStack_link(PLinkStackplstack);
voidpush_str_link(PLinkStackplstack,charx[]);
步骤分析栈"
//"
p2=plst2->
k=0;
while(p2)
k++;
p2=p2->
if(k>
10)
printStackStr(10,k);
剩余输入串推导所用产生式或匹配\n"
//C语言里允许使用函数名相同,但参数不同的两函数同时存在
while(plst1->
top->
link||top_link(plst1)!
#'
if(i<
%d"
i);
printConStack_link(plst1);
p1=plst1->
j=0;
while(p1)
j++;
p1=p1->
printStackStr(j,12);
"
printStackStr(j,k);
printStackStr(j,10);
//插入若干空格(取个)
printStack_link(plst2);
if(top_link(plst1)==top_link(plst2))
“%c”匹配"
top_link(plst1));
pop_link(plst1);
pop_link(plst2);
strcpy(s,findTable_link(pltable,top_link(plst1),top_link(plst2)));
if(s[0]=='
\n\n有错\n"
剩余输入串“"
”用此产生式组无法推出\n\n"
return;
elseif(!
strcmp(s,"
))//注意在这边不能用s[0]=='
ε'
来作为判断条件
%c%c%c%c%c"
top_link(plst1),161,250,166,197);
//→:
<
161,250>
ε:
166,197>
%c→%s"
top_link(plst1),s);
push_str_link(plst1,s);
if(top_link(plst1)=='
#"
printStackStr(1,k);
#接受\n\n"
\n\n在推导过程中出现问题\n\n"
voidmain()
……
while(true)
scanf("
%s"
s_t);
getchar();
t=0;
while(s_t[t]!
{//判断数组s_t里有无非法字符
if(!
judgeQueue_link(plqu2,s_t[t]))
对不起,你所输入的符号串中不能由之前的文件里的文法得出\n"
break;
t++;
if(t!
=0&
&
s_t[t]=='
\n\n请另输入一个待分析的字符串:
if(s_t[t-1]!
你输入的分析字符串没有以“#”作为结束标志;
\n系统自动在分析字符串后加上“#”\n\n"
push_link(plstack2,'
//将分析串存入plstack2堆栈中
push_str_link(plstack2,s_t);
print_result(pltable,plstack1,plstack2);
3.2运行结果
该程序是在VC++6.0以下编写的,里面没有用到C++的知识,纯C编写的代码.在运行之前,先将要分析的文法写入一个文本文档[*.txt]里,如:
S→A
A→BD
D→iBD
D→ε
B→CE
E→+CE
E→ε
C→)A*
C→(
注意:
只有这里用到两个符号"
→"
与"
,其中"
在特殊符号里、"
在希腊字母里,此处将上面这样的产生式组存放在eq.txt这个文本文档里作为示例。
下面显示语法分析进行个步骤。
开始运行后,根据提示输入文件名“eq.txt”后按Enter键继续,显示如下:
按任意键继续,显示如下:
按提示,输入待分析的句子,按Enter键继续,显示如下:
按提示,输入y,分析下一条句子;
或者输入n,结束,分别显示如下:
4总结与感想
因为要考试的原因,所有想尽快把这个课程设计做完,可是越急越容易出错,做起来很不顺手,特别是编程的时候,虽然借鉴了几篇类似的试验或课程设计,但完成这一设计仍不是一件简单的事情。
在设计过程中主要遇到以下两个问题:
1.数据结构问题。
在此程序中,用到队列,堆栈等形式的数据结构,各节点链接复杂,遇到不少问题。
在细心分析并逐步改正下,解决了此问题。
2.ε、→符号问题。
一开始在visualstudio2005中没有找到这两个符号,苦恼半天。
后来想个办法在MicrosoftWord中,找到此符号后,直接粘贴到程序代码中。
但在粘贴之后,还出了问题。
在网上搜索发现,原来它们并不像其它26个英文字母一样,各自对应一个字符ASCII码值,而是由多个连续字节表示,如:
→:
。
总的来说,此次编译原理课程设计加深了我对编译这门课的理解,发现自己还有很多的地方要复习,甚至还有知识点的理解偏差。
这些将直接影响期末考试,我将在以后的时间里,努力完善这些不足。
参考文献
[1]胡伦骏,徐兰芳等.编译原理[M].第2版.北京:
电子工业出版社,5005
[2]王雷,刘志成等.编译原理课程设计[M].北京:
电子工业出版社,2002
[3]何炎祥.编译程序构造[M].武汉:
武汉大学出版社,1988
[4]金成植.编译原理与实现[M].北京:
高等教育出版社,1989
[5]HolubA.CompilerDesigninC[M].Prentice-Hall,1990
湖北大学本科课程设计成绩评定表
项目
权重
分值
具体要求
得分
文献阅读与调查论证
0.20
100
能独立查阅文献和从事其它调研;
有收集、加工各种信息的能力
论文撰写质量
0.40
设计合理、理论分析与计算正确,实验数据准确可靠;
有较强的实际动手能力、经济分析能力和计算机应用能力;
设计说明书完全符合规范化要求,用A4复印纸打印成文
学习态度
0.30
学习态度认真,科学作风严谨,严格按要求开展各项工作,按期完成任务
学术水平与创新
0.10
设计有创意,有一定的学术水平或实用价值
总分
评语:
等级:
指导教师:
年月日