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

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
目录 一、 实验题目 3 二、 实验目的 3 三、 实验要求 4 四、 实验步骤 4 基本设计思路 4 流程框图 5 算法设计 6 函数相关说明 6 输入与输出 8 程序运行结果 9 五、 实验方案设计实现 9 六、 实验程序亮点描述 10 七、 实验程序使用说明 10 八、 实验心得体会 10 九、 源程序清单 10 实验题目 设计、编制、调试一个识别一简单语言单词的词法分析程序。程序能够识别基本字、标识符、无符号整数、浮点数、运算符和界符)。单词符号及种别表如下: 单词符号 种别编码 begin 1 if 2 then 3 while 4 do 5 end 6 l(l|d)* 10 dd* 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 x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 实验步骤 基本设计思路 基本字作为一类特殊的标识符来处理:识别出标识符,差基本字表,给出相应种别码。基本字表置初值:char *rwtab[6]={begin,if,then,while,do,end};(字符指针的数组) 识别无符号整数是将数字串转换为无符号整数。我们在getchar()的时候是把数字当做字符从外部输出读取的。将数字串345#转换为整数: (3*10+4)*10+5=345送到sum中 程序主要由2个函数组成,主函数main()和扫描子函数scanner()。扫描程序每次读取1个独立意义的单词符号,并判断单词类型。主程序做相应处理后做控制台输出。 流程框图 图 1主程序 图 2扫描子程序 算法设计 词法分析程序所用的较为重要的全局变量和需调用的函数如下: ch字符变量,存放当前读进的源程序字符。 token[8]字符数组,存放构成单词符号的字符串。 prog[80]字符数组,存放所有用户输入的字符。 syn整数,存放当前单词的种别码。 sum双精度浮点型变量,存放无符号整数,或者浮点数。 isDecimal整数,是否为浮点数。isDecimal为1,则为浮点数。 decimal双精度浮点型变量(double),浮点数的小数部分。 isExp整数,是否为指数形式表示的浮点数(即是否存在符号E或者e)。isExp为1,则为指数形式。 index整数,指数形式的幂。 isNegative整数,是否为负数幂。isNegative为1,则为负数幂,如123E-2。 scanner()扫描子程序。 getchar()从控制台读取一个字符数据。 double pow(double x,double y),计算x的y次幂。 int strcmp(char *str1,char #str2),字符串比较。 函数相关说明 接收用户输入:getchar()和do…while循环的组合 do{ ch=getchar(); prog[p++]=ch; }while(ch!=#); //输入以#号键结束 输出到控制台:do…while循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。 do{ scanner(); //扫描,单词 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 error\n); break; default: printf((%2d,%8s)\n,syn

文档评论(0)

lxm + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档