编译原理实验报告Word文件下载.docx
- 文档编号:15384376
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:17
- 大小:40.12KB
编译原理实验报告Word文件下载.docx
《编译原理实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
while"
do"
return"
break"
coutinue"
};
/*关键字类型*/
char*border[6]={"
;
"
{"
}"
("
)"
/*边界符类型*/
char*arithmetic[4]={"
+"
-"
*"
/"
/*算符类型*/
char*relation[6]={"
<
="
>
/*关系运算类型*/
char*consts[20];
char*label[20];
intconstnum=0,labelnum=0;
intsearch(charsearchchar[],intwordtype){/*查找该字符串的类型,返回该字符串在该字符串数组中索引*/
inti=0;
switch(wordtype){
case1:
for(i=0;
i<
8;
i++){/*关键字类型*/
if(strcmp(key[i],searchchar)==0)
returni+1;
}
case2:
{for(i=0;
6;
i++){
if(strcmp(border[i],searchchar)==0)/*边界符类型*/
return0;
}
case3:
4;
if(strcmp(arithmetic[i],searchchar)==0)/*算符类型*/
{returni+1;
}
case4:
i++){/*关系运算类型*/
if(strcmp(relation[i],searchchar)==0)
case5:
=constnum;
if(strcmp(consts[i],searchchar)==0)
consts[i-1]=(char*)malloc(sizeof(searchchar));
/*分配空间*/
strcpy(consts[i-1],searchchar);
constnum++;
returni;
case6:
=labelnum;
if(strcmp(label[i],searchchar)==0)
label[i-1]=(char*)malloc(sizeof(searchchar));
strcpy(label[i-1],searchchar);
labelnum++;
}
charalphaprocess(charbuffer){
intatype;
inti=-1;
charalphatp[20];
while((isalpha(buffer))||(isdigit(buffer))){
alphatp[++i]=buffer;
buffer=fgetc(fp);
/*把取出的字母放进缓冲区*/
alphatp[i+1]='
\0'
if(atype=search(alphatp,1))
printf("
%s(1,%d)\n"
alphatp,atype-1);
else{
atype=search(alphatp,6);
printf("
%s(6,%d)\n"
returnbuffer;
chardigitprocess(charbuffer){
chardigittp[20];
intdtype;
while(isdigit(buffer)){
digittp[++i]=buffer;
digittp[i+1]='
dtype=search(digittp,5);
%s(5,%d)\n"
digittp,dtype-1);
charotherprocess(charbuffer){
charothertp[20];
intotype,otypetp;
othertp[0]=buffer;
othertp[1]='
if(otype=search(othertp,3)){
%s(3,%d)\n"
othertp,otype-1);
/*打印出该符号的位置*/
returnbuffer;
if(otype=search(othertp,4)){
othertp[1]=buffer;
othertp[2]='
if(otypetp=search(othertp,4)){
printf("
%s(4,%d)\n"
returnbuffer;
else
othertp[1]='
if(buffer=='
:
'
){
if(buffer=='
='
)
=(2,2)\n"
);
if(otype=search(othertp,2)){
%s(2,%d)\n"
buffer=fgetc(fp);
if(buffer=='
if(buffer=='
(4,5)\n"
if((buffer!
\n'
)&
&
(buffer!
'
))
%cerror,notaword\n"
buffer);
buffer=fgetc(fp);
Voidmain(){
inti;
=20;
label[i]=NULL;
consts[i]=NULL;
if((fp=fopen("
wenjian.c"
r"
))==NULL)/*打开只读wenjian.c若文件为空,输出error*/
error\n"
cbuffer=fgetc(fp);
while(cbuffer!
=EOF){/*缓冲区还有符号*/
if(isalpha(cbuffer))
cbuffer=alphaprocess(cbuffer);
elseif(isdigit(cbuffer))
cbuffer=digitprocess(cbuffer);
elsecbuffer=otherprocess(cbuffer);
over\n"
getchar();
}}
Wenjian.c中的内容:
词法分析结果:
图中可以看出“if”在第1行,第0列,这里二元组的行下标从1开始,列下标从0开始的,“<
=”中,先对“<
=”进行分析,在(4,0),然后指针向前移动一个,是“=”,于是又输出了“=”的位置,(4,2),也就是说把“<
=”拆开了,分析了2次。
【实验题目】实验二递归向下分析
【实验内容】输入任意符号串,输出是本次输入的符号串是否是该文法的句子的结论。
#include<
dos.h>
chara[50],b[50],d[200],e[10];
charch;
intn1,i1=0,flag=1,n=5;
intE();
/*产生式E→TG*/
intE1();
/*产生式E→TG,E1为开始符号,为了区别于F→(E)的E*/
intT();
/*产生式T→FS*/
intG();
/*产生式G→+TG|^*/
intS();
/*产生式S→*FS|^*/
intF();
/*F→(E)|i*/
voidinput();
/*输出已经匹配的字符串*/
voidinput1();
/*输出剩余的字符串*/
voidoutput();
/*推导式计算*/
voidmain()
{
intf,p,j=0;
charx;
d[0]='
E'
/*d用于存放全部过程中的推导式*/
d[1]='
d[2]='
d[3]='
T'
d[4]='
G'
d[5]='
#'
请输入字符串(长度〈50,以#号结束)\n"
do{
scanf("
%c"
&
ch);
a[j]=ch;
/*a用于存放输入串*/
j++;
}while(ch!
n1=j;
ch=b[0]=a[0];
文法\t分析串\t\t分析字符\t剩余串\n"
f=E1();
if(f==0)return;
if(ch=='
{
accept\n"
/*当前字符为#,匹配成功*/
p=0;
x=d[p];
while(x!
){
x);
p=p+1;
x=d[p];
/*输出推导式*/
else{
回车返回\n"
getchar();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告