




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
词法分析器实验报告院 系: 专 业: 小组成员: 学 号: 日 期: 一、实验的目的与任务词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等分隔符号。基本符号是与输入的语言定义的词法所规定的终结符。本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续进行)。二、实验所要识别的单词分类1关键字。*key53= auto, bool, break, case, catch, char, class, const, continue, default, delete, do, double, else, enum, extern, false, float, for, friend, goto, if, inline, int, long, namespace, new, operator, private,protected, public, register, return, short, signed, sizeof, static, struct, switch,template, this, throw, true, try, typedef, typename, union, unsigned, using, virtual, void, volatile, while;2标识符。符合文法标识符,由字符和数字组成,首字符必须为下划线或字母。(hjw, wyp2319,_zhg.)3.数字。整型,浮点型,科学计数。4.运算符。*arithmetic6=+ , - , * , / , + , -; 5.关系运算符。*relation7= , , = , = ,!=;6.分界符。*border7= , , ; , , , ( , ) ,/; 三、输出格式1)若为关键字,则输出格式为;例:关键字float,输出为2)若为一般标识符,则输出格式为;例:标识符fzu,输出为3)若为数字,则输出格式为;例:数字2325,输出为4)若为算术运算符,则输出格式为;例:+,输出为5)若为关系运算符,则输出格式为;例:!=,输出为6)若出错,则输出格式为;例:错误输入为26.,则输出为四、正则表达式: 标识符 id-letter_(letter_|digit)* 无符号数 number-digit optitionalfraction optionalexponent 空白符 ws-(blank|tab|newline)+ 关系运算符 relop- |=|=|!= 运算符 operator-+|-|*|/|+|-五、DFA 状态转换图start=123other=*return(relop, NE)return(relop, LT)return(relop, EQ)return(relop, GE)return(relop, GT)startletter9other1110letter/dig*1912141316151817startotherdigit.digitE+ | -digitdigitdigitdigitEdigit*start+25+other*-262728293332other3031-*/六、流程图七、实验结果实验环境:Microsoft Windows 7下的Microsoft Visual Studio 2010输入输出输入输出输入输出八、结果分析用格式为.txt的文件输入,一个个字符去识别,根据DFA的状态图实现跳转,把未进入接受状态的单元存放进一个数组,到达接受状态,将识别出来的词和属性一起输出。其中识别得到的id与keyword转换过程相同,故最后得到的结果还要再判断是标识符还是关键字。由于关键词有限,可以建个表存放关键字,通过查表实现判断关键字。运算符和分隔符是有限的,所以把它们罗列去判断,只要是符合条件就接收。 九、实验总结实验是理论的实践,但是通过实验加深了我们对理论课知识的理解和运用,词法分析器更是如此。对输入的程序进行分析,将关键字,保留字与系统标识符分开,并对属性进行说明。更通俗的来说,也就是编写一个程序,可以实现这个功能。通过这个实验,现在我们知道了,如何用正则表达式去识别我们想要识别的单词。但如何用程序去实现整个识别过程,又该如何去一步步执行识别呢?最简单的方法,一个字符一个字符的读入,每读入一个字符,识别过程进入一个特定的状态,按照一定的次序在一系列状态间转换后,字符全部读入,状态也走入了终态。那么好了,一个单词识别完毕,这就给我们启示,从一个状态转换图可以较容易的实现程序化的识别工作。这样我们就知道如何从一个状态图去写程序了。十、实验代码#include stdafx.h#include #include #include #include #include using namespace std;ifstream fp(in.txt,ios:in);char cbuffer;char *key53= auto, bool, break, case, catch, char, class, const, continue, default,delete, do, double, else, enum, extern, false, float, for, friend, goto, if, inline, int, long, namespace, new, operator, private,protected, public, register, return, short, signed, sizeof, static, struct, switch,template,this, throw, true, try, typedef, typename, union, unsigned, using,virtual,void,volatile,while; /关键字char *border7= , , ; , , , ( , ) ,/; /分界符char *arithmetic6=+ , - , * , / , + , -; /算术运算符char *relation7= , , = , = ,!=; /关系运算符 int search(char searchchar,int wordtype)/search函数查表匹配 int i=0,t=0;switch (wordtype)case 1: for (i=0;i=52;i+) /关键字if (strcmp(keyi,searchchar)=0)return(i+1);return(0);case 2:for (i=0;i=6;i+) /分界符if (strcmp(borderi,searchchar)=0)return(i+1); return(0);case 3:for (i=0;i=5;i+) /运算符if (strcmp(arithmetici,searchchar)=0)return(i+1);return(0);case 4:for (i=0;i=6;i+) /关系运算符if (strcmp(relationi,searchchar)=0)return(i+1);return(0);char alphaprocess(char buffer) /字符处理过程int i=-1;char alphatp20;while (buffer=_|(isalpha(buffer)|(isdigit(buffer)/这两个函数分别是判字符和判数字函数位于ctype.h中alphatp+i=buffer;buffer=fp.get();alphatpi+1=0;/在末尾添加字符串结束标志if ( search(alphatp,1)coutalphatpendl;else coutalphatpendl;/标识符return(buffer);char digitprocess(char buffer) /数字处理过程int i=-1;char digittp20;while (isdigit(buffer)digittp+i=buffer; buffer=fp.get();if(buffer=.)digittp+i=buffer;buffer=fp.get();if(!isdigit(buffer)digittpi+1=0;coutdigittpendl; return(buffer);elsedigittp+i=buffer;buffer=fp.get();while(isdigit(buffer)digittp+i=buffer;buffer=fp.get();else if(buffer=E)digittp+i=buffer;buffer=fp.get();if(buffer=+|buffer=-)digittp+i=buffer;buffer=fp.get();if(isdigit(buffer)digittp+i=buffer;buffer=fp.get();else digittpi+1=0;coutdigittpendl; return(buffer);digittpi+1=0;coutdigittpendl;return(buffer);char otherprocess(char buffer) /分界符、运算符等int i=-1;char othertp20;othertp0=buffer;othertp1=0;if ( search(othertp,3) /运算符buffer=fp.get();othertp1=buffer;othertp2=0;if ( search(othertp,3) /判断该运算符是否是/由连续的两个字符组成的coutothertpendl;buffer=fp.get();goto out;else /单字符逻辑运算符othertp1=0;coutothertpendl;goto out; if ( search(othertp,4) /关系运算符buffer=fp.get();othertp1=buffer;othertp2=0;if ( search(othertp,4) /判断该关系运算符是否是/由连续的两个字符组成的coutothertpendl;buffer=fp.get();goto out;else /单字符逻辑运算符othertp1=0;coutothertpendl;goto out; if (buffer=!) /=的判断 buffer=fp.get();if (buffer=)othertp1=buffer;othertp2=0;coutothertpendl;buffer=fp.get();else coutothertpendl; /单个!的处理输出buffer=fp.get();goto out;elseif ( search(othertp,2) /分界符coutothertpendl;buffer=fp.get();goto out;if (buffer!=n)&(buffer!= )coutbufferendl;buffer=fp.get();out: return(buffer);void main()if (!fp)cout文件打开错误!endl;else fp.get (cbuff
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年废弃矿井资源再利用技术探索与产业转型升级创新路径报告001
- 2025年工业互联网平台异构数据库融合技术发展趋势预测报告
- 四位数加减法竖式计算题专项练习300道及答案
- 深度解析2025年:智能车载语音交互在车载信息服务中的技术创新报告
- 美味快餐转让合同范本
- 济南公司备案合同范本
- 物联网提升药品质量追溯-洞察及研究
- 菜粕颗粒销售合同范本
- 民间藏品收购合同范本
- 网络销售平台合同范本
- 专用车产品规模设计手册
- 储能技术-氢储能
- 西方国家的宪法制度课件
- 网站对历史发布信息进行备份和查阅的相关管理制度及执行情况的说明
- 中医四大经典题目及答案
- 近代中国交通交通运输业变迁课件
- 食品生物技术导论ppt课件
- 非油气探矿权变更延续申请登记书
- 鱼塘补偿协议书范文
- 印度白内障小切口手术学习笔记
- 卢春房副部长讲话《树立质量意识,强化风险控制,持续纵深推进铁
评论
0/150
提交评论