【实验】词法分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【实验】词法分析.doc

实验1 词法分析1.实验说明 实验题目:词法分析器的设计与实现 实验目的:加深对词法分析基本理论的理解,锻炼实现词法分析器程序的实践能力。 实验过程: (1)按照给定的表达式的词法要求,构造分DFA; (2)整合各分DFA,构造总DFA; (3)设计词法分析器算法; (4)根据DFA实现单词识别程序;? (5)保存词法分析结果到文件。 输入: (1)?输入为数学表达式,其中可能含有空格; (2)?运算符包括+,-,*,/,(,)。 (3)?运算数包括自然数和变量; (4)?变量以下划线或字母开头,其后可以跟字母、下划线或数字。 输出: 输出到文本文件。每个单词输出为二元组(单词类别,单词值)。单词类别编码见下表: 编码 类别说明 0 算符 1 常量(自然数) 2 变量 例1:表达式xy-(x-100)/2的输出 2,xy 0,- 0,( 2,x 0,- 1,100 0,) 0,/ 1,2例2:表达式2x?*?(_x2?–?y)的输出 1,2 2,x 0,* 0,( 2,_x2 0,- 2,y 0,) : 2x识别为两个单词2和x,虽然2x在语法上不合法(中间需要一个运算符),但在词法分析时不能发现这个错误。例3:表达式x?y?*?012 该表达式x和y之间有一个空格,该词法分析程序的预处理程序简单的将空格全部去掉,因此与表达式xy*012的输出相同。 2,xy 0,* 1,012 2.分DFA 2.1?自然数 2.2?标识符 2.3?算符 3.合DFA 说明: (1)?状态0为初态。 (2)?状态4为程序正常出口,说明识别出一个单词,单词类别由前一个状态决定。 (3)?状态5为出错状态。 (4)?为进一步确定下一步要做什么,需要向前“假读”一个单词。状态2、3的假读是必须的,状态1是为了程序上的统一进行假读。 4.数据结构说明 4.1?单词结点 单词序列采用链表存储,每个结点表示一个单词,用如下结构表示: struct?WORDNODE { ?unsigned?short?byType;???//?单词类别 ?char?Value[MAX_DATA_LEN];?//?值 ?WORDNODE?*pNext;???//?下一结点 }; 单词链表结构在WordAnalysis()函数中创建,并由此函数返回头结点指针;在main()函数中销毁。 头结点只记录头指针,而不记录数据(单词类别和值),从第二个结点开始是第一个单词。 4.2?常量(宏定义) #define?MAX_DATA_LEN?256?//?数据缓冲区长度 数据缓冲区为一个字符数组,在main( )函数中声明并从键盘输入。 //?单词类别 #define?WT_OPERATOR??0?//?操作符 #define?WT_UINT????1?//?非负整数 #define?WT_VARIABLE???2?//?变量 5.流程 5.1?主流程(main函数) 预处理过程只是简单的将所有空格删除。 5.2?词法分析(WordAnalysis函数) 该函数输入为存放表达式的字符数组c,输出为识别的单词序列。如果出错,则返回NULL。 该函数首先创建一个单词链表,用于存放单词。单词结点结构参考3.1。 识别过程如下面代码所示。该函数从字符数组c的第0个位置开始扫描字符串,单词开始位置为nCur。调用函数IdentifyOneWord后,nCur修改为下一个单词的开始位置(该变量为引用调用)。该函数的说明参考第5部分。 ?for?(int?nCur?=?0;?c[nCur]?!=?\0;?) ?{??//?识别一个单词 ??pNode?=?IdentifyOneWord(c,?nCur,?pTail); ??if?(pNode?==?NULL)?//?出错 ??{ ???Clear(pHeader); ???return?NULL; ??} ??//?识别下一个单词 ??pTail?=?pNode; ?} 如果IdentifyOneWord()返回NULL,说明出错,则清空链表并返回NULL。如果返回值不是NULL,说明识别出一个单词,则使尾指针指向新创建的结点(即新识别出的单词)。 6.需要完成的内容IdentifyOneWord函数该函数用于识别一个单词,原型为: WORDNODE*?IdentifyOneWord(char?c[ ],?int?nCur,?WORDNODE?*pTail) 输入c为存放数学表达式的字符数组。nCur为扫描器起始指针,也就是当前要识别的单词的第一个符号。nCur不断递增(向右扫描),直道扫描完一个单词。pTail为单词链表的尾指针。 如果成功识别出一个单词,则新建这个单词结点,并将pTail的pNext指针指向这个

文档评论(0)

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

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

1亿VIP精品文档

相关文档