编译原理实验 查填符号表(含源代码和运行结果).doc
文本预览下载声明
《编译原理》实验报告
实验1 查填符号表
姓名 学号 班级 计科1001班
时间: 2012/3/22 地点:文波
同 组 人:无
指导教师:朱少林
实验目的
1、运用所学知识,选择语言、选择算法(数据结构),编程实现符号表管理程序。
2、熟悉编译过程,训练编写程序的能力,为后续实验积累经验。
实验内容
1、运用所学知识,编程实现符号表管理程序。读出源程序中与C语言词法规定相一致的标识符,并在符号表中进行查找,若存在则输出该标识符及其编号和位置;否则将其填入符号表,并分配编号,确定位置,输出该标识符。
2、输出标识符表。
实验环境
软件:VC++6.0
实验前准备
方案设计:
准备模拟数据:由于是识别符合c语言规定的标识符,故本实验中使用 “测试文件.c”
写出c语言标识符的正规式定义:letter_→A|B|C|…Z|a|b|…z|_
digit→0|1|…9 id→letter_(letter_|digit)*
画出不确定的有限自动机
不确定的有限自动机如下:
进行化简:
A={1}
B={2,3,4,5,9}
C={3,4,5,6,8,9}
D={3,4,5,7,8,9}
状态转换表如下:
状态 letter_ digit A B B C D C C D D C D 进行化简:{A} {B,C,D}
化简后的确定有限自动机如下:
程序思想:该实验重点是构造识别标识符的函数。程序中,使用的数据结构如下:
struct record
{
char name[20];
};
typedef struct record RECORD;
record是用来记录标识符的名字,并且规定标识符的长度最大为20
struct infor//记录符号表的相关信息
{
struct record *head;
int length; //记录符号表的长度
};
typedef struct infor INFOR;
infor是用来指向record结构体的指针和符号表的长度,这个结构体主要是用于比较标识符并将识别到的标识符写入分析结果文件中即本实验中的“search_table”函数,该函数并没有直接把标识符写到文件,而是在该函数之外,新建一个文件用来放符号表,然在后来打印符号表的同时把打印的结果写该文件中去。
该程序中的“search_table”函数判断是否为新的标识符的方法就是把识别的一个标识符与已经识别的一一比较看是否相同,如不相同则表长度加1,并将该标识符填入表中
while( jistrcmp(teststring,point[j].name))
{
j++;
}//与已有的标识符一一比较
if(j==i)//说明是新的标识符
{
strcpy(point[j].name,teststring);
//point[j].line=j;
p-length++;
}
程序设计
#include stdio.h
#include stdlib.h
#include string.h
struct record
{
char name[20];
};
typedef struct record RECORD;
struct infor//记录符号表的相关信息
{
struct record *head;
int length; //记录符号表的长度
};
typedef struct infor INFOR;
void search_table(char *teststring, INFOR *p, FILE *f)//查填符号表函数,p为指向结构体的指针
{
int i=p-length;
int j=0;
RECORD *point;
point=p-head;
while( jistrcmp(teststring,point[j].name))
{
j++;
}//与已有的标识符一一比较
if(j==i)//说明是新的标识符
{
strcpy(point[j].name,teststring);
//point[j].line=j;
p-length++;
}
printf(标识符%s在符号表的第%d行\n,teststring,j+1);
fprintf(f,%s\t%5d\n,teststring,j+1);//将新的标识符写入文件分析结果文件f中
ret
显示全部