- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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指针指向这个
您可能关注的文档
最近下载
- 2025年舞蹈教师资格证考试模拟试卷:舞蹈教学法与课程设计案例分析.docx VIP
- 学校食品安全事故应急演练实施方案(含演练脚本).docx
- 湖南省师德师风教育读本.pptx VIP
- 2025秋教科版(2024)科学三年级上册第一单元天气《2.docx VIP
- ISO∕IEC 20000-1:2018《信息技术服务管理第一部分:服务管理体系要求》之17-“8.1运行的策划与控制”理解与应用指导材料.docx VIP
- 验收标准内装 .pdf VIP
- 像医生一样思考(完全版).pptx VIP
- 北大附中学生家长写给高二同学的一封信导论.doc VIP
- 2025年白酒酿造工试题题库.pdf VIP
- 关于进一步加强公司在职员工学历提升的通知(专业完整模板).docx VIP
文档评论(0)