编译原理实验查填符号表含源代码和运行结果文档格式.docx
《编译原理实验查填符号表含源代码和运行结果文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验查填符号表含源代码和运行结果文档格式.docx(11页珍藏版)》请在冰点文库上搜索。
否则将其填入符号表,并分配编号,确定位置,输出该标识符。
2、输出标识符表。
实验环境
软件:
VC++
实验前准备
1、方案设计:
1准备模拟数据:
由于是识别符合c语言规定的标识符,故本实验中使用“测试文件.c”
2写出c语言标识符的正规式定义:
letter_→A|B|C|…Z|a|b|…z|_
digit→0|1|…9id→letter_(letter_|digit)*
3画出不确定的有限自动机
不确定的有限自动机如下:
进行化简:
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
C
D
{A}{B,C,D}
化简后的确定有限自动机如下:
4程序思想:
该实验重点是构造识别标识符的函数。
程序中,使用的数据结构如下:
structrecord
{
charname[20];
};
typedefstructrecordRECORD;
record是用来记录标识符的名字,并且规定标识符的长度最大为20
structinforame))
{
j++;
}ame,teststring);
ine=j;
p->
length++;
}
2、程序设计
#include"
"
printf("
标识符%s在符号表的第%d行\n"
teststring,j+1);
fprintf(f,"
%s\t%5d\n"
"
r"
);
if(fp==NULL)
打开文件失败!
exit(0);
}xt"
w+"
xt”
xt”命令
INFORinformation;
0’xt"
}
}xt"
xt"
文件
if(table==NULL)
printf("
文件打开失败!
exit(0);
inti=0;
ame);
fwrite(&
[i],strlen(mark[i].name),1,table);
fprintf(table,"
%4d\n"
i+1);
xt”内容如下:
include1
stdio2
h3
int4
_qq5
temp6
char7
temp_s8
search9
str10
c11
void12
main13
m14
i15
printf16
please17
input18
a19
string20
gets21
puts22
the23
you24
getchar25
if26
can27
not28
find29
else30
is31
d32
n33
for34
return35
存放符号表的文件“符号表.txt”内容如下:
使用的模拟数据“测试文件.c”如下:
#include<
>
int_qq;
int3temp;
chartemp_s;
intsearch(charstr[80],charc);
voidmain()
{
charstr[80],c;
intm,i;
pleaseinputastring:
gets(str);
puts("
pleaseinputthecharyousearch"
c=getchar();
m=search(str,c);
if(m==-1)
cannotfind"
else
thecyousearchis%d\n"
m);
}
intsearch(charstr[80],charc)
inti;
for(i=0;
str[i]!
='
\0'
;
i++)
if(str[i]==c)
{
return(i);
}
return-1;
分析:
实验过程中最大的难题是文件的操作,因为之前关于文件的操作课程没有讲,再加上很久没写代码的原因,就先学了下文件操作,实验过程中最开始“结果.txt”总是空,后来知道原来是我在创建了该文件后就关闭了,在没有打开的情况下不能进行写入结果的操作;
还有就是刚开始的“符号表.txt”每个符号后面都有不同数目的“烫”,经分析知道这种情况下每个标识符都是强制的长度一致,都是20(定义的标识符最大长度是20),这是因为向文件中写入数据时:
fwrite(&
我把每次写入的数据块长度设为了sizeof(record),而该结果是20,所以导致每个标识符长度是20.
不过该实验还有一个地方需要改进,因为对于“23aa”这样的字符串“aa”按照规定应该不是一个标识符,而在这个试验中却也把“aa”识别为了一个标识符,本来想用一个char型history来记录上个读入字符来判断识别的字符串是不是以数字开头的某字符串的后部分,但是没成功,时间关系,我再思考下如何实现该功能。