欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    编译原理词法分析器课程设计.docx

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

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

    编译原理词法分析器课程设计.docx

    1、编译原理词法分析器 课程设计2009-2010学年第二学期编译原理课程设计报告 学院(系): 计算机科学与技术学院 班 级: 09计科专升本二班 * * 学 号: * * * 时间: 2010 年 6 月目录第1章 概述1.1 编译原理概述编译原理是介绍编译器构造的一般原理和实现方法的课程,其中包括词法分析、语法分析、语义分析、中间代码生成、目标代码生成优化、独立于机器的优化和依赖于机器的优化等。编译器技术的发展,特别是计算机体系结构的发展对编译技术的推动,使其成为计算机专业人士所必需具备的基础知识之一。1.1.1 词法分析器概述词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,

    2、逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换称长度统一的标准形式属性字(TOKEN)。而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。下面我所要介绍的词法分析器是第一种把它作为主程序。第2章 词法分析器课程设计2.1课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。同时通过某种可视化编程语言的应

    3、用,具备初步的Windows环境下的编程思想2.2 课程设计要求及内容2.2.1词法分析器设计内容及要求(1)设计内容:运用所学习的编程工具编写词法分析器,本次设计我采用C+编写实现其输入输出功能。(2)设计要求及说明:完成下述文法所描述的单词符号的词法分析程序。 -| -| -+|-|*|/|;|(|)|=|=| -a|z|A|Z -0|9 - 说明:1 假定该语言对字母的大小写不敏感,由指定文件读入预分析的源程序,分析结果再写入指定文件;2 语言关键字为:if,else,then,for,while,do;第3章 问题分析及相关原理介绍3.1 设计思想及算法(1)主要算法的设计:该词法分析

    4、器首先扫描文件,识别出一系列具有独立意义的基本语法单位单词,包括关键字、保留字、标识符、各种常数、各种运算符及界符等。由于我们规定的c+语言程序语句中涉及单词较少,所以在词法分析阶段忽略了单词输入错误的检查,并在扫描后输出单词符号。规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值)。c+ 语言中定义了属于这五种类型的大量的单词,但是由于预编译器只识别我们自定义的注释,因此预编译器处理的单词集只是c+ 语言中定义的单词集的一个真子集。(2)算法实现fopen()打开源文件,读入字符,对文件进行扫描,把读入的字符放入缓冲区中,然后对该字符进行判断。若是字母开头,则可能是关键字或者标识

    5、符,因此进入letterprocess()进行识别。识别的过程为:将以字母开头的字母数字串放入char letter30中,然后进行识别。识别的过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它是关键字,则输出其二元式;否则说明其为标识符,这时,将它与标识符表char *label20中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。并输出其二元式。若是数字开头,则可能是常量,因此进入numberprocess()进行识别。识别的过程为:将其与常量表char num20中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。并输出其二

    6、元式。否则进入otherprocess()识别当前是其它字符。在识别关系运算符的时候,有可能是两个字符为一个关系运算符,所以在识别的时候要判断连续的两个是否为一个关系运算符。3.2 算法实现及模拟3.1.1数据结构(1)关键字: char*keyword6=if,else,then,for,while,do;(2)运算符和界符char *operatornum16=+,-,*,/,=,!,=,;,(,); /运算符和界符(3)常量表和标识符表char *num20:用于存放文件中的常量;char *label20:用于存放文件中的标识符。3.1.2 数据模块及功能及说明(1) search()

    7、:查找并识别当前单词类别,并给定单词类别二元式码,决定给定字符串类别码(即单词种别)和记录次序码。(2)letterprocess(): 识别当前是数组、保留字、标识符。(3)numprocess(): 识别当前是常整数、小数、负小数。(4) otherprocess(): 识别当前是其它(标点符号等)。(5) fopen(): 在默认路径下打开分析程序并读入字符串。 第4章 设计思路及关键问题的解决方法4.1 设计流程图画出总控流程图以及取符号、取字符、查找关键字表等子程序的控制流图。第5章 运行结果及测试分析5.1运行结果及功能说明 心得体会 本次课程设计初步培养设计者对编译器设计的思想的

    8、了解,加深对编译原理和应用程序的理解。通过设计调试词法分析程序,实现了从程序中分出各种单词的方法,从而加深了对该知识的理解,提高了词法分析的实践能力。 程序的关键点在于对对给出一段程序中的各种单词的分离。在每段程序中,单词种类可以分为:关键字,分界符,算术运算符,关系运算符,标识符和常数。关键字的判断则是通过与已知数组中列出的元素进行对比,得出该单词是否为关键字;分解符,算术运算符,关系运算符的判断与接受到的字符进行比较,得出该字符是否为分解符,算术运算符或者为关系运算符。 同时在编写程序过程中也遇到了许多问题,如在vc+6.0中运行是出现了错误或是运行结果没有达到预期的效果,而出现了中断等其

    9、他的问题,在不断解决问题和发现问题的过程中,我学到了很多,我体会到实践和理论的巨大差别,并且也有所成长。参考文献1编译原理(第2版)陈意云 、 张昱等编著,高等教育出版社2c+语言语言程序设计(第三版)郑莉,董渊,张瑞丰编著,清华大学出版社3c+程序设计 (第二版)谭浩强编著,清华大学出版社附录 源程序源程序代码:/ Lex.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include using namespace std;#define NULL 0FILE *fp;char ch;char *keyword6=if,else,then,f

    10、or,while,do; /关键字char *operatornum16=+,-,*,/,=,!=,=,;,(,),#; /运算符和界符bool search(char searchstr,int wordtype) /查找是否是系统关键字或运算符或界符int i;switch(wordtype)case 1:for(i=0;i=5;i+) /判断是否是关键字 if(strcmp(keywordi,searchstr)=0) return true; case 2:for(i=0;i=15;i+) /判断是否是运算符或界符 if(strcmp(operatornumi,searchstr)=0

    11、) return true; return false;/*/char letterprocess (char ch) /字母处理程序int i=-1;char letter30; /定义一个字符串最大长度为30while (isalnum(ch)!=0) /判断是否为数字或字母,从文件中获得一个字符串 letter+i=ch; ch=fgetc(fp);letteri+1=0; /字符串结束if (search(letter,1) /调用search方法,判断是否是系统关键字 if(strcmp(keyword0,letter)=0) cout(1,keyword0)endl; else i

    12、f(strcmp(keyword1,letter)=0) cout(2,keyword1)endl; else if(strcmp(keyword2,letter)=0) cout(3,keyword2)endl; else if(strcmp(keyword3,letter)=0) cout(4,keyword3)endl; else if(strcmp(keyword4,letter)=0) cout(5,keyword4)endl; else if(strcmp(keyword5,letter)=0) cout(6,keyword5)endl;else /若不是关键字,则为一般字符串 c

    13、out(10,letter)endl;return(ch);/*/char numberprocess(char ch) /数字处理程序int i=-1;char num20;while (isdigit(ch)!=0) num+i=ch; ch=fgetc(fp);if(isalpha(ch)!=0) /判断是否为字母 while(isspace(ch)=0) /判断是否为空格之类的,如/t,/n,/r等 num+i=ch; ch=fgetc(fp); numi+1=0; cout错误!非法标识符:numendl; goto u;numi+1=0; /数字结束 cout(11,num)end

    14、l;u: return(ch);/*/char otherprocess(char ch) /运算符和界符处理程序int i=-1;char other20;if (isspace(ch)!=0) /判断是否为空格之类的,如/t,/n,/r等 ch=fgetc(fp); goto u; /若是,就返回该字符while (isspace(ch)=0)&(isalnum(ch)=0) /判断字符串是否结束 other+i=ch; ch=fgetc(fp);otheri+1=0; /标示符结束if (search(other,2) /调用search方法,判断是否是运算符或界符 if(strcmp(

    15、operatornum0,other)=0) cout(13,operatornum0)endl; else if(strcmp(operatornum1,other)=0) cout(14,operatornum1)endl; else if(strcmp(operatornum2,other)=0) cout(15,operatornum2)endl; else if(strcmp(operatornum3,other)=0) cout(16,operatornum3)endl; else if(strcmp(operatornum4,other)=0) cout(20,operatorn

    16、um4)endl; else if(strcmp(operatornum5,other)=0) cout(22,operatornum5)endl; else if(strcmp(operatornum6,other)=0) cout(23,operatornum6)endl; else if(strcmp(operatornum7,other)=0) cout(24,operatornum7)endl; else if(strcmp(operatornum8,other)=0) cout(21,operatornum8)endl; else if(strcmp(operatornum9,ot

    17、her)=0) cout(25,operatornum9)endl; else if(strcmp(operatornum10,other)=0) cout(17,operatornum10)endl; else if(strcmp(operatornum11,other)=0) cout(18,operatornum11)endl; else if(strcmp(operatornum12,other)=0) cout(26,operatornum12)endl; else if(strcmp(operatornum13,other)=0) cout(27,operatornum13)end

    18、l; else if(strcmp(operatornum14,other)=0) cout(28,operatornum14)endl; else if(strcmp(operatornum15,other)=0) cout(0,operatornum15)endl;else cout错误!非法标示符:otherendl;u: return (ch);/*/int _tmain(int argc, _TCHAR* argv) char str; cout*n; cout* *n; cout* 词法分析器 *n; cout* *n; cout*n; if (fp=fopen(lex.txt,r)=NULL) cout源程序无法打开!n; else str=fgetc(fp); while (str!=EOF) if (isalpha(str)!=0) /判断是否为字母(A Z or a z) str=letterprocess(str); else if (isdigit(str)!=0) /判断字符是否是数字(0 9) str=numberprocess(str); else /若不是,则执行其他字符处理程序 str=otherprocess(str); ; cout词法分析结束,谢谢使用!n; cout点任意键退出!n; system(pause); return 0;


    注意事项

    本文(编译原理词法分析器课程设计.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

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




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开