欢迎来到天天文库
浏览记录
ID:21985902
大小:300.42 KB
页数:10页
时间:2018-10-26
《编译原理实验-词法分析器的设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、集美大学计算机工程学院实验报告课程名称:编译原理班级:指导教师:姓名:实验项目编号:实验一学号:实验项目名称:词法分析器的设计实验成绩.•一、实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验内容编写一个词法分析器,从输入的源程序(编写的语言为C语言的一个子集)中,识别出各个具有独立意义的单词,即基木保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续
2、显示)三、实验要求1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。单词示例单词种别码要求保留字if、else、int、while、do每个保留字的单词种别都单独为一种标识符以字母开头且包含字母和数字的字符串标识符作为一种常数(只识别无符号整数)123、343无符号整数作为一种运算符+、-、*、八=、==、!=、〉、<、〉=、<=每符一种,也可以每一类符号一种分隔符,、;、{、}、(、)每符一种2、上述要求仅为棊本要求,可以在此棊础上扩充,例如删除注
3、释,增加识别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。3、编程语言不限。四、实验设计方案1、数据字典本实验用到的数据字典如下表所示:单词■示例标识ID保留字void、if、else、for、while、do、return、break、main、int、float、char、double、String1标识符以字母开头且包含字母和数字的字符串2常数(只识别无符号整数)无符号整数和小数3运算符+、-、*、八=、〉、<、4分隔符,、;、{、}、(、)5木实验所使用的开发语言是C语言,在Test2类中定义了以下几个函数:2.程序流
4、程图:读入文件,把A容存入string屮m=0,check=ture,error=false从string屮读出一个字符放入ch屮输出str,标识为标输出str,Y标识为标示符check=tureN71^符check=tureV输出str,标识为输出str,运算符分隔符1N清空str,ch加到str中,check=falseAch加至Ijstr屮清空str,ch加到str中,check=falsech加到str中v打印出错#include#include#include#include5、dovvs.h>//判断读入的字符是否为字母boolisLetter(charc){if((c>=’a:&&c<=.z’)6、7、(c>=W&&c<=,Z,)){returntrue;}elsereturnfalse;}//判断读入的字符是否为数字boolisDigit(charc){if(c>=*0*&&c<=嘗9*){returntrue;}elsereturnfalse;}//判断是否为关键字boolisKey(char*string){if(!strcmp(string,’’void’’)8、9、!strcmp(string,’’if’’)10、11、!s12、trcmp(string,’’for")13、14、!strcmp(string,’’while’’)15、16、!strcmp(string,”do’’)17、18、!strcmp(string,’’return’’)19、20、!strcmp(string/’break’’)21、22、!strcmp(string,’’main")23、24、!strcmp(string,"int’’)25、26、!strcmp(string,"float")27、28、!strcmp(string,"char’’)29、30、!strcmp(string,’’double’’)31、32、!strcmp(string,"String")33、)returntrue;}elsereturnfalse;boolisError(charch){if(ch==’@’34、35、ch==卞36、37、ch==38、39、ch==W40、41、ch==’〜*42、43、ch==:八]{returntrue;}elsereturnfalse;}voidmain()c存放文件中的单个字charstring[500]=””;//存放文件中读出来的字符串charstr[10]="";//存放需要对比的字符串charch,c;//ch存放文件中的单个字符(翻译时用》符(从文件中提取信息时用〉charfilename[20];//文件名intj=044、;printf(”请输入文件名进行词法翻译:”);scanf(”%sn,filename);FILE*cfPtr;if((
5、dovvs.h>//判断读入的字符是否为字母boolisLetter(charc){if((c>=’a:&&c<=.z’)
6、
7、(c>=W&&c<=,Z,)){returntrue;}elsereturnfalse;}//判断读入的字符是否为数字boolisDigit(charc){if(c>=*0*&&c<=嘗9*){returntrue;}elsereturnfalse;}//判断是否为关键字boolisKey(char*string){if(!strcmp(string,’’void’’)
8、
9、!strcmp(string,’’if’’)
10、
11、!s
12、trcmp(string,’’for")
13、
14、!strcmp(string,’’while’’)
15、
16、!strcmp(string,”do’’)
17、
18、!strcmp(string,’’return’’)
19、
20、!strcmp(string/’break’’)
21、
22、!strcmp(string,’’main")
23、
24、!strcmp(string,"int’’)
25、
26、!strcmp(string,"float")
27、
28、!strcmp(string,"char’’)
29、
30、!strcmp(string,’’double’’)
31、
32、!strcmp(string,"String")
33、)returntrue;}elsereturnfalse;boolisError(charch){if(ch==’@’
34、
35、ch==卞
36、
37、ch==
38、
39、ch==W
40、
41、ch==’〜*
42、
43、ch==:八]{returntrue;}elsereturnfalse;}voidmain()c存放文件中的单个字charstring[500]=””;//存放文件中读出来的字符串charstr[10]="";//存放需要对比的字符串charch,c;//ch存放文件中的单个字符(翻译时用》符(从文件中提取信息时用〉charfilename[20];//文件名intj=0
44、;printf(”请输入文件名进行词法翻译:”);scanf(”%sn,filename);FILE*cfPtr;if((
此文档下载收益归作者所有