没有合适的资源?快使用搜索试试~ 我知道了~
首页编译原理课程设计:算符优先分析 C++
编译原理课程设计:算符优先分析 C++
需积分: 10 14 下载量 47 浏览量
更新于2023-03-03
评论
收藏 537KB DOC 举报
编译原理课程设计:算符优先分析 C++编译原理课程设计:算符优先分析 C++编译原理课程设计:算符优先分析 C++编译原理课程设计:算符优先分析 C++
资源详情
资源评论
资源推荐
目 录
1 课程设计的目的和要求............................................................................................................1
1.1 课程设计的目的.............................................................................................................1
1.2 课程设计的要求.............................................................................................................1
2 系统描述....................................................................................................................................1
2.1 自底向上分析方法的描述:............................................................................................1
2.2 算符优先文法的描述:.................................................................................................2
3)输入符号串,进行移进-规约分析。...................................................................................2
3 概要设计....................................................................................................................................2
3.1 设计思路.........................................................................................................................3
3.2 系统功能结构.................................................................................................................3
3.3 技术路线或实现方法.....................................................................................................4
3.4 开发环境.........................................................................................................................4
4 详细设计....................................................................................................................................4
4.1 模块划分.........................................................................................................................4
4.2 主要算法的流程图.........................................................................................................6
4.3 数据分析与定义.............................................................................................................8
4.4 系统界面设计.................................................................................................................8
5 测试方法和测试结果................................................................................................................8
5.1 测试用例 1......................................................................................................................8
5.2 测试用例 2....................................................................................................................10
5.3 测试用例 3....................................................................................................................11
5.4 测试用例 4....................................................................................................................11
6 结论和展望..............................................................................................................................13
结论.....................................................................................................................................13
展望.....................................................................................................................................13
学习编译技术课程的体会和对本门课程的评价............................................................13
7 参考文献..................................................................................................................................13
8 源代码......................................................................................................................................14
1 课程设计的目的和要求
1.1 课程设计的目的
本次设计的时间为 1 周,目的是通过使用高级语言实现部分算法加强对
编译技术和理论的理解。设计的题目要求具有一定的规模,应涵盖本课程内
容和实际应用相关的主要技术。
1.2 课程设计的要求
1、文法使用产生式来定义;
2、用大写字母和小写字母分别表示非终结符和终结符;产生式使用->;
3、文法中的空字符串统一使用@表示;
4、分别给出每一个非终结符的 FIRSTVT 集和 LASTVT 集;
5、画出算符优先关系表
6、判定给定的文法是否是算符优先文法;
7、给定符号串判定是否是文法中的句子,分析过程用分析表格的方式
打印出来。
2 系统描述
本次实验使用 windows vista 操作系统下 visual C++6.0 平台,使用 C 语言,
利用读文件方式将待分析的文法读入到程序中,通过定义数组和结构体作为
具有一定意义或关系的表或栈,存放 FIRSTVT、LASTVT、算符优先关系表
的元素。
系 统 能 够 对 由 文 件 读 入 的 文 法 进 行 分 析 , 构 造 出 FIRSTVT 表 和
LASTVT 表以及算符优先关系表。可以根据构造的优先关系表对输入的任意
符号串进行分析,判断是否为本文法的句子,若是则打印规约过程。结果显
示到 DOS 界面上。
2.1 自底向上分析方法的描述:
对输入的符号串自左向右进行扫描,并将输入符逐个移入栈中,边移入
边分析,一旦栈顶符号串形成某个句型的句柄时(该句柄对应某个产生式的
右部),就用该产生式的左部非终结符代替相应右部的文法符号串,这一过
程称为规约。重复这一过程,直到栈中只剩下文法的开始符则分析成功。
1
2.2 算符优先文法的描述:
只规定算符之间的优先关系,也就是说只考虑终结符之间的优先关系。
由于算富有先分析不考虑非终结符之间的优先关系,在规约过程中只要找到
最左素短语就可以规约。
如给定一个文法 G[S]:
S->#E#
E->E+T
E->T
T->T*F
T->F
F->P/F
F->P
P->(E)
P->i
利用算符优先文法分析过程处理如下:
1)计算给定文法中任意两个终结符对(a,b)之间的优先关系,首先计算两个
集合
FIRSTVT(B)={b|B->b…或 B->Cb…}
LASTVT(B)={a|B->…a 或 B->…aC}
表 2-1 FIRSTVT 集和 LASTVT 集
S E T F P
FIRSTV
T
# +*/i( */i( /i( i(
LASTV
T
# +*/i) */i) /i) i)
2)计算三种优先关系,求出算符优先关系表:
表 2-2 算符优先关系表
+ * / i ( ) #
+ ﹒﹥ ﹤﹒ ﹤﹒ ﹤﹒ ﹤﹒ ﹒﹥ ﹒﹥
* ﹒﹥ ﹒﹥ ﹤﹒ ﹤﹒ ﹤﹒ ﹒﹥ ﹒﹥
/ ﹒﹥ ﹒﹥ ﹤﹒ ﹤﹒ ﹤﹒ ﹒﹥ ﹒﹥
I ﹒﹥ ﹒﹥ ﹒﹥ ﹒﹥ ﹒﹥
( ﹤﹒ ﹤﹒ ﹤﹒ ﹤﹒ ﹤﹒ ﹦﹒
) ﹒﹥ ﹒﹥ ﹒﹥ ﹒﹥ ﹒﹥
# ﹤﹒ ﹤﹒ ﹤﹒ ﹤﹒ ﹤﹒ ﹦﹒
3)输入符号串,进行移进-规约分析。
3 概要设计
2
3.1 设计思路
1)首先在源程序相同的目录下创建一个 txt 文档,并在文档中输入待分
析的文法。然后定义一个输入流文件,调用这个流文件中的 open 函数打开
该 txt 文件,再定义一个二维数组通过循环接收读入的产生式。
2)接着开始构造 FIRSTVT、LASTVT、算符优先关系表。在构造表的
时候首先定义了两个重要的结构体。一个结构体作为存放具有一定关系的一
对非终结符和终结符,另一个结构体作为存放上述元素的栈,包括栈顶指针、
栈底指针、栈的长度。既然定义了栈,就存在对栈的初始化、栈是否为空的
判断、入栈、出栈操作,利用循环和指针的操作来定义这些函数,以完成元
素的进栈和弹出。
定义了这两个结构体,就可以用来构造 FIRSTVT、LASTVT、算符优先
关系表。在构造 FIRSTVT 表时,通过循环找出每条产生式中的非终结符的
FIRSTVT 集,并把该非终结符和终结符压栈,设置标志位,标志一对非终结
符和终结符具有对应关系。LASTVT 表的构造则是将求 FIRSTVT 的过程翻
转过来,可以仅仅将函数中的参数稍作修改就能够完成。
3)构造算符优先关系表。算符优先关系表是一个二维数组,用来存放
任意两个终结符之间的优先关系。首先构造表头,通过扫描所有产生式将终
结符不重复的存放在一个一维数组中并置为优先关系表的行和列,并将优先
关系表其他内容全部初始化为空。接着遍历所有产生式,找出任意两个终结
符之间存在的关系(可以没有关系),并判断任意两终结符是否至多存在一
种优先关系,如发现优先关系表不为空,则证明该文法不是算符优先文法,
否则,将相应的关系填入到相应的行列对应的单元中。
4)输入串分析过程的设计。首先将大于、小于、等于和无关系分别定
义成一种类型的数据表示,通过查询符号栈栈顶以及当前符号之间的优先关
系来判断移进和规约的操作。
3.2 系统功能结构
图 3-1 系统功能结构图
函数功能:
Main()函数:调用主函数,运行程序;
3
FirstVt()函数:构造 FIRSTVT 表;
LastVt()函数:构造 LASTVT 表;
OpPrioTable()函数:构造算符优先关系表;
InputAnalyse()函数:分析输入串是否为文法中的句子,并给出规约过程。
3.3 技术路线或实现方法
算符优先分析法的具体过程如下:
1、首先先输入文件的路径,在 readfile(char sen[][col])函数中,将需要分
析的文法通过输入流文件打开函数 open()复制到 sen[row][col]中。
2、然后利用 FirstVt( )构造产生式 sen[row][col]的 FirstVt 表。先找出形如
A->…a…(a 为第一个终结符)的产生式,把(A,a)压入 Operator 栈中。从
Operator 栈顶抛出项(A,a),填入 first 表相应位置。在找出形如 B->A…
的产生式,把(B,a)压入 Operator 栈中。循环直到 Operator 栈为空,此时
FirstVt 表构造完毕。
3、然后把产生式右部翻转,调用 FirstVt 函数求出 LastVt 表。
4、接着调用 OpPriotable()构造算符优先关系表 opTable。先把产生式
中所有终结符填入 opTable 表第一行和第一列,然后利用产生式和 FirstVt 表
LastVt 表分别找出满足=关系、<关系、>关系的算符填表。若相应位已有关
系,说明两个终结符之间至少有两种优先关系,该文法不是算符优先文法。
5、最后调用 InputAnalyse()对输入串进行分析。初始化分析栈 S,依
次判断当前输入符 a 和分析栈中离栈顶最近的终结符 S[ j ]的关系,若 S[ j ]<
a ,则 a 移近,若 S[ j ]< a ,则往前找到第一个 S[ j ]>a,将 S[ j -1]到栈顶
S[ k ]规约,若 S[ j ]= a ,如果 S[ j ]=#,则接受,如果 S[ j ]!=#,则移进。
直到接受或者出错,算符优先分析结束。
3.4 开发环境
实验使用 windows vista 操作系统下的 Microsoft Visual C++ 6.0 平台,用
C 语言完成。
4 详细设计
4.1 模块划分
实验分为五个模块,分别是:
1、文件的导入:
readfile(sen[][]);
2、FirstVt、LastVt 集的构造:
FirstVt(sen[][],first[][],sen_len,frist_len);
LastVt(sen[][],last[][],sen_len,frist_len);
3、算符优先关系表 OpPriotable 的构造:
OpPriotable(sen,first,last,opTable,sen_len,first_len,&opTable_len);
4、算符优先分析过程的实现:
4
剩余30页未读,继续阅读
jessica_zhang_xin
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0