资源描述:
《编译原理实验 查填符号表(含源代码和运行结果).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《编译原理》实验报告实验1查填符号表姓名学号班级计科1001班时间:2012/3/22地点:文波同组人:无指导教师:朱少林实验目的1、运用所学知识,选择语言、选择算法(数据结构),编程实现符号表管理程序。2、熟悉编译过程,训练编写程序的能力,为后续实验积累经验。实验内容1、运用所学知识,编程实现符号表管理程序。读出源程序中与C语言词法规定相一致的标识符,并在符号表中进行查找,若存在则输出该标识符及其编号和位置;否则将其填入符号表,并分配编号,确定位置,输出该标识符。2、输出标识符表。实验环境软件:VC++6.0实验前准备1、方案设计:①准备模拟数据:由于是识别符合c语言规定的标识符,
2、故本实验中使用“测试文件.c”②写出c语言标识符的正规式定义:letter_→A
3、B
4、C
5、…Z
6、a
7、b
8、…z
9、_digit→0
10、1
11、…9id→letter_(letter_
12、digit)*③画出不确定的有限自动机不确定的有限自动机如下:进行化简:A={1}B={2,3,4,5,9}C={3,4,5,6,8,9}D={3,4,5,7,8,9}状态转换表如下:状态letter_digitABBCDCCDDCD进行化简:{A}{B,C,D}化简后的确定有限自动机如下:①程序思想:该实验重点是构造识别标识符的函数。程序中,使用的数据结构如下:structrecord{charname[20]
13、;};typedefstructrecordRECORD;record是用来记录标识符的名字,并且规定标识符的长度最大为20structinfor//记录符号表的相关信息{structrecord*head;intlength;//记录符号表的长度};typedefstructinforINFOR;infor是用来指向record结构体的指针和符号表的长度,这个结构体主要是用于比较标识符并将识别到的标识符写入分析结果文件中即本实验中的“search_table”函数,该函数并没有直接把标识符写到文件,而是在该函数之外,新建一个文件用来放符号表,然在后来打印符号表的同时把打印的结果写该
14、文件中去。该程序中的“search_table”函数判断是否为新的标识符的方法就是把识别的一个标识符与已经识别的一一比较看是否相同,如不相同则表长度加1,并将该标识符填入表中while(jlength++;}1、程序设计#include"stdio.h"#include"stdlib.h"#include"string.h"str
15、uctrecord{charname[20];};typedefstructrecordRECORD;structinfor//记录符号表的相关信息{structrecord*head;intlength;//记录符号表的长度};typedefstructinforINFOR;voidsearch_table(char*teststring,INFOR*p,FILE*f)//查填符号表函数,p为指向结构体的指针{inti=p->length;intj=0;RECORD*point;point=p->head;while(j
16、name)){j++;}//与已有的标识符一一比较if(j==i)//说明是新的标识符{strcpy(point[j].name,teststring);//point[j].line=j;p->length++;}printf("标识符%s在符号表的第%d行",teststring,j+1);fprintf(f,"%st%5d",teststring,j+1);//将新的标识符写入文件分析结果文件f中return;}voidmain(){charreadchar;//从文件中读到的字符charteststr[20];//存放标识符charlinkstr[2]={0};//
17、用于把字符readchar连接到teststrFILE*fp;fp=fopen("测试文件.c","r");if(fp==NULL){printf("打开文件失败!");exit(0);}//打开测试文件fpFILE*result;result=fopen("结果.txt","w+");//新建打开一个存放分析结果的文件result//fclose(result);这个命令使下面调用的search_table函数不能将分析结果写入“结果.txt”//,因为