编译原理-词法分析实验报告.docx

上传人:飞****2 文档编号:51843356 上传时间:2022-10-20 格式:DOCX 页数:17 大小:73.54KB
返回 下载 相关 举报
编译原理-词法分析实验报告.docx_第1页
第1页 / 共17页
编译原理-词法分析实验报告.docx_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《编译原理-词法分析实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理-词法分析实验报告.docx(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、课 程 实 验 报 告课程名称: 编译原理(词法分析) 专业班级: 信息安全1001班 学 号: U 姓 名: 指导教师: 报告日期: 2010/11/8 计算机科学与技术学院1、实验目的1) 设计并编制一个词法分析程序,加深对词法分析原理的理解;2) 巩固对代码生成及报错处理等理论的认识;3) 培养对完整系统独立分析和设计的能力;4) 培养学生独立编程的能力;2、实验要求2.1 待分析的简单语言的词法1. 关键字begin if then while do end 其中,所有的关键字均为小写。2. 运算符和界符: = + - * / = = = ; ( ) # 3. 其他单词是标识符(ID)

2、和整形常数(NUM),通过以下正规式定义:ID = letter(letter| digit)*NUM= digit digit*4. 空格由空白、制表符和换行符组成,空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略2.2 各种单词符号对应的种别码,如表所示表1单词符号种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 19 while 4 21 do 5 23letter(letter| digit)* 10 = 24digit digit* 11 = 25 + 12 ; 26 - 13 ( 27 * 14 ) 28 / 15 #

3、 02.3 词法分析程序的功能输入:所给文法的源程序字符串输出:二元组构成的序列例如:对源程序输入begin x:=9; if x0 then x:= 2*x+1/3 ; end # 的源程序,经过词法分析的程序分析后输出为:(1,begin)(10,x)(18,:=)(11,9)(26,;)3、词法分析程序的算法思想算法的基本任务是从字符串中表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。 1. 全局变量的设置 在此程序中,需要设置两个全局变量: 关键字表retab6、和结束标志 flag=1; 其中retab中元素为 “b

4、egin” “if” “then” “while” “do” “end”,在程序会扫描出标识符时,首先查关键字表。如果能找到匹配的单词,则该单词为关键字,否则为一般标识符。结束标志flag初始化为1,当扫描程序遇到#时,将其置为0,在主程序中检测flag=0时,会结束扫描。2. 主程序main算法流程图开始读取字符串到inputStringint i =0;输入字符串长度inputLengthi 0 then x:= 2*x+1/3 ; end #,如图所示5、实验感想及总结 本次实验由于书上框架已经给出,算法已经用类C语言写出,因此实验比较简单,唯一需要考虑的是空格及可能的下标溢出。自己写词

5、法分析的程序时未按照书中所写的具有众多的全局变量,采用的是直接利用函数传递参数,因此在传递参数的时候也出了不少问题,但最后都顺利解决了。6、源代码#include /头文件#include#include#includechar GetChar(char *input,int *index,int length);/获取当前字符int reserve(char *s);/查看是否为关键字char *retab6=begin,if,then,while,do,end;/关键字int flag=1;/结束标志/判断是否是字母int myIsAlpha(char ch)if(islower(ch)=

6、2 | isupper(ch)=1) return 1; elsereturn 0;/扫描函数void scaner(char *input,int inputLength,int *index)char s256=; /保存当前的字符char ch=GetChar(input,index,inputLength);int nowPosition=0;if(myIsAlpha(ch)=1) /如果是字母 while(ch=0 & ch=9) | (myIsAlpha(ch)=1 ) )& *index =inputLength) snowPosition=ch; /添加到当前字符串中 nowP

7、osition+; ch=GetChar(input,index,inputLength); if(ch 9) &(myIsAlpha(ch)=0 ) )/进行回退操作,并输出结果 snowPosition=0;/添加结束标志 if(reserve(s)=0) printf(10,%s),s); (*index)-; return; else /超过范围 snowPosition+=ch; snowPosition=0;/添加结束标志 if(reserve(s)=0) printf(10,%s),s); printf(n谢谢使用,按任何键退出!n); getchar(); exit(0); r

8、eturn; elseif(ch=0 & ch=0 & ch=9& *index =inputLength) snowPosition=ch; /添加到当前字符串中 nowPosition+; ch=GetChar(input,index,inputLength); if(ch9)/进行回退操作 printf(11,%d),atoi(s); (*index)-; return; else /超过范围时 snowPosition=ch; printf(11,%d),atoi(s); printf(n谢谢使用,按任何键退出!n);getchar();exit(0); else switch(ch)

9、case +:printf(13,+);return;case -:printf(14,-);return ;case *:printf(15,*);return ;case /:printf(16,/);return ;case : ch=GetChar(input,index,inputLength);if(ch=) printf(22,) printf(21,); return ;else printf(20,inputLength)printf(n谢谢使用,按任何键退出!n); getchar(); exit(0);return;else (*index)-; return ; cas

10、e : ch=GetChar(input,index,inputLength);if(ch=) printf(24,=); return ;else printf(23,);if(*indexinputLength)printf(n谢谢使用,按任何键退出!n); getchar(); exit(0);return;else (*index)-; return ;case :ch=GetChar(input,index,inputLength);if(ch=) printf(18,:=); return ;elseprintf(17,:); if(*indexinputLength)printf

11、(n谢谢使用,按任何键退出!n); getchar(); exit(0);return;else (*index)-; return ; case =:printf(25,=);return ;case ;:printf(26,;);return ;case (:printf(27,();return ;case ):printf(28,);return ;case #:printf(0,;#);flag=0;return ;case : return ; default: printf(非法符号); /检查是否为关键字int reserve(char *s)if(strcmp(s,retab

12、0)=0)printf(1,%s),retab0); return 1;elseif(strcmp(s,retab1)=0) printf(2,%s),retab1); return 1; elseif(strcmp(s,retab2)=0) printf(3,%s),retab2); return 1; else if(strcmp(s,retab3)=0) printf(4,%s),retab3); return 1; else if(strcmp(s,retab4)=0) printf(5,%s),retab4); return 1; else if(strcmp(s,retab5)=0

13、) printf(6,%s),retab5); return 1; else return 0; char GetChar(char *input,int *index,int length)if(*index = length) (*index)+; return input(*index)-1;elsereturn 0; void main(void)char inputString80;int i =0;int inputLength=0; /字符长度char ch;/当前字符 printf(请输入字符串:); while(ch =getchar() != 10) inputStringinputLength+=ch;inputLength-;/长度减一 printf(n输出序列:); while(i=inputLength) scaner( inputString,inputLength,&i); if(flag=0)/结束 break; printf(n谢谢使用,按任何键退出!n); getchar();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com