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

上传人:第*** 文档编号:33920345 上传时间:2018-02-19 格式:DOC 页数:10 大小:161KB
返回 下载 相关 举报
编译原理实验 查填符号表(含源代码和运行结果)_第1页
第1页 / 共10页
编译原理实验 查填符号表(含源代码和运行结果)_第2页
第2页 / 共10页
编译原理实验 查填符号表(含源代码和运行结果)_第3页
第3页 / 共10页
编译原理实验 查填符号表(含源代码和运行结果)_第4页
第4页 / 共10页
编译原理实验 查填符号表(含源代码和运行结果)_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《编译原理实验 查填符号表(含源代码和运行结果)》由会员分享,可在线阅读,更多相关《编译原理实验 查填符号表(含源代码和运行结果)(10页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告实验 1 查填符号表姓名 学号 班级 计科 1001 班时间: 2012/3/22 地点:文波同 组 人:无指导教师:朱少林实验目的 1、运用所学知识,选择语言、选择算法(数据结构) ,编程实现符号表管理程序。2、熟悉编译过程,训练编写程序的能力,为后续实验积累经验。实验内容 1、运用所学知识,编程实现符号表管理程序。读出源程序中与 C 语言词法规定相一致的标识符,并在符号表中进行查找,若存在则输出该标识符及其编号和位置;否则将其填入符号表,并分配编号,确定位置,输出该标识符。2、输出标识符表。实验环境 软件:VC+6.0 实验前准备1、 方案设计: 准备模拟数据:由于是识别符

2、合 c 语言规定的标识符,故本实验中使用 “测试文件.c” 写出 c 语言标识符的正规式定义:letter_A|B|C|Z|a|b|z|_digit0|1|9 idletter_(letter_|digit)* 画出不确定的有限自动机不确定的有限自动机如下:进行化简:A=1B=2,3,4,5,9C=3,4,5,6,8,9D=3,4,5,7,8,9状态转换表如下:状态 letter_ digitA BB C DC C DD C D进行化简:A B,C,D化简后的确定有限自动机如下: 程序思想:该实验重点是构造识别标识符的函数。程序中,使用的数据结构如下:struct recordchar nam

3、e20;typedef struct record RECORD;record 是用来记录标识符的名字,并且规定标识符的长度最大为 20struct infor/记录符号表的相关信息struct record *head;int length; /记录符号表的长度;typedef struct infor INFOR;infor 是用来指向 record 结构体的指针和符号表的长度,这个结构体主要是用于比较标识符并将识别到的标识符写入分析结果文件中即本实验中的“search_table”函数,该函数并没有直接把标识符写到文件,而是在该函数之外,新建一个文件用来放符号表,然在后来打印符号表的同时

4、把打印的结果写该文件中去。该程序中的“search_table”函数判断是否为新的标识符的方法就是把识别的一个标识符与已经识别的一一比较看是否相同,如不相同则表长度加 1,并将该标识符填入表中while( jlength+;2、 程序设计#include stdio.h#include stdlib.h#include string.hstruct recordchar name20;typedef struct record RECORD;struct infor/记录符号表的相关信息struct record *head;int length; /记录符号表的长度;typedef stru

5、ct 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( jlength+;printf(标识符%s 在符号表的第%d 行n,teststring,j+1);fprintf(f,%st%5dn,teststring,j+1);/将新的标识符写入文件分析结果文件 f 中return;void main()char readchar;/从文件中读到的字符char te

6、ststr20;/存放标识符char linkstr2=0;/用于把字符 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”/,因为 search_table 函数函数中没有打开 “结果.txt”命令INFOR infor

7、mation;/用于指向符号表RECORD mark300;/定义符号表最多可以有 300 个符号information.head=mark;information.length=0;readchar=fgetc(fp);/char history=readchar;利用这个记录读取的上一个字符,判断是否是数字while(readchar!=EOF)teststr0=0;if(readchar=a|readchar=A& readchar=a|readchar=A& readchar=0& readchar9&historyint _qq;int 3temp;char temp_s;int s

8、earch(char str80, char c);void main()char str80,c;int m,i;printf(please input a string:);gets(str);puts(please input the char you search);c=getchar();m=search(str,c);if(m=-1)printf(can not find);else printf(the c you search is %dn,m);int search(char str80,char c)int i;for(i=0;stri!=0;i+)if(stri=c)re

9、turn(i);return -1;分析:实验过程中最大的难题是文件的操作,因为之前关于文件的操作课程没有讲,再加上很久没写代码的原因,就先学了下文件操作,实验过程中最开始 “结果.txt”总是空,后来知道原来是我在创建了该文件后就关闭了,在没有打开的情况下不能进行写入结果的操作;还有就是刚开始的“符号表.txt”每个符号后面都有不同数目的 “烫” ,经分析知道这种情况下每个标识符都是强制的长度一致,都是 20(定义的标识符最大长度是 20),这是因为向文件中写入数据时:fwrite(我把每次写入的数据块长度设为了 sizeof(record),而该结果是 20,所以导致每个标识符长度是 20.不过该实验还有一个地方需要改进,因为对于“23aa”这样的字符串 “aa”按照规定应该不是一个标识符,而在这个试验中却也把“aa”识别为了一个标识符,本来想用一个 char型 history 来记录上个读入字符来判断识别的字符串是不是以数字开头的某字符串的后部分,但是没成功,时间关系,我再思考下如何实现该功能。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号