资源描述:
《词法分析器-c++实现-编译原理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验一词法分析一、实验日的(实验日期:2011.3.21)通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验要求编制一个读单词过程,源程序为一个文件,读取该文件,识别出各个具有独立意义的单词,并依次输出各个单词的内部编码及单词符号自身值。单词的内部编码如下:1、保留字:main、if、int>for>while>do>return>break>continue,单词种别码分别为1〜9,输出的二元组形式为(单词种别码,0)2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列,单词种
2、别码为20,输出的二元组形式为(单词种别码,标识符的名字);3、常数为无符号整型数;单词种别码为30,输出的二元组形式为(单词种别码,常数值);4、运算符包括:+、・、*、/、=、>、V、>二、v二、==、!=;单词种别码为41〜51,输岀的二元组形式为(单词种别码,0);5、分隔符包括:,、;、{、}、(、);单词种别码为61〜66,输出的二元组形式为(单词种别码,0)。单词符号种别码单词符号种别码main1/44int2——45if3>46for4<47while5〉二48do6v二49return750break8!二51continue961ID20■62NUM30{63+41
3、}64—42(65*43)66三、预习提示1、模块结构参照教材105页图3.22。四、实验过程和指导1、准备(1)课本有关章节;(2)编制好程序;(3)准备多组测试数据。2、为了能设计好程序,注意以下事情:(1)模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。(2)设计方案:模块关系简图、流程图、全局变量、函数接口等。(1)编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。五、举例源程序文件内容如下:main(){inta,b;a=10;b二a+20;}要求输出如下:(1,0)(65,0)(66,0)(63,0)(2,0)(20,“a”)(61,0)(20
4、,“b”)(62,0)(20,”a")(45,0)(30,10)(62,(20,,廿)(45,0)(20,”aj(41,0)(30,20)(62,0)(66,0)程序实现#include#include#includeusingnamespacestd;〃单词的二元组描述typedefstructchar*str;intcode;//种别码}Word;〃关键字描述Wordkey[9]二{{Fain”,1},{”int”,2},{},{”foF',4},{”while”,5},{"do”,6},{"retum,7},{"break"
5、,8},{"continue”,9}};〃运算符描述Wordoptr[ll]={「'+”,41},r「,42},{w,43}f/”,44}fj,45}f〉”,46},{”i,48},{9,49},r=”,50},{M!<51}};〃分界符描述Wordseparator[6]={r',",61},{";",62},{"{",63},{"}",64},{"(",65},{")”,66}};charch;〃判断是否为保留字intIsKey(stringss){inti;for(i二0;iv9;i++){if(!strcmp(key[i].str,ss.c_str()))re
6、turn(key[i].code);}return0;〃判断是否字母intIsLetter(charc){if(((c>='a‘)&&(cv二N))
7、
8、((c>二A)&&(cv=Z)))return1;elsereturn0;}〃判断是否为数字intIsDigit(charc){if(c>='0'&&cv=9)return1;elsereturn0;〃判断是否为运算符intIsOptr(stringss){inti;for(i=0;i9、否为分界符intIsSeparator(stringss){inti;for(i=0;i<6;i++){if(!strcmp(separator[i].str,ss.c_str()))return(separator[i].code);}return0;〃词法分析函数voidanalyse(ifstreamin)•ft11stringst=;//charch;while((ch=in.get())!=EOF){st=nn;if((ch=‘')
10、