- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理课程设计
设计报告
组长:廖桉冬 成员:陈世宇涂佳辰
东南大学计算机科学与工程学院
二0 1 5年5月
设计任务名称 SeuLex 完成时间 5.22 验收时间 本组成员情况 学 号 姓 名 承 担 的 任 务 成 绩 廖桉冬 整体设计、代码实现
{RE到NFA、NFA到DFA、DFA最小化、状态转换表的设计、cpp文件驱动} 陈世宇 .l解析 涂佳辰 .cpp文件输出 注:本设计报告中各部分如果页数不够,请自行扩页。原则是一定要把报告写详细,能说明本组设计的成果和特色,能够反映小组中每个人的工作。报告中应该叙述设计中的每个模块。设计报告将是评定各人成绩的重要依据之一。
1 编译对象与编译功能 1.1 编译对象
(作为编译对象的C语言子集的词法、语法描述)
../SeuLex/Lex_Source_Code.l 是lex的源代码文件,也是Lex解析的目标文件
1.2 编译功能
(所完成的项目功能及对应的程序单元)
SeuLex:主控程序入口
LexFileReader:对lex输入文件的解析,得到正规表达式
Infix2Postfix:便于状态集计算,中缀转后缀,并将运算符(| * + ? .)特殊化
NFA:对单一正规表达式,构造NFA
MergedNFA:多个NFA合并到一起,标记中止状态
DFA:确定化NFA状态、闭包运算、最小化DFA,比对中止状态确定规约的表达式编号
CodeGen:将数据代码化写入cpp,添加头部、驱动程序 2. 主要特色 1. 正规定义段只接受形如[A-Z]的定义
2. 规则段中.表示所有单个字符
3. 规则段中*表示闭包运算
4. 规则段中+表示一个或一个以上的重复
5. 规则段中?表示空或一次
6. 规则段中|表示或
7. 规则段中连接运算符省略
8. 规则段中[]表示或,如果里面有形如 A-Z 的内容则表示 A|B|。 。 。|Z
9. 规则段中{}表示花括号内为正规定义,需要到正规定义段寻找其含义
10. 规则段中””表示引号中的内容是定义的完整字符
11. 规则段中()表示优先级
12. 规则段中如果想将上述符号当作字符来看待,则需要在该字符前加上转义符\
13. 生成的 C++程序文件名为 Seu_Lex_Analysis.cpp
14. 生成程序中有 seuLex()函数以供调用,其返回值为 int 型
15. 用户可以在规则段加入 return 语句
3 概要设计与详细设计 (由总到分地介绍SeuLex和SeuYACC的设计,包括模块间的关系,具体的算法等。采用面向对象方法的,同时介绍类(或对象)之间的关系。在文字说明的同时,尽可能多采用规范的图示方法。)
3.1 概要设计
(以描述模块间关系为主)
(圆角框粗体为5个主要模块,方框为交互的对象实例。*中缀转后缀集成在FileReader中)
3.2 详细设计
(以描述数据结构及算法实现为主)
LexFileReader:
数据结构:
RandomAccessFile随机字节读取,用于跳过部分数据,和读取一行
算法:
1.根据各部分不同的分隔符%{、}%、%%来读取某一部分的数据,头区域、规则定义、子程序;
2.根据每行不同数据(表达式、动作)的分隔符\t”,将表达式和数据分别放到不同的数组存放;
3.对含有正则表达式的表达式预先记录,如果读取到就按照正则表达式规则扩展。
Infix2Postfix:
数据结构:
Stack用栈将中缀表达式转化为后缀表达式
算法:
区分有几种运算符+、?、*、|、.,分别表示(1或多、0或1、0或多、或、与);其中(+、?、*)是集合符号,针对单个或是()中的字符个数进行定义;而(|、.)是对两个字符的并与关系描述;因此只需要将(|、.)后缀即可;
对连续的多个字符需要添加AND’(优先级高)即是后期自动加入:
{
if(i是字符) s+=i ;
if(i+1是字符) 弹出栈中操作符 压入‘.’
}
对含括号(扩展的),因为括号和AND’优先级高:
{
if(i是) 压入左括号i ;
if(i是)’) 弹出栈中所有操作符 抛弃’(‘
}
{
if(i是+、?、*)s+=i;
if(i是|’)弹出栈中已有的高优先级(左结合) 将|压入栈中;
}
4.为了区分原有的符号,将(+、?、*、|、.)正规表达式运算符设置为128-132,避免冲突。
NFA:
数据结构:
StateTableNFA状态转换表,行为状态数,列对
您可能关注的文档
最近下载
- 芦原义信《外部空间设计》.pdf VIP
- 中考现代文阅读——邓宗良《母亲的叶搭饼》.docx VIP
- 2025年防火涂料项目深度研究分析报告.docx
- CDS2.XwithHPLC操作说明资料.pdf VIP
- Python数据分析及应用 课件 第3、4章 程序的控制结构、函数.pptx
- 2025村道生命防护工程施工组织设计.docx
- 我国隧道盾构掘进机技术的发展现状.doc VIP
- DBJ50_T-460-2023 住房和城乡建设领域数字化企业评价标准(OCR).pdf VIP
- 食材采购配送服务以及售后服务方案.pdf VIP
- 2025年国考行测真题及答案解析(省级与地市级合卷) .pdf VIP
文档评论(0)