- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理设计性实验四:词法分析算法的实现精选
《编译原理》设计性实验四:
正规式和有穷自动机
实验目的:掌握正规式转换为不确定的有穷自动机,不确定的有穷自动机的确定化,确定的
有穷自动机的最简化的算法实现过程。
实验要求:在 6 学时内完成,要求以表格或图形的方式实现。
实验内容:分为如下 3 个部分完成:
4.1 正规式转换为不确定的有穷自动机的过程模拟
【目的与要求】
【目的与要求】
通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解
Thompson 算法,掌握转换过程中的相关概念和方法,NFA 的表现形式可以是表格或图形。
【问题描述】
【问题描述】
任意给定一个正规式 r (包括连接、或、闭包运算),根据 Thompson 算法设计一个程序,
生成与该正规式等价的 NFA N 。
【算法描述】
【算法描述】
对于Σ上的每个正规式 R ,可以构造一个Σ上的NFA M ,使得L(M)=L(R) 。
步骤 1:首先构造基本符号的有穷自动机。
正规式 φ,构造NFA 为:⇒
对应正规式 ε,构造NFA 为: ⇒
对应正规式 a,构造NFA 为: ⇒
步骤 2 :其次构造连接、或和闭包运算的有穷自动机。
s,t 是正规式,相应 NFA 为
N(s),N(t) ,则正规式 R=s|t 的
NFA(R) 为:
s,t 是正规式,相应 NFA 为
N(s),N(t) ,则正规式 R=st 的
NFA(R) 为:
s 是正规式,相应 NFA 为N(s) ,
则正规式 R=s* 的NFA(R) 为:
【基本要求】
【基本要求】
算法实现的基本要求是:
(1) 输入一个正规式 r ;
(2) 输出与正规式 r 等价的 NFA 。
【测试数据】
【测试数据】
输入正规式:(a|b)*(aa|bb)(a|b)*
得到与之等价的 NFA N
【输出效果】
【输出效果】
注:上图中的“# ”代表ε。
【实现提示】
【实现提示】
1.NFA 的表示可以是图形或表格形式,状态之间的变换也可以直接表示为每两个状态
一组,表示为起始状态输入字符到达状态,如①a②,表示在①状态下读入输
入符号 a,变换到②状态。
2.实现时的数据结构定义如下:
(1) 用字符串存储正规式;
(2) 用结构体链表存放状态转换图
struct NFA
{ int from;
int to;
char *varch;
}表示从状态 from 到状态 to ,经过字符串varch 。
(3) 中间过程使用堆栈完成。
3 .实现过程
各运算符之间有优先关系,首先构造优先表,如表 8.3,然后通过符号栈及运算符栈(将
(、)、连接、或、及闭包运算作为运算符)来实现,采用算符优先原则进出栈或运算。初始
时添加开始和结束状态,将开始状态和#压入堆栈,并从左到右扫描输入符号串,遇到下一
个优先性低的运算符则出栈运算构造 NFA,碰到下一个优先性高的运算符则将运算符进栈。
表 8.3 正规式算符间的优先关系
i+1 | ( ) #
i
.
|
( = 错误
) 错误
# 错误 =
文档评论(0)