编译原理设计SeuLex重点分析.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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状态转换表,行为状态数,列对

文档评论(0)

ddf55855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档