版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前言.PAGE.PAGE1目录第1章概述21.1编译原理概述21.1.1词法分析器概述2第2章词法分析器课程设计22.1课程设计目的22.2课程设计要求及内容2第3章问题分析及相关原理介绍33.1设计思想及算法33.2算法实现及模拟4第4章设计思路及关键问题的解决方法54.1设计流程图5第5章运行结果及测试分析65.1运行结果及功能说明6心得体会7附录源程序8第1章概述1.1编译原理概述编译原理是介绍编译器构造的一般原理和实现方法的课程,其中包括词法分析、语法分析、语义分析、中间代码生成、目标代码生成优化、独立于机器的优化和依赖于机器的优化等。编译器技术的发展,特别是计算机体系结构的发展对编译技术的推动,使其成为计算机专业人士所必需具备的基础知识之一。1.1.1词法分析器概述词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性〔如保留字、标识符、运算符、界限符和常量等。再把它们转换称长度统一的标准形式——属性字〔TOKEN。而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。下面我所要介绍的词法分析器是第一种把它作为主程序。第2章词法分析器课程设计2.1课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想2.2课程设计要求及内容词法分析器设计内容及要求〔1设计内容:运用所学习的编程工具编写词法分析器,本次设计我采用C++编写实现其输入输出功能。〔2设计要求及说明:完成下述文法所描述的单词符号的词法分析程序。<标识符>--><字母>|<标识符><字母>|<标识符><数字><无符号整数>--><数字>|<无符号整数><数字><分界符>-->+|-|*|/|;|<|>|{|}|<|<=|=|!=|>=|>|=|<空格><字母>-->a|…|z|A|…|Z<数字>-->0|…|9<空格>-->’’说明:1>假定该语言对字母的大小写不敏感,由指定文件读入预分析的源程序,分析结果再写入指定文件;2>语言关键字为:"if","else","then","for","while","do";第3章问题分析及相关原理介绍3.1设计思想及算法〔1主要算法的设计:该词法分析器首先扫描文件,识别出一系列具有独立意义的基本语法单位——单词,包括关键字、保留字、标识符、各种常数、各种运算符及界符等。由于我们规定的c++语言程序语句中涉及单词较少,所以在词法分析阶段忽略了单词输入错误的检查,并在扫描后输出单词符号。规定输出的单词符号格式为如下的二元式:<单词种别,单词自身的值>。c++语言中定义了属于这五种类型的大量的单词,但是由于预编译器只识别我们自定义的注释,因此预编译器处理的单词集只是c++语言中定义的单词集的一个真子集。〔2算法实现<1>fopen〔打开源文件,读入字符,对文件进行扫描,把读入的字符放入缓冲区中,然后对该字符进行判断。<2>若是字母开头,则可能是关键字或者标识符,因此进入letterprocess<>进行识别。识别的过程为:将以字母开头的字母数字串放入charletter[30]中,然后进行识别。识别的过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它是关键字,则输出其二元式;否则说明其为标识符,这时,将它与标识符表char*label[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。并输出其二元式。<3>若是数字开头,则可能是常量,因此进入numberprocess<>进行识别。识别的过程为:将其与常量表charnum[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。并输出其二元式。<4>否则进入otherprocess<>识别当前是其它字符。在识别关系运算符的时候,有可能是两个字符为一个关系运算符,所以在识别的时候要判断连续的两个是否为一个关系运算符。3.2算法实现及模拟数据结构<1>关键字:char*keyword[6]={"if","else","then","for","while","do"};<2>运算符和界符char*operatornum[16]={"+","-","*","/","<","<=",">",">=","!","=","{","}",";","<",">"}; //运算符和界符<3>常量表和标识符表char*num[20]:用于存放文件中的常量;char*label[20]:用于存放文件中的标识符。3.1.2数据模块及功能及说明<1>search<>:查找并识别当前单词类别,并给定单词类别二元式码,决定给定字符串类别码〔即单词种别和记录次序码。<2>letterprocess<>:识别当前是数组、保留字、标识符。<3>numprocess<>:识别当前是常整数、小数、负小数。<4>otherprocess<>:识别当前是其它〔标点符号等。<5>fopen<>:在默认路径下打开分析程序并读入字符串。第4章设计思路及关键问题的解决方法4.1设计流程图画出总控流程图以及取符号、取字符、查找关键字表等子程序的控制流图。第5章运行结果及测试分析5.1运行结果及功能说明……心得体会本次课程设计初步培养设计者对编译器设计的思想的了解,加深对编译原理和应用程序的理解。通过设计调试词法分析程序,实现了从程序中分出各种单词的方法,从而加深了对该知识的理解,提高了词法分析的实践能力。程序的关键点在于对对给出一段程序中的各种单词的分离。在每段程序中,单词种类可以分为:关键字,分界符,算术运算符,关系运算符,标识符和常数。关键字的判断则是通过与已知数组中列出的元素进行对比,得出该单词是否为关键字;分解符,算术运算符,关系运算符的判断与接受到的字符进行比较,得出该字符是否为分解符,算术运算符或者为关系运算符。同时在编写程序过程中也遇到了许多问题,如在vc++6.0中运行是出现了错误或是运行结果没有达到预期的效果,而出现了中断等其他的问题,在不断解决问题和发现问题的过程中,我学到了很多,我体会到实践和理论的巨大差别,并且也有所成长。附录源程序源程序代码://Lex.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<iostream>#include<string>usingnamespacestd;#defineNULL0FILE*fp;charch;char*keyword[6]={"if","else","then","for","while","do"}; //关键字char*operatornum[16]={"+","-","*","/","<","<=",">",">=","!=","=","{","}",";","<",">","#"}; //运算符和界符boolsearch<charsearchstr[],intwordtype>{ //查找是否是系统关键字或运算符或界符inti;switch<wordtype>{case1:for<i=0;i<=5;i++>{ //判断是否是关键字 if<strcmp<keyword[i],searchstr>==0> returntrue; }case2:for<i=0;i<=15;i++>{ //判断是否是运算符或界符 if<strcmp<operatornum[i],searchstr>==0> returntrue; }}returnfalse;}/*******************************************************************/charletterprocess<charch> //字母处理程序{inti=-1;charletter[30]; //定义一个字符串最大长度为30while<isalnum<ch>!=0> //判断是否为数字或字母,从文件中获得一个字符串{letter[++i]=ch;ch=fgetc<fp>;};letter[i+1]='\0'; //字符串结束if<search<letter,1>> //调用search方法,判断是否是系统关键字{ if<strcmp<keyword[0],letter>==0> cout<<"<1,"<<keyword[0]<<">"<<endl; elseif<strcmp<keyword[1],letter>==0> cout<<"<2,"<<keyword[1]<<">"<<endl; elseif<strcmp<keyword[2],letter>==0> cout<<"<3,"<<keyword[2]<<">"<<endl; elseif<strcmp<keyword[3],letter>==0> cout<<"<4,"<<keyword[3]<<">"<<endl; elseif<strcmp<keyword[4],letter>==0> cout<<"<5,"<<keyword[4]<<">"<<endl; elseif<strcmp<keyword[5],letter>==0> cout<<"<6,"<<keyword[5]<<">"<<endl;}else //若不是关键字,则为一般字符串{cout<<"<10,'"<<letter<<"'>"<<endl;}return<ch>;}/***********************************************************************************/charnumberprocess<charch> //数字处理程序{inti=-1;charnum[20];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>;}num[i+1]='\0';cout<<"错误!非法标识符:"<<num<<endl;gotou;}num[i+1]='\0'; //数字结束cout<<"<11,"<<num<<">"<<endl;u:return<ch>;}/************************************************************************************/charotherprocess<charch> //运算符和界符处理程序{inti=-1;charother[20];if<isspace<ch>!=0> //判断是否为空格之类的,如/t,/n,/r等{ch=fgetc<fp>;gotou; //若是,就返回该字符}while<<isspace<ch>==0>&&<isalnum<ch>==0>> //判断字符串是否结束{other[++i]=ch;ch=fgetc<fp>;}other[i+1]='\0'; //标示符结束if<search<other,2>>{ //调用search方法,判断是否是运算符或界符 if<strcmp<operatornum[0],other>==0> cout<<"<13,"<<operatornum[0]<<">"<<endl; elseif<strcmp<operatornum[1],other>==0> cout<<"<14,"<<operatornum[1]<<">"<<endl; elseif<strcmp<operatornum[2],other>==0> cout<<"<15,"<<operatornum[2]<<">"<<endl; elseif<strcmp<operatornum[3],other>==0> cout<<"<16,"<<operatornum[3]<<">"<<endl; elseif<strcmp<operatornum[4],other>==0> cout<<"<20,"<<operatornum[4]<<">"<<endl; elseif<strcmp<operatornum[5],other>==0> cout<<"<22,"<<operatornum[5]<<">"<<endl; elseif<strcmp<operatornum[6],other>==0> cout<<"<23,"<<operatornum[6]<<">"<<endl; elseif<strcmp<operatornum[7],other>==0> cout<<"<24,"<<operatornum[7]<<">"<<endl; elseif<strcmp<operatornum[8],other>==0> cout<<"<21,"<<operatornum[8]<<">"<<endl; elseif<strcmp<operatornum[9],other>==0> cout<<"<25,"<<operatornum[9]<<">"<<endl; elseif<strcmp<operatornum[10],other>==0> cout<<"<17,"<<operatornum[10]<<">"<<endl; elseif<strcmp<operatornum[11],other>==0> cout<<"<18,"<<operatornum[11]<<">"<<endl; elseif<strcmp<operatornum[12],other>==0> cout<<"<26,"<<operatornum[12]<<">"<<endl; elseif<strcmp<operatornum[13],other>==0> cout<<"<27,"<<operatornum[13]<<">"<<endl; elseif<strcmp<operatornum[14],other>==0> cout<<"<28,"<<operatornum[14]<<">"<<endl; else if<strcmp<operatornum[15],other>==0> cout<<"<0,"<<operatornum[15]<<">"<<endl;}else{ cout<<"错误!非法标示符:"<<other<<endl;}u:return<ch>;}/***********************************************************************************/int_tmain<int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025 高中信息技术数据与计算之数据可视化的平行堆积图设计课件
- 2026年钠离子电池在用户侧储能场景加速渗透应用前景
- 2026年压电陶瓷在汽车发动机爆震监测中的国产化突破路径
- 2026年证券集体诉讼先行赔付特别代表人诉讼机制指南
- 2026年数据资产质押贷款创新模式与估值方法
- 2026年四川实施人工智能“一号创新工程”与成渝协同推进路径
- 医患沟通中的诚信与透明课件
- 2026年电能占终端能源消费比重每年提升1%路径
- 2026年龙头企业开放应用场景带动中小企业协同攻关机制
- 2026浙江丽水市第二人民医院第一批引进高层次人才14人备考题库含完整答案详解(夺冠系列)
- MOOC 概率论与数理统计-中国矿业大学 中国大学慕课答案
- (2024年)气胸完整课件
- 工程项目合作方案计划书
- 高炉基本操作制度
- 安徽中元化工集团有限公司2万吨每年二氯异氰尿酸钠资源综合利用联产2万吨每年三氯异氰尿酸项目环境影响报告书
- 《国际共产主义运动史》课程教学大纲
- YY/T 1836-2021呼吸道病毒多重核酸检测试剂盒
- 安全经验分享-办公室职业病
- GB/T 32291-2015高压超高压安全阀离线校验与评定
- 外科学课件:第七章-重症监测治疗与复苏
- 团队与团队凝聚力打造课件
评论
0/150
提交评论