编译原理实验查填符号表(含源代码和运行结果)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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')

相关文档
最新文档