欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

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

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

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

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

    目录一、实验题目3二、实验目的3三、实验要求4四、实验步骤4基本设计思路4流程框图5算法设计6函数相关说明6输入与输出8程序运行结果9五、实验方案设计实现9六、实验程序亮点描述10七、实验程序使用说明10八、实验心得体会10九、源程序清单10一、 实验题目设计、编制、调试一个识别一简单语言单词的词法分析程序。程序能够识别基本字、标识符、无符号整数、浮点数、运算符和界符)。单词符号及种别表如下:单词符号种别编码begin1if2then3while4do5end6l(l|d)*10dd*11+13-14*15/16:17:=18<20<>21<=22>23>=24=25;26(27)28#0二、 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。三、 实验要求词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。(字符串以“#”号结束)输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)四、 实验步骤基本设计思路Ø 基本字作为一类特殊的标识符来处理:识别出标识符,差基本字表,给出相应种别码。基本字表置初值:char *rwtab6="begin","if","then","while","do","end"(字符指针的数组)Ø 识别无符号整数是将数字串转换为无符号整数。我们在getchar()的时候是把数字当做字符从外部输出读取的。将数字串345#转换为整数:(3*10+4)*10+5=345送到sum中Ø 程序主要由2个函数组成,主函数main()和扫描子函数scanner()。扫描程序每次读取1个独立意义的单词符号,并判断单词类型。主程序做相应处理后做控制台输出。流程框图图 1主程序图 2扫描子程序算法设计词法分析程序所用的较为重要的全局变量和需调用的函数如下:1) ch字符变量,存放当前读进的源程序字符。2) token8字符数组,存放构成单词符号的字符串。3) prog80字符数组,存放所有用户输入的字符。4) syn整数,存放当前单词的种别码。5) sum双精度浮点型变量,存放无符号整数,或者浮点数。6) isDecimal整数,是否为浮点数。isDecimal为1,则为浮点数。7) decimal双精度浮点型变量(double),浮点数的小数部分。8) isExp整数,是否为指数形式表示的浮点数(即是否存在符号E或者e)。isExp为1,则为指数形式。9) index整数,指数形式的幂。10) isNegative整数,是否为负数幂。isNegative为1,则为负数幂,如123E-2。11) scanner()扫描子程序。12) getchar()从控制台读取一个字符数据。13) double pow(double x,double y),计算x的y次幂。14) int strcmp(char *str1,char #str2),字符串比较。函数相关说明1. 接收用户输入:getchar()和dowhile循环的组合doch=getchar();progp+=ch;while(ch!='#'); /输入以号键结束2. 输出到控制台:dowhile循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。doscanner(); /扫描,单词switch(syn)case 11:if(isDecimal=0)printf("(%2d,%8d)n",syn,(int)sum);break;else if(isExp=1)printf("(%2d,%10.5e)n",syn,sum);isExp=0;isDecimal=0;break;else if(isDecimal=1)printf("(%2d,%8.4f)n",syn,sum);isDecimal=0;break;case -1:printf("input errorn");break;default:printf("(%2d,%8s)n",syn,token);while(syn!=0);3. 浮点数的识别,先识别数字,再识别 . ,再识别数字,再识别E或e,再识别 - ,再识别数字。elseif(ch>='0')&&(ch<='9')while(ch>='0')&&(ch<='9')sum=sum*10+ch-'0' /ch中数字本身是当做字符存放的ch=progp+;if(ch='.')isDecimal=1;ch=progp+;while(ch>='0')&&(ch<='9')/pow(x,y)计算x的y次幂temp=(ch-'0')*pow(0.1,+count);decimal=decimal+temp;/AddToDec();ch=progp+;sum=sum+decimal;if(ch='e'|ch='E')isExp=1;ch=progp+;if(ch='-')isNegative=1;ch=progp+;while(ch>='0')&&(ch<='9')/指数index=index*10+ch-'0'ch=progp+;if(isNegative)sum=sum*pow(0.1,index);elsesum=sum*pow(10,index);p-;syn=11;输入与输出词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。(字符串以“#”号结束)输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。程序运行结果五、 实验方案设计实现用C语言实现。六、 实验程序亮点描述浮点数处理部分:巧妙利用double pow(double x,double y)函数,简化了浮点数处理部分。如果是简单浮点数,如1.23,出现“.”符号,置isDeminal为1,用%f输出。如果稍微复杂一点,指数形式,但是正数幂,如1.23E2,出现“E”符号,置isExp为1,用%e输出。如果更复杂一点,指数形式,但是负数幂,如1.23E-2,出现“-”号,置isNegative为1,仍然用%e输出。如果是有符号数(有符号整数或者有符号浮点数),在识别出“+”或者“-”之后,再读后边一个字符,如果是数字,那么转至识别数字的代码段,并在末尾将sum进行相应处理。如果后边字符不是数字,证明“+”或者“-”是加减号,而非正负号。七、 实验程序使用说明用户输入待识别字符串(并以“#”结尾,表示字符串输入结束),回车后程序自动输出词法分析结果。八、 实验心得体会词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。 最初是按照老师课堂上的C语言实现这个思路进行的,但是后来老师要求将识别数字拓展到浮点数(即实数)。由于本人C语言功底不够扎实,最后只得再回过头去看了一下C语言的语法,不过最后还是通过自己的力量把东西给做出来了。很有成就感!参考文献1 张素琴,吕映芝等.编译原理M.第2版.北京:清华大学出版社,2005.22 王雷,刘志成等.编译原理课程设计M.北京:电子工业出版社,20023 何炎祥等.编译程序构造M.武汉:武汉大学出版社,19884 Holub A.Compiler Design in CM.Prentice-Hall,1990源程序代码#include<stdio.h>#include<string.h>#include<math.h>char prog80; /存放所有输入字符char token8; /存放词组char ch; /单个字符int syn,p,m,n; /syn:种别编码double sum; int count;int isSignal; /是否带正负号(0不带,1负号,2正号)int isDecimal; /是否是小数double decimal; /小数int isExp; /是否是指数int index; /指数幂int isNegative; /是否带负号double temp;int temp2;void scanner();char *rwtab6="begin","if","then","while","do","end"void main()p=0;count=0;isDecimal=0;index=0;printf("n Please input string:n");doch=getchar();progp+=ch;while(ch!='#'); /输入以号键结束p=0;doscanner(); /扫描,单词switch(syn)case 11:if(isDecimal=0)/加了1个强制类型转换printf("(%2d,%8d)n",syn,(int)sum);break;else if(isExp=1)printf("(%2d,%10.5e)n",syn,sum);isExp=0;isDecimal=0;break;else if(isDecimal=1)printf("(%2d,%8.4f)n",syn,sum);isDecimal=0;break;case -1:printf("input errorn");break;default:printf("(%2d,%8s)n",syn,token);while(syn!=0);void scanner()sum=0;decimal=0;m=0;for(n=0;n<8;n+)tokenn=NULL;ch=progp+; /从prog中读出一个字符到ch中while(ch=' ') /跳过空字符(无效输入)ch=progp+;if(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z') /ch是字母字符while(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|(ch>='0')&&(ch<='9')tokenm+=ch; /ch=>tokench=progp+; /读下一个字符tokenm+='0'p-; /回退一格syn=10; /标识符/如果是"begin","if","then","while","do","end"标识符中的一个for(n=0;n<6;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break; elseif(ch>='0')&&(ch<='9')IsNum: if(isSignal=1) /tokenm+='-' while(ch>='0')&&(ch<='9')sum=sum*10+ch-'0' /ch中数字本身是当做字符存放的ch=progp+;if(ch='.')isDecimal=1;ch=progp+;while(ch>='0')&&(ch<='9')/pow(x,y)计算x的y次幂temp=(ch-'0')*pow(0.1,+count);decimal=decimal+temp;/AddToDec();ch=progp+;sum=sum+decimal;if(ch='e'|ch='E')isExp=1;ch=progp+;if(ch='-')isNegative=1;ch=progp+;while(ch>='0')&&(ch<='9')/指数index=index*10+ch-'0'ch=progp+;/10的幂/123e3代表123*10(3)/sum=sum*pow(10,index);是错误的if(isNegative)sum=sum*pow(0.1,index);elsesum=sum*pow(10,index);if(isSignal=1)sum=-sum;isSignal=0;p-;syn=11;else switch(ch)case '<':m=0;tokenm+=ch;ch=progp+;if(ch='>')syn=21; /<>对应21tokenm+=ch;else if(ch='=')syn=22;tokenm+=ch;elsesyn=20;p-;break;case '>':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=24;tokenm+=ch;elsesyn=23;p-;break;case ':':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=18;tokenm+=ch;elsesyn=17;p-;break;case '+':temp2=progp;if(temp2>='0')&&(temp2<='9')isSignal=2;ch=progp+;goto IsNum;syn=13;tokenm+=ch;break;case '-':temp2=progp;if(temp2>='0')&&(temp2<='9')isSignal=1;ch=progp+;goto IsNum; /转到数字的识别syn=14;tokenm+=ch;break;case '*':syn=15;tokenm+=ch;break;case '/':syn=16;tokenm+=ch;break;case '=':syn=25;tokenm+=ch;break;case '':syn=26;tokenm+=ch;break;case '(':syn=27;tokenm+=ch;break;case ')':syn=28;tokenm+=ch;break;case'#':syn=0;tokenm+=ch;break;default:syn=-1;

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开