资源描述:
《【实验1】词法分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验1词法分析1.实验说明实验题目:词法分析器的设计与实现实验目的:加深对词法分析基木理论的理解,锻炼实现词法分析器程序的实践能力。实验过程:(1)按照给定的表达式的词法要求,构造分DFA;(2)整合各分DFA,构造总DFA;(3)设计词法分析器算法;(4)根据DFA实现单词识别程序;(5)保存词法分析结果到文件。输入:(1)输入为数学表达式,其中可能含有空格;(2)运算符包括+,*,/,(,)。(3)运算数包括自然数和变量;(4)变量以下划线或字母开头,其后可以跟字母、下划线或数字。输出:输出到文本文件。每个单
2、词输出为二元组(单词类别,单词值)。单词类别编码见下表:编码类别说明0算符1常量(自然数)2变量例1:表达式xy-(x-100)/2的输出2,xy0,-0,(2,x0,-1,1000,)0,/1,2例2:表达式2x*(_x2-y)的输出1,22,xor0,(2,_x20,-2,y0,)注意:2x识别为两个单词2和x,虽然2x在语法上不合法(中间需要一个运算符),但在词法分析时不能发现这个错误。例3:表达式xy*012注意:该表达式x和yZ间有一个空格,该词法分析程序的预处理程序简单的将空格全部去掉,因此与表达式x
3、y*012的输出相同。2,xy0,*1,0121.分DFA2.1自然数2.2标识符2.3算符2.合DFA说明:(1)状态0为初态。(2)状态4为程序正常出口,说明识别出一个单词,单词类别由前一个状态决定。(3)状态5为出错状态。(4)为进一步确定下一步要做什么,需耍向前“假读”一个单词。状态2、3的假读是必须的,状态1是为了程序上的统一进行假读。1.数据结构说明4.1单词结点单词序列采用链表存储,每个结点表示一个单词,用如下结构表示:structWORDNODEunsignedshortbyType;//单词类别
4、charValue[MAX_DATA_LEN];//值WORDNODE*pNext;〃下一结点};单词链表结构在WordAnalysis()函数中创建,并由此函数返回头结点指针;&main()函数中销毁。头结点只记录头指针,而不记录数据(单词类别和值),从第二个结点开始是第一个单词。4.2常量(宏定义)#defineMAX_DATA_LEN256//数据缓冲区长度数据缓冲区为一个字符数组,在main()函数中声明并从键盘输入。〃单词类别#defineWT_OPERATOR0〃操作符#defineWT_UINT1/
5、/非负整数#defineWT_VARIABLE2〃变量5•流程5.1主流程(main函数)预处理过程只是简单的将所有空格删除。5.2词法分析(WordAnalysis函数)该函数输入为存放表达式的字符数组c,输出为识别的单词序列。如果出错,则返回NULL。该两数首先创建一个单词链表,用于存放单词。单词结点结构参考3.1。识别过程如下面代码所示。该函数从字符数组c的第0个位置开始扫描字符串,单词开始位置为nCur。调用函数IdentifyOneWord后,nCur修改为卜•一个单词的开始位置(该变量为引用调用)。该
6、函数的说明参考第5部分。for(intnCur=0;c[nCur]!=' ';){//识别一个单词pNode=ldentifyOneWord(c,nCur,pTail);if(pNode==NULL)〃出错{Clear(pHeader);returnNULL;}//识别下一个单词pTail=pNode;如果IdentifyOneWord()返回NULL,说明出错,则清空链表并返回NULL。如果返回值不是NULL,说明识别岀一个单词,则使尾指针指向新创建的结点(即新识别出的单词)。6.需要完成的内容6.1Iden
7、tifyOneWord函数该函数用于识别一个单词,原型为:WORDNODE*IdentifyOneWord(charc[],int&nCur,WORDNODE*pTail)输入c为存放数学表达式的字符数组。nCur为扫描器起始指针,也就是当前要识别的单词的第一个符号。nCur不断递增(向右扫描),直道扫描完一个单词。pTail为单词链表的尾指针。如果成功识别出一个单词,则新建这个单词结点,并将pTail的pNext指针指向这个结点,然后返回这个结点指针。如果不能识别出一个单词,则清空链表,并返回NULL。填写这个
8、函数的内容时要注意以下几点:(1)本函数开始时,当前符号为c[nCur],当前状态为初态0。(2)nCur为扫描器当前指针,它是引用类型,同时用作输入参数和返回值。在识别出一个单词后,由于假读的原因,nCur实际指向了下一个单词的开始位置,而识别出的单词的结束位置为nCur-10(3)识别出一个单词后,单词结束位置为nCur・1,而开始位置因为扫描器指针nCur的移动已经