编译原理实验查填符号表(含源代码和运行结果)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
〈〈编译原理》实验报告
实验1 查填符号表
姓名学号班级计科1001班
时间:2012/3/22 地点:文波
同组人:无
指导教师:朱少林
实验目的
1、运用所学知识,选择语言、选择算法(数据结构) ,编程实现符号表管理程序。
2、熟悉编译过程,训练编写程序的能力,为后续实验积累经验。
实验内容
1、运用所学知识,编程实现符号表管理程序。读出源程序中与C语言词法规定相一致的标
识符,并在符号表中进行查找,若存在则输出该标识符及其编号和位置;否则将其填入符号表,并分配编号,确定位置,输出该标识符。
2、输出标识符表。
实验环境
软件:VC++6.0
实验前准备
1、方案设计:
①准备模拟数据:由于是识别符合c语言规定的标识符,故本实验中使用“测试文件.c”
②写出c语言标识符的正规式定义:letter_rA|B|C| ••-Z|a|b| •••z|_
digit r0|1| ••- 9 id letter_(letter_|digit)*
③画出不确定的有限自动机
不确定的有限自动机如下:
C={3,4,5,6,8,9}
D={3,4,5,7,8,9}
状态转换表如下
④程序思想:该实验重点是构造识别标识符的函数。程序中,使用的数据结构如下:
struct record
{
char name[20];
};
typedef struct record RECORD;
20
record是用来记录标识符的名字,并且规定标识符的长度最大为
struct infor// 记录符号表的相关信息
(
struct record *head;
int length; // 记录符号表的长度
};
typedef struct infor INFOR;
infor是用来指向record结构体的指针和符号表的长度,这个结构体主要是用于比较标
识符并将识别到的标识符写入分析结果文件中即本实验中的" search_table”函数,该函
数并没有直接把标识符写到文件,而是在该函数之外,新建一个文件用来放符号表,然在后来打印符号表的同时把打印的结果写该文件中去。
该程序中的"search_table”函数判断是否为新的标识符的方法就是把识别的一个标识符
与已经识别的一一比较看是否相同,如不相同则表长度加1,并将该标识符填入表中
while( j
(
j++;
}//与已有的标识符一一比较
if(j==i)// 说明是新的标识符
(
strcpy(point[j].name,teststring);
//point[j].line=j;
p->length++;
}
2、程序设计
#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;
j++;
while( 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中
return;
}
void main()
(
char readchar;//从文件中读到的字符
char teststr[20];// 存放标识符
char linkstr[2]={0};// 用于把字符readchar 连接到teststr FILE *fp;
fp=fopen("测试文件.c","r");
if (fp==NULL)
{
printf("打开文件失败!");
exit(0);
}//打开测试文件fp
FILE *result;
result=fopen("结果.txt”,"w+");//新建打开一个存放分析结果的文件result
//fclose(result);这个命令使下面调用的search_table函数不能将分析结果写入"结果.txt"
//,因为search_table函数函数中没有打开"结果.txt"命令
INFOR information;//用于指向符号表
RECORD mark[300];//定义符号表最多可以有300个符号
information.head=mark;
information.length=0;
readchar=fgetc(fp);
//char history=readchar;利用这个记录读取的上一个字符,判断是否是数字
while(readchar!=EOF)
{
teststr[0]=0;
if(readchar<='z'&& readchar>='a'||readchar>='A'&& readchar<='Z'||readchar=='_') //字母数字下划线开头,如果这个满足则下面的也一定满足
{
while(readchar<='z'&& readchar>='a'||readchar>='A'&& readchar<='Z'||readchar=='_'||readchar>='0'&& readchar<='9')
{
linkstr[0]=readchar;
strcat(teststr,linkstr);// 会自动添加'\0'
//if(history>'9'&&history<'0')