欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    词法分析器(共17页).doc

    • 资源ID:16284354       资源大小:322KB        全文页数:17页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    词法分析器(共17页).doc

    精选优质文档-倾情为你奉上词法分析实验报告一、实验目的与要求: 1、了解字符串编码组成的词的内涵,感觉一下字符串编码的方法和解读 2、了解和掌握自动机理论和正规式理论在词法分析程序和控制理论中的应用二、实验内容: 构造一个自己设计的小语言的词法分析器: 1、这个小语言能说明一些简单的变量 识别诸如begin,end,if,while等保留字;识别非保留字的一般标识符(有下划线、字符、数字,且第一个字符不能是数字)。识别数字序列(整数和小数);识别:=,<=,>=之类的特殊符号以及;,(,)等界符。2、相关过程(函数): Scanner()词法扫描程序,提取标识符并填入display表中 3、这个小语言有顺序结构的语句 4、这个小语言能表达分支结构的语句 5、这个小语言能够输出结果总之这个小语言词法分析器能提供以上所说明到的语法描述的功能三、实验步骤:1、测试评价(1)、测试1:能说明一些简单的变量,如关键字、一般标识符、界符等;(2)、测试2:能输出结果:单词符号(内码形式)、各种信息表(如符号表、常量表等);(3)、测试程序: var x,y,z; begin x:=2; y:=3; if (x+5>=y*y) then begin z:=y*y-x; z:=z+x*x; end else z:=x+y; prn z; end.(4)、结果:、从键盘读入;部分结果如下:(类型:该标识符所属的类型,如关键字,变量等;下标:该标识符所对应表(如变量标识符表,常量标识符表等)中其相应的位置,下同)、从文件读入,输出到文件;部分结果如下: 其他测试及结果如下:、出错处理;注:若有错误,则只指出错误,不输出各个表;(5)、评价: 这个小语言程序基本上能完成词法分析阶段的工作,识别诸如begin,if等保留字;识别非保留字的一般标识符(有下划线、字符、数字,且第一个字符不能是数字)。识别数字序列(整数和小数);识别:=,<=,>=之类的特殊符号以及;,(,)等界符。在扫描源程序串的同时,能进行一些简单的处理,如删除空格、tab、换行等无效字符,也进行了一些基本的错误处理,如变量长度的判别等。遇到的问题:(a)、判别标识符超过规定长度(20)时,未输出处理结果;(b)、整数长度过长输出结果仍为整数类型3;(c)、对于小数如045,被解释为界符和整数;(d)、对以数字开头的一般标识符的处理,如100nuts被解释为整数类型和标识符,未给出错误提示。如上测试,出现前两个问题时已报错并输出所在行,而后两个问题待解决。2、对小语言的词法规则(正规式)画出一个确定的有限自动机(见附录2、3)四、实验的源代码:(见附录1)五、实验中发现的问题和遇到的困难及解决方法: 由于以前未曾接触过编译原理,在该实验的设计中,的确遇到一定的困难。主要是display表结构的设计,由于语法分析和语义分析还未学习,无法站在全局的角度统筹兼顾, 在表结构设计时,不知该往表结构体中添加哪些内容,可以为后续的工作做铺垫,这是刚开始就遇到的最大的困难,也是最难的。经过分析,我们在现有局限性的基础上,设计出一种折中的表结构,即在表结构中只添加标识符在其相应表中的对应下表,标记符类型码等关键的几处,这样既能 唯一确定一标识符,达到该实验的要求,同时又为表保留了很好的扩充性,以达到后续实验的要求。表结构设计好后,其余的工作就是提取字符串和写入display表,在提取单字符还是双字符组成的运算符时有些麻烦,不过利用数据结构的相关知识也是容易做到。六、总结: 词法分析是构造编译器的起始阶段,也是相应比较简单的一个环节。词法分析的主要任务是:根据构造的状态转换图,从左到右逐个字符地対源程序进行扫描,识别开源程序中具有独立含义的最小语法单位符号或单词,如变量标识符,关键字,常量,运算符,界符等。然后将提取出的标识符以内码的形式表示,即用int类型的数字来表示其类型和在display表中的位置,而无须保留原来标识符本身的字符串,这不仅节省了内存空间,也有利于下一阶段的分析工作。当然,在扫描源程序串的同时,进行一些简单的处理,如删除空格、tab、换行等无效字符,也进行了一些基本的错误处理,如变量长度的判别,有些不合词法规则的标识符判别等。总之,严格说来,词法分析程序只进行和词法分析相关的工作。七、实验感想: 通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C+语言)直接编写此法分析程序。另外,也让我重新熟悉了C+语言的相关内容,加深了对C+语言的用途的理解。附录1(代码)#include <iostream>#include <fstream>#include <string>#include <math.h>#include <ctype.h>#include <cstdlib>using namespace std;#define Max 655 /最大代码长度#define WordMaxNum 256 /变量最大个数#define DigitNum 256/常量最大个数#define MaxKeyWord32/关键字数量#define MaxOptANum 8/运算符最大个数#define MaxOptBNum 4/运算符最大个数#define MaxEndNum 11/界符最大个数typedef struct DisplayTableint Index; /标识符所在表的下标int type;/标识符的类型int line;/标识符所在表的行数char symbol20;/标识符所在表的名称Table; int TableNum = 0; /display表的下标 char WordWordMaxNum20; /标识符表 char DigitWordMaxNum20; /数字表 int WordNum = 0; /变量表的下标 int DigNum = 0; /常量表的下标 bool errorFlag = 0; /错误标志 const char* const KeyWordMaxKeyWord = "and", "array", "begin", "case","char" "constant", "do", "else", "end", "false","for", "if", "input", "integer", "not", "of", "or", "output","packed","procedure", "program", "read", "real","repeat", "set", "then", "to", "type", "until", "var","while", "with","prn" /关键字 const char OptA = '+','-','*','/','=','#','<','>' / 单目运算 const char *OptB = "<=",">=",":=","<>"/双目运算符 const char End = '(', ')' , ',' , '' , '.' , '' , '' , ':' , '' , '' , '"' / 界符 void error(char str20,int nLine, int errorType) cout <<" nError : " switch(errorType) case 1:cout << "第" << nLine-1 <<"行" << str << " 变量的长度超过限制!n"errorFlag = 1;break; case 2:cout << "第" << nLine-1 <<"行" << str << " 小数点错误!n"errorFlag = 1;break; case 3:cout << "第" << nLine-1 <<"行" << str << " 常量的长度超过限制!n"errorFlag = 1;break; /error void Scanner(char ch,int chLen,Table tableMax,int nLine) int chIndex = 0; while(chIndex < chLen) /对输入的字符扫描 /*处理空格和tab */while(chchIndex = ' ' | chchIndex = 9 ) /忽略空格和tab chIndex +; /*处理换行符*/while(chchIndex = 10) /遇到换行符,行数加1nLine+;chIndex +;/*标识符*/if( isalpha(chchIndex) /以字母、下划线开头char str256;int strLen = 0;while(isalpha(chchIndex) | chchIndex = '_' ) /是字母、下划线strstrLen + = chchIndex;chIndex +;while(isdigit(chchIndex)/不是第一位,可以为数字strstrLen + = chchIndex;chIndex +;strstrLen = 0; /字符串结束符if(strlen(str) > 20) /标识符超过规定长度,报错处理error(str,nLine,1);elseint i;for(i = 0;i < MaxKeyWord; i+) /与关键字匹配if(strcmp(str, KeyWordi) = 0) /是关键字,写入table表中strcpy(tableTableNum.symbol,str);tableTableNum.type = 1; /关键字tableTableNum.line = nLine;tableTableNum.Index = i;TableNum +;break;if(i >= MaxKeyWord) /不是关键字tableTableNum.Index = WordNum;strcpy(WordWordNum+,str); tableTableNum.type = 2; /变量标识符 strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; TableNum +;/*常数*/else if(isdigit(chchIndex)&&chchIndex!='0') /遇到数字 else if(isdigit(chchIndex) /遇到数字int flag = 0;char str256;int strLen = 0;while(isdigit(chchIndex) | chchIndex = '.') /数字和小数点if(chchIndex = '.') /flag表记小数点的个数,0时为整数,1时为小数,2时出错flag +;strstrLen + = chchIndex; chIndex +;strstrLen = 0;if(strlen(str) > 20) /常量标识符超过规定长度20,报错处理error(str,nLine,3);if(flag = 0)tableTableNum.type = 3; /整数if(flag = 1)tableTableNum.type = 4; /小数if(flag > 1)error(str,nLine,2);tableTableNum.Index = DigNum;strcpy(DigitDigNum +,str);strcpy(tableTableNum.symbol,str);tableTableNum.line = nLine;TableNum +;/*运算符*/elseint errorFlag; /用来区分是不是无法识别的标识符,0为运算符,1为界符char str3;str0 = chchIndex;str1 = chchIndex + 1;str3 = 0;for(int i = 0;i < MaxOptBNum;i+)/MaxOptBNum)if(strcmp(str,OptBi) = 0)errorFlag = 0;tableTableNum.type = 6;strcpy(tableTableNum.symbol,str);tableTableNum.line = nLine;tableTableNum.Index = i;TableNum +;chIndex = chIndex + 2;break;if(i >= MaxOptBNum)for( int k = 0;k < MaxOptANum; k+)if(OptAk = chchIndex)errorFlag = 0;tableTableNum.type = 5;tableTableNum.symbol0 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum.line = nLine;tableTableNum.Index = k;TableNum +;chIndex +;break;/*界符*/for(int j = 0;j < MaxEndNum;j +)if(Endj =chchIndex)errorFlag = 1;tableTableNum.line = nLine;tableTableNum.symbol0 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum.Index = j;tableTableNum.type = 7;TableNum +;chIndex +;/*其他无法识别字符*/if(errorFlag != 0 && errorFlag != 1) /开头的不是字母、数字、运算符、界符char str256;int strLen = -1;strstrLen + = chchIndex; chIndex +;while(*ch != ' ' | *ch != 9 | chchIndex != 10)/strstrLen + = chchIndex;chIndex +;strstrLen = 0;tableTableNum.type = 8;strcpy(tableTableNum.symbol,str);tableTableNum.line = nLine;tableTableNum.Index = -2;TableNum +; void Trans(double x,int p) /把十进制小数转为16进制 int i=0; /控制保留的有效位数 while(i<p) if(x=0) /如果小数部分是0 break; /则退出循环 else int k=int(x*16); /取整数部分 x=x*16-int(k); /得到小数部分 if(k<=9) cout<<k; else cout<<char(k+55); ; i+; ; ; int main() ifstream in;ofstream out,outVar,outCon;char in_file_name26,out_file_name26; /读入文件和写入文件的名称char chMax; /存放输入代码的缓冲区int nLine = 1;/初始化行数 Table *table = new TableMax; int choice;cout << "请输入读入方式:1:从文件中读,2:从键盘读(输入结束标志位#):n"cin >> choice;switch(choice) int i;/*从文件读取*/ case 1:cout<<"Enter the input file name:n"cin>>in_file_name;in.open(in_file_name);if(in.fail() /打开display表读文件失败cout<<"Inputput file opening failed.n"exit(1);cout<<"Enter the output file name:n"cin>>out_file_name;out.open(out_file_name);outVar.open("变量表.txt");outCon.open("常量表.txt");if(out.fail() /打开display表写文件失败cout<<"Output file opening failed.n"exit(1);if(outVar.fail() /打开变量表写文件失败cout<<"VarOutput file opening failed.n"exit(1);if(outCon.fail() /打开常量表写文件失败cout<<"ConstOutput file opening failed.n"exit(1); in.getline(ch,Max,'#'); Scanner(ch, strlen(ch),table,nLine); /调用扫描函数 if(errorFlag = 1) /出错处理return 0; /*把结果打印到各个表中*/ out <<"类型"<<""<<"下标" <<endl; for( i = 0; i < TableNum;i +)/打印displayout<< "(0x" <<hex << tablei.type<< ","<< "0x" << hex << tablei.Index<< ")" <<endl; /在文件testout.txt中输出 outCon << "下标" << " " << "常量值" << endl; for(i = 0;i < TableNum;i+) /打印常量表 if(tablei.type = 3) long num1;num1 = atoi(tablei.symbol);outCon<< "(0x" <<hex << tablei.Index << ","<< "0x" << hex << num1 << ")" <<endl; if(tablei.type = 4) double num2;num2 = atof(tablei.symbol);outCon<< "(0x" <<hex << tablei.Index << ","<< "0x" << hex << num2<< ")" <<endl; outVar <<"类型"<<""<< "变量名称" <<endl; for( i = 0; i < WordNum;i +)/打印变量表outVar<< "(0x" <<hex << i<< "" << Wordi << ")" <<endl; /在文件testout.txt中输出in.close();/关闭文件out.close();outVar.close();outCon.close();break;/*从键盘输入*/case 2:cin.getline(ch,Max,'#');Scanner(ch, strlen(ch),table,nLine); /调用扫描函数if(errorFlag = 1)return 0;cout << "nDisplay表: n"cout <<"类型"<<""<<"下标" <<endl; /dos界面下 for( i = 0; i < TableNum;i +)cout<< "(0x" <<hex << tablei.type<< ","<< "0x" << hex << tablei.Index<< ")" <<endl; cout << "n常量表:n" << "下标" << " " << "常量值" << endl; for(i = 0;i < TableNum;i+) /打印常量表 if(tablei.type = 3) long num1;num1 = atoi(tablei.symbol);cout<< "(0x" <<hex << tablei.Index << ","<< "0x" << hex << num1 << ")" <<endl; if(tablei.type = 4) char *num2;float num,num3;num = atof(tablei.symbol);num2 = gcvt(16,strlen(tablei.symbol),tablei.symbol);num3 = num - floor(num);cout << "(0x" << hex << tablei.Index << "," << num2;Trans(num3,5) ;cout << ")" <<endl; cout <<"n变量表:n类型"<<""<< "变量名称" <<endl; for( i = 0; i < WordNum;i +)/打印变量表cout<< "(0x" <<hex << i<< " " << Wordi << ")" <<endl; /在文件testout.txt中输出break;return 0; 附录2:在状态转换图中各个状态表示的种类、种别编码、解释如下表:状态种别编码种类解释0初态121关键字32变量标识符由字母下划线数字组成,且第一位不能是数字4读入了数字53整数64小数7小数点个数出错,大于18读入了<96双目运算<>、<=105单目运算<11读入了>126双目运算>=135单目运算>145单目运算+、*、/、=、#用default实现15读入了:166双目运算:=177界符(、)、,、;、:、用变量errorflag实现188异常出错处理附录3:(状态转换图)空格换行tab1 00254 0030 00 下划线、字母字母小数点其他 数字67数字数字小数点小数点(.)小数点9 < 8 00 =、> 100 非= 且 非> >12011 00 =130非= 140+、*、/、=、#1601500:=170(、)、,、;、:、180非 、专心-专注-专业

    注意事项

    本文(词法分析器(共17页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开