编译原理-词法分析报告讲解.docxVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
词法分析器实验报告实验要求自行设计单词的组成和分类,利用有穷自动机实现词法分析程序。实验内容功能描述对给定的正则表达式建立最小化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的接受状态集合是那些包含了和结束标记#对应的位置的状态。算法二:根据拓展的正则表达式(r)#构造出一棵抽象语法树T该算法的具体实现《编译原理》书中并没有涉及到,该算法的实现是经过本人思考而得。算法:根据拓展的正则表达式(r)#构造出一棵抽象语法树T。输入:拓展的正则表达式(r)#。输出:一棵抽象语法树T。方法:该正则表达式含有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)Else Firstpos(c1)If(Nullable(c2))Firstpos(c1) ∪ Firstpos(c2)Else Firstpos(c2)一个star-节点 n = c1*trueFirstpos(c1)Firstpos(c1)一个add-节点 n=c1+falseFirstpos(c1)Firstpos(c1)Followpos的计算如下:如果n是一个cat节点,且其左右子节点分别为c1,c2,那么对于lastpos(c1)中的每一个位置i,firstpos(c2)中的所有位置都在followpos(i)中。如果n是一个star节点,并且i是lastpos(n)中的一个位置,那么firstpos(n)中的所有位置都在followpos(i)中。算法四:根据DFA,对源程序输出Token序列输入:源程序。输出:Token序列。方法:遍历源程序,判断是否为保留字,若是保留字,则直接输出该Token。否则,将读取的字符串送入有穷自动机,若DFA能够达到终结状态,表示源程序合法,输出该Token。否则,对该字符串报错。(三)程序总流程图(四) 程序源代码#include bits/stdc++.husing namespace std;struct TreeNode{ string value; TreeNode *leftChild; TreeNode *rightChild; TreeNode

文档评论(0)

shuwkb + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档