资源描述:
《编译原理实验三词法分析器的设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、集美大学实验报告课程名称:编译原理班级:指导教师:姓名:实验项目编号:实验三学号:实验项目名称:词法分析器的设计实验成绩:一、实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验内容编写一个词法分析器,从输入的源程序(编写的语言为C语言的一个子集)中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然
2、后跳过错误部分继续显示)三、实验要求1、 词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。单词示例单词种别码要求保留字if、else、int、while、do每个保留字的单词种别都单独为一种标识符以字母开头且包含字母和数字的字符串标识符作为一种常数(只识别无符号整数)123、343无符号整数作为一种运算符+、-、*、/、=、==、!=、>、<、>=、<=每符一种,也可以每一类符号一种分隔符,、;、{、}、(、)每符一种
3、2、上述要求仅为基本要求,可以在此基础上扩充,例如删除注释,增加识别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。3、编程语言不限。四、实验设计方案1、数据字典本实验用到的数据字典如下表所示:单词示例标识ID保留字void、if、else、for、while、do、return、break、main、int、float、char、double、String1标识符以字母开头且包含字母和数字的字符串2常数(只识别无符号整数)无符号整数和小数3运算符+、-、*、/、=、>、<、4分隔符,、;、{、
4、}、(、)5本实验所使用的开发语言是C语言,在Test2类中定义了以下几个函数:开始2.程序流程图:读入文件,把内容存入string中,m=0,check=ture,error=falsech是分隔符?check=false?error=ture?check=false?输出str,标识为标示符check=ture输出str,标识为运算符从string中读出一个字符放入ch中结束ch是最后一个字符?Ych是运算符?NYNerror=ture?N输出str,标识为无法识别的串check=ture,error=fals
5、eYYN输出str,标识为无法识别的串check=ture,error=falseYNYY输出str,标识为标示符check=ture输出str,标识为分隔符NNch是数字?NCh是字母?check=ture??check=ture??YYNNN打印出错清空str,ch加到str中,check=falsech加到str中清空str,ch加到str中,check=falseYYch加到str中ch是关键字???ch是数字???Y输出str,标识为关键字,check=trueNYNch加到str中,error=true
6、3、实验程序#include#include#include#include//判断读入的字符是否为字母boolisLetter(charc){if((c>='a'&&c<='z')
7、
8、(c>='A'&&c<='Z')){returntrue;}elsereturnfalse;}//判断读入的字符是否为数字boolisDigit(charc){if(c>='0'&&c<='9'){returntrue;}elsereturnfalse;}
9、//判断是否为关键字boolisKey(char*string){if(!strcmp(string,"void")
10、
11、!strcmp(string,"if")
12、
13、!strcmp(string,"for")
14、
15、!strcmp(string,"while")
16、
17、!strcmp(string,"do")
18、
19、!strcmp(string,"return")
20、
21、!strcmp(string,"break")
22、
23、!strcmp(string,"main")
24、
25、!strcmp(string,"int")
26、
27、!strcmp(st
28、ring,"float")
29、
30、!strcmp(string,"char")
31、
32、!strcmp(string,"double")
33、
34、!strcmp(string,"String")){returntrue;}elsereturnfalse;}boolisError(charch){if(ch=='@'
35、
36、ch=='$'
37、
38、ch=='&'
39、
40、ch=='#'
41、
42、c