单词符号种别识别程序设计

上传人:无*** 文档编号:127583640 上传时间:2022-07-30 格式:DOC 页数:14 大小:116.52KB
收藏 版权申诉 举报 下载
单词符号种别识别程序设计_第1页
第1页 / 共14页
单词符号种别识别程序设计_第2页
第2页 / 共14页
单词符号种别识别程序设计_第3页
第3页 / 共14页
资源描述:

《单词符号种别识别程序设计》由会员分享,可在线阅读,更多相关《单词符号种别识别程序设计(14页珍藏版)》请在装配图网上搜索。

1、实验二 单词符号种别识别程序设计一、实验目的通过C语言词法分析程序的实现理解编译程序过程中词法分析对单词的种别识别过程。二、实验重难点单词识别三、实验内容与要求1. 阅读教材P2-P3词法分析部分内容,明确词法分析的任务。2. 阅读实验案例,明确实验要求、模块流程图和程序实现方案;3. 参考实验案例,完成简单的词法分析程序设计。四、实验学时4课时五、实验设备与环境C语言编译环境六、实验案例1. 待分析的简单的词法(1) 关键字:begin if then while do end所有的关键字都是小写。(2) 运算符和界符: = + - * / = = = ; ( ) #(3) 其他单词是标识符

2、(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。2. 各种单词符号对应的种别码见表6.1:表6.1 各种单词符号对应的种别码单词符号种别码 单词符号种别码begin1:17if2=18then320while4!=21do5237=248=25+9;26lettet(letter|digit)*10(27dight dight*11)28+13-29-1430*15!31/16#03.

3、 词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(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)4. 词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。(1) 主程序示意图:主程序示意

4、图如图6-1所示。其中初值包括以下两个方面: 关键字表的初值:关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,;置初值调用扫描子程序输出单词二元组输入串结束 否 是结束 图6-1 主程序流程图 程序中需要用到的主要变量为syn,token和sum(2) 扫描子程序的算法思想:首先设置3个变量:token用来存放构成单词符号的字

5、符串;sum用来存放整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图6-2所示。变量初始化忽略空格是否文件结束? 返回 是否字母拼字符串 数字 其他运算符、 符号界符等符号是否关键字?返回拼数 否对不同符号给出相应的syn值报错syn=10 是syn=1111syn为对应关键字的单词种别码图 6-2 扫描子程序算法流程图5. 词法分析程序的C语言程序源代码:#include #include #include #include #include #include char prog80, ch;int p,m,n;char token8;int syn,sum;char *

6、rwtab6=begin,if,then,while,do,end; /关键字表初始化scaner(); /声明一个函数名为scanser()的子函数main()p=0; printf(n please input a string(end with #):n); do scanf(%c,&ch);/用%c控制输入则空格等表示有效输入,用%S控制,空格等表示输入结束 progp+=ch; while(ch!=#);/遇到“#”,输入结束 p=0; do scaner(); switch(syn) case 11:printf( %-10d%5d )n,sum,syn);/*种别为数字时;%-1

7、0d:表示输出共占10位,%5d共占5位,右对齐左端补空格*/ break; case -1:printf(you have input a wrong stringn); getch(); exit(0); default: printf( %-10s%5d )n,token,syn); break; while(syn!=0); /“#”,syn=0 getch(); scaner() sum=0; for(m=0;m8;m+) tokenm=NULL; / token8赋初值为空,token存放待识别的单词 ch=progp+; m=0; while(ch= )|(ch=n) ch=pr

8、ogp+;/空格或回车,不用判断,直接进入下一个单词 /*如果这是一个字符串,拼字符串,判断种别码*/if(ch=a)|(ch=A) /如果首字母为字母,拼出完整字符串 /*lettet(letter|digit)判断后续字符是不是数字或字母,如果是就往下拼;如果不是,结束拼字符串*/while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=progp+; p-; /使得progp为下一个带处理的字符 syn=10; /*查关键字表,进一步判断这个字符串是标识符还是关键字*/ for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch

9、-0; ch=progp+; p-; syn=11; /*如果这是一个界符、运算符,判断种别码*/ else switch(ch)/*如果是打头,判断是 还是 = */case 打头,判断是 = */ case :tokenm+=ch; ch=progp+; if(ch=) syn=24; tokenm+=ch; else syn=23; p-; break;/*如果是+打头,判断是 + 还是 + */ case +: tokenm+=ch; ch=progp+; if(ch=+) syn=9; tokenm+=ch; else syn=13; p-; break;/*如果是-打头,判断是 -

10、 还是 - */ case -:tokenm+=ch; ch=progp+; if(ch=-) syn=29; tokenm+=ch; else syn=14; p-; break;/*如果是!打头,判断是 != 还是 ! */ case !:ch=progp+; if(ch=) syn=21; tokenm+=ch; else syn=31; p-; break;/*如果是=打头,判断是 = 还是 = */ case =:tokenm+=ch; ch=progp+; if(ch=) syn=25; tokenm+=ch; else syn=18; p-; break; case *: syn

11、=15; tokenm+=ch; break; case /: syn=16; tokenm+=ch; break; case (: syn=27; tokenm+=ch; break; case ): syn=28; tokenm+=ch; break; case : syn=7; tokenm+=ch; break; case : syn=8; tokenm+=ch; break; case ;: syn=26; tokenm+=ch; break; case : syn=30; tokenm+=ch; break; case #: syn=0; tokenm+=ch; break; ca

12、se :syn=17; tokenm+=ch; break; default: syn=-1; break; tokenm+=0;/给字符串加上字符串结束标志 6. 结果分析:输入begin x:=9; if x9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2) 如图6-3所示: 图6-3七、简单的词法分析程序的设计1. The definition of P of a provided context-free grammar is as below:P= |- | + - =2.

13、 The classes of token:关键字:if、int、for、while、do、return、break、continue;单词种别码为1。标识符:单词种别码为2。常数(无符号整数):单词种别码为3。运算符+、*、/、=、=、=、!=:单词种别码为4。界符包括:,、;、(、); 单词种别码为5。3. sample input: main()int a,b;a = 10; b = a + 20;4. sample output:(2,“main”)(5,“(”)(5,“)”)(5,“”)(1,“int”)(2,“a”)(5,“,”)(2,”b”)(5,“;”)(2,“a”)(4,“=

14、”)(3,“10”)(5,“;”)(2,“b”)(4,“=”)(2,“a”)(4,“+”)(3,“20”)(5,“;”)(5,“)5. 词法分析程序(c语言版):#include #include #include #include #include #include char prog80, ch;int p,m,n;char token8;int syn,sum;char *rwtab8=if,int,for,return,break,continue,while,do; /关键字表初始化scaner(); /声明一个函数名为scanser()的子函数main()p=0; printf(n

15、 please input a string(end with #):n); do scanf(%c,&ch);/用%c控制输入则空格等表示有效输入,用%S控制,空格等表示输入结束 progp+=ch; while(ch!=#);/遇到#,输入结束 p=0; do scaner(); switch(syn) case 3:printf(%dt %dt)n,syn,sum);/*种别为数字时;%-10d:表示输出共占10位,%5d共占5位,右对齐左端补空格*/ break; case -1:printf(you have input a wrong stringn); getch(); exit

16、(0); default: printf(%dt %st)n,syn,token); break; while(syn!=0); /#,syn=0 getch(); scaner() sum=0; for(m=0;m8;m+) tokenm=NULL; / token8赋初值为空,token存放待识别的单词 ch=progp+; m=0; while(ch= )|(ch=n) ch=progp+;/空格或回车,不用判断,直接进入下一个单词 /*如果这是一个字符串,拼字符串,判断种别码*/if(ch=a)|(ch=A) /如果首字母为字母,拼出完整字符串 /*lettet(letter|digi

17、t)判断后续字符是不是数字或字母,如果是就往下拼;如果不是,结束拼字符串*/while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=progp+; p-; /使得progp为下一个带处理的字符 syn=2;/ /*查关键字表,进一步判断这个字符串是标识符还是关键字*/ for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch-0; ch=progp+; p-; syn=3; /*如果这是一个界符、运算符,判断种别码*/ else switch(ch)/*如果是打头,判断是 还是 = */case 打头,判断是 = */ case

18、:tokenm+=ch; ch=progp+; if(ch=) syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是+打头,判断是 + 还是 + */ case +: tokenm+=ch; ch=progp+; if(ch=+) syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是-打头,判断是 - 还是 - */ case -:tokenm+=ch; ch=progp+; if(ch=-) syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是!打头,判断是 != 还是 !

19、 */ case !:ch=progp+; if(ch=) syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是=打头,判断是 = 还是 = */ case =:tokenm+=ch; ch=progp+; if(ch=) syn=4; tokenm+=ch; else syn=4; p-; break; case *: syn=4; tokenm+=ch; break; case /: syn=4; tokenm+=ch; break; case (: syn=5; tokenm+=ch; break; case ): syn=5; tokenm+=c

20、h; break; case : syn=5; tokenm+=ch; break; case : syn=5; tokenm+=ch; break; case ;: syn=5; tokenm+=ch; break; case : syn=4; tokenm+=ch; break; case ,: syn=5; tokenm+=ch; break; case :syn=5; tokenm+=ch; break; default: syn=-1; break; / tokenm+=0;/给字符串加上字符串结束标志 6. 测试数据及运行结果(可截图):截图要求可以看见源文件名为自己的姓名的拼音7. 实验结果分析,心得体会。通过这次实验,我更深刻的理解了词法分析的原理,词法分析是编译程序的基础,是为学习语法分析、语义分析以及代码生成打基础。在实验过程中,遇到了许多概念理解不深刻的问题,我重新翻阅了课本,从而更深刻的理解了词法分析的原理, 发现自己的不足之处,在今后的学习中将会有更加明确的目标.教师评语:是否完成实验程序的预备设计? 是: 不是:程序能否正常运行? 是: 不是:有无测试数据及结果分析 是: 不是:是否在本次规定时间完成所有项目? 是: 不是:实验成绩等级:教师签名:N0: 时间:

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!