欢迎来到天天文库
浏览记录
ID:61511659
大小:73.54 KB
页数:19页
时间:2021-02-08
《编译原理-词法分析实验报告.docx》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、课程实验报告课程名称:编译原理(词法分析)专业班级:信息安全1001班学号:U姓名:指导教师:报告日期:2010/11/8计算机科学与技术学院1、实验目的1)设计并编制一个词法分析程序,加深对词法分析原理的理解;2)巩固对代码生成及报错处理等理论的认识;3)培养对完整系统独立分析和设计的能力;4)培养学生独立编程的能力;2、实验要求2.1待分析的简单语言的词法1.关键字beginifthenwhiledoend其中,所有的关键字均为小写。2.运算符和界符:=+-*/<<=<>>>==;()#3.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID
2、=letter(letter
3、digit)*NUM=digitdigit*4.空格由空白、制表符和换行符组成,空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略2.2各种单词符号对应的种别码,如表所示表1单词符号种别码单词符号种别码begin1:17if2:=18then3<19while4<>21do5<=22end6>23letter(letter
4、digit)*10>=24digitdigit*11=25+12;26-13(27*14)28/15#02.3词法分析程序的功能输入:所给文法的源程序字符串输出:二元组构成的序列例如:对源程
5、序输入beginx:=9;ifx>0thenx:=2*x+1/3;end#的源程序,经过词法分析的程序分析后输出为:(1,begin)(10,’x’)(18,:=)(11,9)(26,;)……3、词法分析程序的算法思想算法的基本任务是从字符串中表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。1.全局变量的设置在此程序中,需要设置两个全局变量:关键字表retab[6]、和结束标志flag=1;其中retab中元素为“begin”“if”“then”“while”“do”“end”,在程序会扫描出标识
6、符时,首先查关键字表。如果能找到匹配的单词,则该单词为关键字,否则为一般标识符。结束标志flag初始化为1,当扫描程序遇到#时,将其置为0,在主程序中检测flag==0时,会结束扫描。1.主程序main算法流程图开始读取字符串到inputStringinti=0;输入字符串长度inputLengthi7、Y4、实验结果输入:beginx:=9;ifx>0thenx:=2*x+1/3;end#,如图所示5、实验感想及总结本次实验由于书上框架已经给出,算法已经用类C语言写出,因此实验比较简单,唯一需要考虑的是空格及可能的下标溢出。自己写词法分析的程序时未按照书中所写的具有众多的全局变量,采用的是直接利用函数传递参数,因此在传递参数的时候也出了不少问题,但最后都顺利解决了。6、源代码#include//头文件#include#include#includecharGetChar(char*inp8、ut,int*index,intlength);//获取当前字符intreserve(char*s);//查看是否为关键字char*retab[6]={"begin","if","then","while","do","end"};//关键字intflag=1;//结束标志//判断是否是字母intmyIsAlpha(charch){if(islower(ch)==29、10、isupper(ch)==1){return1;}else{return0;}}//扫描函数voidscaner(char*input,intinputLength,int*index){chars11、[256]="";//保存当前的字符charch=GetChar(input,index,inputLength);intnowPosition=0;if(myIsAlpha(ch)==1)//如果是字母{while(((ch>='0'&&ch<='9')12、13、(myIsAlpha(ch)==1))&&*index<=inputLength){s[nowPosition]=ch;//添加到当前字符串中nowPosition++;ch=GetChar(input,index,inputLength);}if((ch<'0'14、15、ch>'9')&&(myIsAlpha(c16、h)==0
7、Y4、实验结果输入:beginx:=9;ifx>0thenx:=2*x+1/3;end#,如图所示5、实验感想及总结本次实验由于书上框架已经给出,算法已经用类C语言写出,因此实验比较简单,唯一需要考虑的是空格及可能的下标溢出。自己写词法分析的程序时未按照书中所写的具有众多的全局变量,采用的是直接利用函数传递参数,因此在传递参数的时候也出了不少问题,但最后都顺利解决了。6、源代码#include//头文件#include#include#includecharGetChar(char*inp
8、ut,int*index,intlength);//获取当前字符intreserve(char*s);//查看是否为关键字char*retab[6]={"begin","if","then","while","do","end"};//关键字intflag=1;//结束标志//判断是否是字母intmyIsAlpha(charch){if(islower(ch)==2
9、
10、isupper(ch)==1){return1;}else{return0;}}//扫描函数voidscaner(char*input,intinputLength,int*index){chars
11、[256]="";//保存当前的字符charch=GetChar(input,index,inputLength);intnowPosition=0;if(myIsAlpha(ch)==1)//如果是字母{while(((ch>='0'&&ch<='9')
12、
13、(myIsAlpha(ch)==1))&&*index<=inputLength){s[nowPosition]=ch;//添加到当前字符串中nowPosition++;ch=GetChar(input,index,inputLength);}if((ch<'0'
14、
15、ch>'9')&&(myIsAlpha(c
16、h)==0
此文档下载收益归作者所有