




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
词法分析器一、 内容和要求将词法分析器设计成单独的程序或供语法分析器调用的子程序。功能包括:通过词法分析器实现以下类别的识别:关键字:break、case、char、do、while、if、else、int、float等。运算符:+、*、=、/。界符:;、,、(、)、。数字:0-9。标识符二、 词法分析原理词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的机内表示形式TOKEN字,送给语法分析程序。TOKEN字是一个二元式:(单词种别码,自身值)。单词自身值按如下规则给出:1 标识符的自身值是它在符号表的入口地址。2 常数的自身值是常数本身(或它的二进制数值)。3 关键字和界限符的自身值为本身。三、 程序设计1、程序流程:输入一段字符 调用读取字符函数 输出之前输入的字符 调用词法分析子程序 输出分析结果3、程序中用到的函数Analyzer();/构造函数 Analyzer();/析构函数 intIsLetter(char ch); /判断是否是字母,是则返回 1,否则返回 0。int IsDigit(char ch); /判断是否为数字,是则返回 1,否则返回 0。int IsSpace(char ch); /判断是否为空白符(空格、换行、制表符),是则返回 1,否则返回 0。void GetChar(char *ch); /将下一个输入字符读到ch中。void GetBC(char *ch); /检查ch中的字符是否为空白,若是,则调用GetChar直至ch进入一个非空白字符。void Concat(char *strToken, char *ch); /将ch中的字符连接到strToken之后。int Reserve(char *strToken); /对strToken中的字符串查找保留字表,若是一个保留字返回它的数码,否则返回0。void Retract(char *ch) ; /将搜索指针器回调一个字符位置,将ch置为空白字符。void input();/向存放输入结果的字符数组输入一句语句。void display();/输出一些程序结束字符显示样式int analyzerSubFun();/词法分析器子程序,为了实现词法分析的主要功能。string DecStrToBinStr(string decNum);/十进制转换成二进制2、程序代码#include#includeusing namespace std;class Analyzerpublic:Analyzer()p=Store;Analyzer()cout程序运行结束endl;int IsLetter(char ch);int IsDigit(char ch);int IsSpace(char ch);void GetChar(char *ch);void GetBC(char *ch);void Concat(char *strToken, char *ch);int Reserve(char *strToken);void Retract(char *ch) ;void input();void display();int analyzerSubFun();string DecStrToBinStr(string decNum); private:char Store100;char *p;char strToken100;string result;char ch;int Analyzer:IsLetter(char ch)if(a=ch&ch=z)|(A=ch&ch=0&ch=9) return 1; return 0; int Analyzer:IsSpace(char ch)if(ch= |ch=n|ch=t) return 1; return 0; void Analyzer:GetChar(char *ch)*ch =*p; p=p+1;void Analyzer:GetBC(char *ch)do GetChar(ch); while(IsSpace(*ch); void Analyzer:Concat(char *strToken, char *ch)int i; for(i=0;i100;i+) if(*strToken=NULL) *strToken=*ch; break; strToken+; int Analyzer:Reserve(char *strToken)if(strcmp(strToken,break) = 0) return 1; if(strcmp(strToken,case) = 0) return 2; if(strcmp(strToken,char) = 0) return 3; if(strcmp(strToken,do) = 0) return 4; if(strcmp(strToken,while) = 0) return 5; if(strcmp(strToken,if) = 0) return 6; if(strcmp(strToken,else) = 0) return 7; if(strcmp(strToken,int) = 0) return 8;if(strcmp(strToken,float) = 0) return 9;if(strcmp(strToken,long) = 0) return 10; if(strcmp(strToken,short) = 0) return 11; if(strcmp(strToken,void) = 0) return 12; if(strcmp(strToken,continue) = 0) return 13;if(strcmp(strToken,default) = 0) return 14;if(strcmp(strToken,return) = 0) return 15;if(strcmp(strToken,switch) = 0) return 16;return 0; void Analyzer:Retract(char *ch)p=p-1; *ch= ; void Analyzer:input()cout=endl;cout简单词法分析器 endl;cout=endl;cout请输入一行语句:endl;cin.getline(Store,100);cout输入语句为:Storeendl;void Analyzer:display()cout运行结果如下:endl;cout单词ttt类别ttt值tt0;i-) binStr+=tempi-1;if(decDown!=0)binStr+=.;int it=0;temp=;for(int i=4;i0;i-)it=(int)(decDown*2);temp+=(char)(it+48);decDown=decDown*2-it;if(decDown=0) break;binStr+=temp;if(temp=0)binStr=0;return binStr;int Analyzer:analyzerSubFun()char ch; int i,value;string res;while(1)GetBC(&ch); for(i=0;i100;i+) strTokeni=NULL;if(ch=0) return 0;if (IsLetter(ch) while (IsLetter(ch) | IsDigit(ch) Concat(strToken,&ch); GetChar(&ch); Retract(&ch); value=Reserve(strToken); if (value=0)coutstrTokenttt;cout标识符ttt;coutstrTokenendl; elsecoutstrTokenttt;cout关键字ttt;coutstrTokenendl;else if (IsDigit(ch) while (IsDigit(ch) Concat(strToken,&ch);GetChar(&ch); Retract(&ch); coutstrTokenttt;cout常数ttt;result=strToken;res=DecStrToBinStr(result);coutresBendl;else if (ch =|ch =+|ch =* ch = /|)Concat(strToken,&ch);coutstrTokenttt;cout算符ttt;coutstrTokenendl;else if (ch = ;|ch = ,|ch=(|ch=)| ch = (| ch = | ch = | ch = | ch = |) Concat(strToken,&ch); coutstrTokenttt;cout界符ttt;coutstrTokenendl; elseConcat(strToken,&ch);coutstrToken tt;coutThe word is wrong!tt;coutstrTokenendl;int main()Analyzer analyzer;analyzer.input(); analyzer.display();analyzer.analyzerSubFun();return 0;四、 结果分析= 简单词法分析器 =请输入一行语句:qwe do 1 * + = - 输入语句为:qwe do 1 * + = - 类型 值qwe 标识符 qwedo 关键字 do1 常数 0001*+- 算符 *+- 界符 五、 总结通过该实验 对实验原理有更深的理解。对词法分析在实践中的应用有深刻的理解。在实践的基础上,把所学过的知识应用于实际应用,更深刻的理解了词法分析以及编译原理的实际应用。熟悉了用C+语言编写词法分析器的过程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025河南洛阳栾川钼业集团股份有限公司招聘笔试参考题库附带答案详解
- 2025江苏徐州市华坤医药江苏有限公司招聘9人笔试参考题库附带答案详解
- 2025年甘肃海林中科科技股份有限公司招聘30人笔试参考题库附带答案详解
- 2025年江西省金控科技产业集团社会招聘4人(第一批次)笔试参考题库附带答案详解
- 2025年山西省晋中市昔阳县国有资本投资运营有限公司及子公司公开招聘16人笔试参考题库附带答案详解
- 2025年国网辽宁省电力有限公司高校毕业生招聘(第二批)安排笔试参考题库附带答案详解
- 2025年中国联合网络通信有限公司楚雄州分公司招聘37人笔试参考题库附带答案详解
- 2025四川南充临江东方建设集团有限公司招聘11人笔试参考题库附带答案详解
- 2025内蒙古电力集团内蒙古康远监理公司成熟型电力工程监理人才招聘61人笔试参考题库附带答案详解
- 2025中国铁建昆仑投资集团有限公司经营机构有关岗位招聘26人笔试参考题库附带答案详解
- DB65-T 4803-2024 冰川厚度测量技术规范
- 护理专业新进展介绍
- 大疆无人机培训课件
- 中级消防员维保培训课件
- 小儿推拿进修总结汇报
- 2025公司应急预案演练计划(5篇)
- 医疗机构医院全员培训制度
- 2025仓库保管员试题及答案
- 生猪养殖场实施方案
- 矛盾纠纷化解培训课件
- 2025年成人高考语文试题及答案
评论
0/150
提交评论