编译原理-词法分析报告详解.docx

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
 PAGE \* MERGEFORMAT 22 词法分析器实验报告 实验要求 自行设计单词的组成和分类,利用有穷自动机实现词法分析程序。 实验内容 功能描述 对给定的正则表达式建立最小化DFA,并以此对输入的源程序做词法分析,输出源程序的Token序列 程序原理 算法一:根据正则表达式直接构建DFA 该算法主要根据《编译原理》3.9.5节所讲述,根据正则表达式直接构建DFA。 算法:从一个正则表达式r构造DFA。 输入:一个正则表达式。 输出:一个识别L(r)的DFAD。 方法: 根据拓展的正则表达式(r)#构造出一个抽象语法树T。 使用3.9.3节和3.9.4节的方法,计算得到T的函数nullable,firstpos,lastpos,followpos。 使用以下所示的过程,构造出D的状态集Dstates和D的转换函数Dtran。所有节点的转换函数的并集便是DFAD。D的状态就是T中的位置集合。每个状态最初都是“未标记的”,当我们开始考虑某个状态的离开转换时,该状态变成“已标记的”。D的开始状态是firstpos(n0),其中节点n0是T的根节点。这个DFA的接受状态集合是那些包含了和结束标记#对应的位置的状态。 初始化Dstates,使之只包含未标记的状态firstpos(n0),其中n0是(r)#的抽象语法树的根节点; While(Dstates中存在未标记的状态S){ 标记S; For(每个输入符号a){ 令U为S中和a对应的所有位置p的followpos(p)的并集; If(U不在Dstates中) 将U作为未标记的状态加入到Dstates中; Dtran[S,a]=U; } } 算法二:根据拓展的正则表达式(r)#构造出一棵抽象语法树T 该算法的具体实现《编译原理》书中并没有涉及到,该算法的实现是经过本人思考而得。 算法:根据拓展的正则表达式(r)#构造出一棵抽象语法树T。 输入:拓展的正则表达式(r)#。 输出:一棵抽象语法树T。 方法: vectorstring op{ (, ), |, *, +, #, cat }; char table[][7] = { { , , -, , , -, - }, { , , , , , , }, { , , , , , , }, { , , , , , , }, { , , , , , , }, { -, -, -, -, -, -, - }, { , , , , , , } }; 该正则表达式含有7种运算符,对这7种运算符建立优先级表。具体如下所示。 其中,”#”是正则表达式结束符,”cat”是连接符。 准备两个栈,一个是操作符栈,用于保存正则表达式中的操作符(即上表所示的7个运算符);另一个是语法树节点栈,用于保存语法树的节点。设操作符栈顶元素为otop,节点栈栈顶元素为ntop。 遍历正则表达式,得到正则表达式的元素r。 若r为操作符,判断Priority(otop,r),Priority(otop,r)为r与otop的运算符优先级。若Priority(otop,r) == ‘’ || Priority(otop,r) == ‘’,则将r入运算符栈。否则,依r的类型,对语法树节点栈进行相应操作,并对语法树插入新节点。若r为操作数,则插入节点栈,若发现有连续的操作数,则对操作符栈插入“cat”。当r == “#”时,将两个栈中的剩余元素处理完毕,结束遍历正则表达式,并得到一棵完整的抽象语法树。 算法三:计算语法树nullable,firstpos,lastpos,followpos 我们可以使用递归的过程计算nullable,firspos和lastpos。具体如下所示: 节点nNullable(n)Firstpos(n)Lastpos(n)一个标号为null的叶子节点True??一个位置为i的叶子节点False{i}{i}一个or-节点 n = c1 | c2Nullable(c1) or Nullable(c2)Firstpos(c1) ∪ Firstpos(c2)Firstpos(c1) ∪ Firstpos(c2)一个cat-节点 n = c1 c2Nullable(c1) and Nullable(c2)If(Nullable(c1)) Firstpos(c1) ∪ Firstpos(c2) Els

文档评论(0)

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

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

1亿VIP精品文档

相关文档