编译原理实验 简单词法分析(含源代码和实验结果)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录一实验报告样式
《编译原理》实验报告
实验2 简单词法分析
姓名陈婷婷学号1009050121 班级计科1001班
时间:2012/4/5 地点:文波
同组人:无
指导教师:朱少林
实验目的
通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法;掌握词法分析的实现方法;上机调试编出的词法分析程序。
实验内容
⑴掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
⑵掌握词法分析的实现方法。
⑶上机调试编出的词法分析程序。
⑷为简单起见,假设编译语言为具有下特征的C_minus。该词法分析器要求至少能够识别C_minus中的以下几类单词:
a.关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写;
b.标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*;
c.常数:NUM=(+ | - |ε)digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123, -123, +123等;小数,如123.45, +123.45, -123.45;科学计数法表示的常数,如+1.23e3,-2.3e-9;
d.专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */;
实验环境
软件:VC++6.0
实验前准备
1、方案设计:
①准备模拟数据:本实验中使用“测试文件.c”
②程序思想:
该实验要识别关键字、标识符、常数、专用符号(分界符、算术运算符和关系运算符)。
对于关键字本实验主要识别10个(break、do、else float if int for switch main char),使用的数据结构为:
struct Key//用于关键字和标识符及常数,由于常数有科学计数法的表示,所以该实验中把常数当做字符串进行检测输出
{
char name[20];
int i;
int t;
};
Key keyword[10];//存放10个关键字
然后在函数void initial()对Key keyword[10]进行初始化。函数int search_key(char *teststring, FILE *f)用来将识别到的以字母开头的字符串teststring与定义的关键字一一比较,如果是关键字则把它写入文件f中,否则在检验是否是标识符;如果是关键字则返回1,否则返回0.
对与标识符和常数,使用的数据结构是一样的,这是因为识别一个标识符和识别一个常数都是要读入多个字符才能识别一个完整的,而且标识符表和常数表都是在识别过程中建立的,都所以用到的数据结构为:
struct Key//用于关键字和标识符及常数
{
char name[20];
int i;
int t;
};
struct key_infor//记录标识符表,常数表的相关信息
{
struct Key *head;
int key_length;
};
识别到一个以字母开头的符号串后如果不是关键字,就调用void search_table(char *teststring, key_infor *p, FILE *f)与已经识别到的标识符一一比较,如果是新的则赋予新的i值并打印输出到屏幕并且写入f中(只要是标志符就写入文件f中)。Main()中将识别到的标识符(不重复)写入另外的文件中。
search_table中关键部分如下:
while( j
{
j++;
}//与已有的标识符一一比较
if(j==i)//说明是新的标识符
{
strcpy(point[j].name,teststring);
p->key_length++;
point[j].i=j;
point[j].t=6;
}
识别到一个完整的常数则进行与标识符相似的处理,void search_number(char *teststring, key_infor *p, FILE *f)的思想与void search_table(char *teststring, key_infor *p, FILE *f)的基本一致。Main()中将识别到的常数(不重复)写入另外的文件中。
如果既不是字母开头也不是数字开头,则调用void search_sign(char x, FILE *file, FILE *f),该函数实现对专用符号的识别,并把识别到的专用符号写入文件f中。
该实验有六个输出文件,存放输出结果。其中与标志符相关的有两个,一个存放识别到的所有标识符(有重复,即测试文件中的所有标识符),一个存放不重复的(重复的只存一次),与常数相关的文件类似也2个,另外的的两个分别存放识别到的专用符号和关键字。
2、程序设计
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct Key//用于关键字和标识符及常数,由于常数有科学计数法的表示,所以该实验中把常数当做字符串进行检测输出
{
char name[20];
int i;
int t;
};
Key keyword[10];//存放10个关键字
struct key_infor//记录标识符表,常数表的相关信息
{
struct Key *head;
int key_length;