资源描述:
《词法分析程序的实现代码以及分析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、实验一词法分析程序的实现一、实验目的掌握程序设计语言的词法分析程序的手工实现方法。二、实验内容构造miniC语言的词法分析程序,程序要求能对输入的字符串流进行词法分析,并输出相应的单词。miniC语言的单词包括整数、标识符、分隔符、运算符和关键字,编制相应的词法分析程序。三、实验参考1.根据以下的正规式,画出状态转换图;标识符ID=letter(letter
2、digit)*letter=a
3、..
4、z
5、A
6、..
7、Zdigit=0
8、..
9、9十进制整数0
10、(1
11、2
12、3
13、4
14、5
15、6
16、7
17、8
18、9)(0
19、1
20、2
21、3
22、4
23、5
24、6
25、7
26、8
27、9)*运算符+-*/<<====!=>>=分隔符()
28、{}[];,关键字ifelsereturnintvoidwhilemain2.单词的分类可将所有标识符归为一类;将整数归为一类(或者每种进制的整数各为一类);运算符、关键字和分隔符则可采取一词一类。3.建立符号表可事先建立一关键字表,以备在识别关键字时进行查询。变量名表及常数表则在词法分析过程中建立。4.程序的输出形式所输出的每一单词,均按形如(TOKEN,VALUE)的二元式编码。对于变量标识符和常数,TOKEN字段为相应的类别码,VALUE字段则是该标识符、常数在其对应符号表中登记项的序号。或者采用三元式(TYPE,TOKEN,VALUE),如下表:5.根据状态图,设计词
29、法分析函数intscan(),完成以下功能:1)从键盘或文件读入源程序数据,逐个分析出单词并输出其二/三元式。2)建立符号表,打印符号表中的值以供查看分析是否正确。在编程之前需要从简到复杂,考虑好用到的数据结构:A:先写出各类单词的识别功能,即能对给定的单词识别出是不是标识符,关键字等。B:之后把所有识别功能连接起来,能识别给出的字符串是哪个,打印提示(按二元式或三元式)C:从文件里读取字符串功能。识别出文件里所有单词类型,暂不考虑出错情况。D:设计符号表的数据结构,把识别到的标识符加入到符号表中。6.给出一个测试程序,调用函数scan(),输出单词种别和属性。比如测试程序如
30、下:voidmain(){inta,b;b=a*2;}四、实验报告要求1)词法的正规式描述2)画出状态转换图3)单词种别码定义说明(参见课本50页)4)词法分析程序使用的数据结构和主要算法说明。5)测试程序及其词法分析结果的显示。#include#include#includecharprog[80],token[8];charch;intsyn,p,m=0,n,row,sum=0;char*rwtab[6]={"begin","if","then","while","do","end"};voidscaner()
31、{/*共分为三大块,分别是标示符、数字、符号,对应下面的ifelseif和else*/for(n=0;n<8;n++)token[n]=NULL;ch=prog[p++];while(ch==''){ch=prog[p];p++;}if((ch>='a'&&ch<='z')
32、
33、(ch>='A'&&ch<='Z'))//可能是标示符或者变量名{m=0;while((ch>='0'&&ch<='9')
34、
35、(ch>='a'&&ch<='z')
36、
37、(ch>='A'&&ch<='Z')){token[m++]=ch;ch=prog[p++];}token[m++]=' ';p--;s
38、yn=10;for(n=0;n<6;n++)//将识别出来的字符和已定义的标示符作比较,if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif((ch>='0'&&ch<='9'))//数字{{sum=0;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}elseswitch(ch)//其他字符{case'<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){
39、syn=21;token[m++]=ch;}elseif(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}el