预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

集美大学计算机工程学院实验报告 课程名称:编译原理班级: 指导教师:姓名: 实验项目编号:实验一学号: 实验项目名称:词法分析器的设计实验成绩: 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。 并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分 析方法。 二、实验内容 编写一个词法分析器,从输入的源程序(编写的语言为C语言的一个子集) 中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、 分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误 时可显示“Error”,然后跳过错误部分继续显示) 三、实验要求 1、词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符 号常常表示成以下的二元式(单词种别码,单词符号的属性值)。 单词示例单词种别码要求 保留字if、else、int、while、do每个保留字的单词种别都 单独为一种 标识符以字母开头且包含字母和数标识符作为一种 字的字符串 常数(只识别无符号123、343无符号整数作为一种 整数) 运算符+、-、*、/、=、==、!=、>、每符一种,也可以每一类 <、>=、<=符号一种 分隔符,、;、{、}、(、)每符一种 2、上述要求仅为基本要求,可以在此基础上扩充,例如删除注释,增加识 别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。 3、编程语言不限。 四、实验设计方案 1、数据字典 本实验用到的数据字典如下表所示: 单词示例标识ID 保留字void、if、else、for、while、do、return、break、1 main、int、float、char、double、String 标识符以字母开头且包含字母和数字的字符串2 常数(只识别无符号无符号整数和小数3 整数) 运算符+、-、*、/、=、>、<、4 分隔符,、;、{、}、(、)5 本实验所使用的开发语言是C语言,在Test2类中定义了以下几个函数: 2.程序流程图: 开始 读入文件,把内容存入string中, m=0,check=ture,error=false 从string中读出一个字符放入ch中 Y ch是最后一个字符?结束 N YN ch是运算符? N error=ture?ch是分隔符? YY 输出,标识为无法 strNerror=ture? 识别的串check=ture, error=falseYN 输出str,标识为无法 check=false?check=false? YY识别的串check=ture, error=false 输出str,标识为标输出str,标识为标 示符 check=tureNN示符check=ture 输出str,标识为输出str,标识为 运算符分隔符 ch是数字?N YY Ch是字母? check=tureN?NN check=ture? YY 打印出错 清空str,ch加到 清空str,ch加到ch加到str中 str中,check=falsech加到str中 str中,check=false Y ch是数字?ch是关键字? NYN 输出str,标识为关键 ch加到str中,字,check=true error=true 3、实验程序 #include<stdio.h> #include<string.h> #include<ctype.h> #include<windows.h> //判断读入的字符是否为字母 boolisLetter(charc){ if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){ returntrue; } else returnfalse; } //判断读入的字符是否为数字 boolisDigit(charc){ if(c>='0'&&c<='9'){ returntrue; } else returnfalse; } //判断是否为关键字 boolisKey(char*string){ { returntrue; } elsereturnfalse; } boolisError(charch){ if(ch=='@'||ch=='$'||ch=='&'||ch=='#'||ch=='~'||ch=='^') { returntrue; } else returnfalse; } voidmain() { 存放文件中读出来的字符串 存放需要对比的字符串 charch,c;//ch存放文件中的单个字符(翻译时用),