




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理课程设计(一)词法分析器1、题目编写程序实现一个简易的词法分析器。2、实验目的对一段程序代码进行词法分析,将程序段中的关键字、标识符、常数、运算符、界符按照一定的种别编码分析出来。3、环境及工具操作系统:windowsXP;使用工具:MicrosoftVisualC++6.0;编程语言:C语言;4、分析程序输入:从文件中读入程序段;程序输出:由单词种别和单词符号的属性值组成的二元式;单词种别通常使用整数编码,编码方式可以有多种,在设计词法分析器之前应确定一种程序处理起来较方便的编码方式。当一个种别中含有多个单词符号时,在分析出其属于哪个种别的时候应同时给出其单词符号属性,本程序为方便起见,采用单词符号本身来作为其属性,以标识同种别种的不同单词符号。标识符及关键字的识别:字母开头的字母和数字组成的串是多数编程语言的标识符,所以我们的简易词法分析器中,将标识符定义为这种字母数字串。当第一个字母为字母且紧接着的字符为数字或字母时,应将其串接在一起为一个单词,直到紧跟着的不在是字母数字时。由于关键字通常为一个单词,则这样得到的串可能是标识符也可能是关键字,又因为一种语言的关键字通常是有限个,则我们可以构造一个存放所有关键字的表,查询关键字表,可以判断得到的串是否为关键字。界符和运算符的识别:它们多为当个字符,建立两个分别存放界符合运算符的表,读取字符后,进行查表便可以得出它们的类型。为方便词法分析器的设计,可以使用状态转换图,根据一种特定的编程语言先设计出其状态转换图才能更好将其用代码实现。典型状态转换图结构如下:b)b)有不含回路含分支的状态节点:对应ifelseiielse…语句;有含回路的状态节点:对应while-if…语句。5、状态转换图字母或数字空白j数字非数字运算符字母或数字空白j数字非数字运算符6、程序框架描述程序中编写了以下函数,各个函数实现的作用如下:GetChar():将下一输入的字符读入到全局变量ch中,搜素指示器前移一个字符的位置。GetBC():检查ch中的字符是否为空白,若是则调用GetChar()直至ch中读入一个非空白字符。Concat():将ch中的字符连接到全局变量strToken中。Retrat():将搜索指示器回调一个字符的位置,将ch置为空。IsLetter():判断ch中的字符是否为字母,返回值为bool型,若是,则返回true,反之返回false。IsDigit():判断ch中的字符是否为数字,返回值为bool型,若是,则返回true,反之返回false。IsReserve():对strToken中的字符串查找保留字表,返回值为整型,若它是一个保留字,则返回保留字的种别码,否则返回0。IsRalation():对strToken中的字符串查找关系运算符表,返回值为整型,若它是一个关系运算符,则返回关系运算符的种别码,否则返回0。IsOperate():对strToken中的字符串查找算术运算符表,返回值为整型,若它是一个算术运算符,则返回算术运算符的种别码,否则返回0。IsBracket():对strToken中的字符串查找存有各种括号的表,返回值为整型,若它是一个括号字符,则返回括号字符的种别码,否则返回0。
11.IsSign():对strToken中的字符串查找存有各种标点符号的表,返回值为整型,若它是一个标点符号界符,则返回标点符号的种别码,否则返回0。实现词法分析功能的子函数的程序框架如下//返回的二元式存放种别码//返回的二元式存放种别码//返回的二元式中存单词符号属性//读取一个非空的字符//读取一个非空的字符//判断读取的字符是否为字母while(IsLetter()orIsDigit())//紧跟着的字符为字母或数字begin//连接到strToken//连接到strToken//回调指示器//查询保留字表if(code==0)return($ID,value);//若不是保留字,则为标识符elsereturn($KEYWORD,value);//为保留字endelseif(IsRalation()!=0)//查询关系运算符表,判断是否为关系运算符beginelseif(IsDigit())beginelseif(IsDigit())beginwhile(IsDigit())beginConcat();GetChar();endRetract();value=strToken;return($INT,value);end//判断读入字符是否为数字//判断紧跟着的字符为数字//连接到strToken//返回数字种别码Concat();value=strToken;return($RALATIONSIGN,value);/返回关系运算符种别码endelseif(IsOperate()!=0)〃查询算术运算符表,判断是否为关系运算符beginConcat();value=strToken;return($OPERATESIGN,value);/返回算术运算符种别码endelseif(IsBracket()!=0) //查询括号符表,判断是否为括号符beginConcat();value=strToken;return($BRACKET,value); //返回括号符种别码endelseif(IsSign()!=0)//查询标点界符表,判断是否为标点界符beginConcat();value=strToken;return($SIGN,value); //返回标点界符种别码endelseProcError(); //错误处理7、实现程序的源程序代码#include"stdafx.h"#include"iostream.h"#include"string.h"#include"stdio.h"#include"stdlib.h"#define$ID1#define$KEYWORD2#define$INT3#define$RLATIONSIGN4#define$OPERATESIGN5#define$BRACKET6#define$SIGN7charch,strToken[10]="",str[100]="";char*p=str;charReserveTable[20][10]={"while","for","if","else","do","switch","case","int","float","char","double","break","return","continue"};charRelationTable[3]={'>','<','='};charOperateTable[7]={'+','-','*','/','|','&','!'};charBracketTable[6]={'{','}','[',']','(',')'};charSignTabale[]={',','.',';',':'};typedefstructTwo{intcode;charvalue[10];}Two;boolGetchar(){ch=*p;if(ch==0)returnfalse;else{p++;returntrue;}}voidGetBC(){while(ch==''||ch=='\n'){Getchar();}}voidConcat(){for(inti=0;i<10;i++){if(strToken[i]==0){strToken[i]=ch;strToken[i+1]=0;break;}}}boolIsLetter(){if('A'<=ch&&ch<='Z'||'a'<=ch&&ch<='z')returntrue;elsereturnfalse;}boolIsDigit(){if('0'<=ch&&ch<='9')returntrue;elsereturnfalse;}voidRetract(){p--;ch='';}TwoIsReserve(){Twotwo;two.code=0;strcpy(two.value,"");inti;for(i=0;i<20;i++){if(!strcmp(strToken,ReserveTable[i])){two.code=$KEYWORD;strcpy(two.value,strToken);break;}}returntwo;}TwoIsRelation(){Twotwo;two.code=0;strcpy(two.value,"");inti;for(i=0;i<3;i++){if(ch==RelationTable[i]){two.code=$RLATIONsIGN;strcpy(two.value,strToken);break;}}returntwo;}TwoIsOperate(){Twotwo;two.code=0;strcpy(two.value,"");inti;for(i=0;i<7;i++){if(ch==OperateTable[i]){two.code=$OPERATESIGN;strcpy(two.value,strToken);break;}}returntwo;}TwoIsBracket(){Twotwo;two.code=0;strcpy(two.value,"");inti;for(i=0;i<7;i++){if(ch==BracketTable[i]){two.code=$BRACKET;strcpy(two.value,strToken);break;}}returntwo;}TwoIsSign(){Twotwo;two.code=0;strcpy(two.value,"");inti;for(i=0;i<7;i++){if(ch==SignTabale[i]){two.code=$SIGN;strcpy(two.value,strToken);break;}}returntwo;}voidAnalyseWord(Two*two){two->code=0;strcpy(two->value,"");strcpy(strToken,"");Getchar();GetBC();if(IsLetter()){while(IsLetter()||IsDigit()){Concat();Getchar();}Retract();two->code=IsReserve().code;strcpy(two->value,strToken);if(two->code==0){two->code=$ID;return;}elsereturn;}elseif(IsDigit()){while(IsDigit()){Concat();Getchar();}Retract();two->code=$INT;strcpy(two->value,strToken);
return;}elseif(IsRelation().code!=0){two->code=IsRelation().code;Concat();strcpy(two->value,strToken);return;}elseif(IsOperate().code!=0){two->code=IsOperate().code;Concat();strcpy(two->value,strToken);return;}elseif(IsBracket().code!=0){two->code=IsBracket().code;Concat();strcpy(two->value,strToken);return;}elseif(IsSign().code!=0){two->code=IsSign().code;Concat();strcpy(two->value,strToken);return;}else{printf("WrongLetter!\n");exit(0);}}intmain(intargc,char*argv[]){FILE*fp;Tworesult;inti=0,j=0;cout<<"*************的含义如下cout<<"*************的含义如下coutvv"l--标识符2--关键字3--常数4--关系运算符"vvendl;coutvv"5--算术运算符6--各种括号7--标点符号"vvendlvvendl;j._ff ^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*^1*ft. . TTz~»/^|i■j_^**^**E平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平E^**^**anCI■coutvvendlvv"分析结果如下:"vvendl;if((fp=fopen("f:\\test.txt","r"))==NULL){printf("Openfilewrong!\n");exit(0);}while(!feof(fp)){str[i]=fgetc(fp);i++;}str[i-1]=0;Getchar();while(ch!=0){Retract();AnalyseWord(&result);if(j<5){cout<<"<"<<result.code<<","<<result.value<<">"<<"\t";j++;}else{cout<<"<"<<result.code<<","<<result.value<<">"<<endl;j=0;}Getchar();}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年住宅供用电合同范本
- 2025合作出版合同范本
- 2025年抗变态反应药项目规划申请报告模板
- 2025水产海鲜购销合同范本
- 2025至2030年中国地板采暖专用PVC铁丝扎带行业投资前景及策略咨询报告
- 2025至2030年中国四边封立体袋行业投资前景及策略咨询报告
- 2025【合同范本】钢材供应合同
- 2025版店铺转让合同范本
- 2025至2030年中国2-氨基哌啶双盐酸盐行业投资前景及策略咨询报告
- 2025装修维护合同示范文本
- 工程技术中心汇报1
- 食品有限公司制冷机组安全风险分级管控清单
- 金赛 说明书完整版
- 经济学思维方式智慧树知到答案章节测试2023年西安交通大学
- 经济林栽培学 PPT课件 竹子栽培
- 《格力电器企业内部审计存在的问题及优化对策分析案例(论文)10000字》
- 2023年山东省威海市中考历史试题
- 2023年江苏海事职业技术学院招聘笔试题库及答案解析
- 毕业设计基于单片机的发动机转速电控系统程序设计及仿真
- 统借统还资金分拨合同
- GB/T 6478-2001冷镦和冷挤压用钢
评论
0/150
提交评论