LL1文法语法分析编译原理课程设计Word文档格式.docx

上传人:b****1 文档编号:699166 上传时间:2023-04-29 格式:DOCX 页数:23 大小:255.69KB
下载 相关 举报
LL1文法语法分析编译原理课程设计Word文档格式.docx_第1页
第1页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第2页
第2页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第3页
第3页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第4页
第4页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第5页
第5页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第6页
第6页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第7页
第7页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第8页
第8页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第9页
第9页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第10页
第10页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第11页
第11页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第12页
第12页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第13页
第13页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第14页
第14页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第15页
第15页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第16页
第16页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第17页
第17页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第18页
第18页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第19页
第19页 / 共23页
LL1文法语法分析编译原理课程设计Word文档格式.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

LL1文法语法分析编译原理课程设计Word文档格式.docx

《LL1文法语法分析编译原理课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《LL1文法语法分析编译原理课程设计Word文档格式.docx(23页珍藏版)》请在冰点文库上搜索。

LL1文法语法分析编译原理课程设计Word文档格式.docx

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

设计有创意,有一定的学术水平或实用价值

总分

评语:

等级:

指导教师:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2