编译原理实验报告waiWord文件下载.docx
- 文档编号:22370045
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:60.68KB
编译原理实验报告waiWord文件下载.docx
《编译原理实验报告waiWord文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告waiWord文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
,"
E'
"
T"
T'
F"
};
//非终结符表
intlength_vn=5;
//非终结符的个数
charVT[15][5]={"
id"
+"
*"
("
)"
#"
//终结符表
intlength_vt=6;
//终结符的个数
charFa[15][10]={"
TE'
+TE'
FT'
*FT'
(E)"
//产生式表:
0:
E->
1:
->
2:
空
//3:
T->
4:
5:
空6:
F->
(E)7:
id
intanalysis_table[10][11]={0,-1,-1,0,-2,-2,0,0,0,0,0,
-1,1,-1,-1,2,2,0,0,0,0,0,
3,-2,-1,3,-2,-2,0,0,0,0,0,
-1,5,4,-1,5,5,0,0,0,0,0,
7,-2,-2,6,-2,-2,0,0,0,0,0};
//预测分析表,-1表示出错,-2表示该行终结符的follow集合,用于错误处理,正数表示产生式在数组Fa中的编号,0表示多余的列。
给文法的正规式编号:
存放在字符数组中,从0开始编号,正规式的编号即为该正规式在数组中对应的下标。
如上述Fa数组表示存储产生式。
构造正规式数组:
charP[10][10]={“E->
TE’”,”E’->
+TE’”,……..};
(正规式可只存储右半部分,如E->
TE’可存储为TE’,正规式中的符号可替换,如可将E’改为M)
构造预测分析表:
intanalyze_table[10][10]={}//数组元素值存放正规式的编号,-1表示出错
2.针对预测分析表构造方法1的查预测分析表的方法提示:
(1)查非终结符表得到非终结符的序号no1;
(2)查终结符表得到终结符的序号no2
(3)根据no1和no2查预测分析表得到对应正规式的序号no3=analyze_table[no1][no2],如果no3=-1表示出错;
(4)根据no3查找对应的正规式Fa[no3];
对正规式进行处理
3.错误处理机制
紧急方式的错误恢复方法(抛弃某些符号,继续向下分析)
(1)栈顶为非终结符A,串中当前单词属于FOLLOW(A),则从栈中弹出A(此时可认为输入串中缺少A表示的结构),继续分析。
---------错误编号为1
(2)栈顶为非终结符A,串中当前单词不属于FOLLOW(A),则可使串指针下移一个位置(认为输入串中当前单词多余),继续分析。
----------错误编号为2
(3)栈顶为终结符,且不等于串中当前单词,则从栈中弹出此终结符(认为输入串中缺少当前单词)或者将串指针下移一个位置(认为串中当前单词多余)。
在程序中可选择上述两种观点中的一种进行处理。
-------------错误编号3
4.增加了错误处理的预测分析程序预测分析程序的算法:
将“#”和文法开始符依次压入栈中;
把第一个输入符号读入a;
do{
把栈顶符号弹出并放入x中;
if(x∈VT)
{
if(x==a)将下一输入符号读入a;
elseerror(3);
}
else
if(M[x,a]=“x→y1y2…yk”)
按逆序依次把yk、yk−1、…、y1压入栈中;
输出“x→y1y2…yk”;
elseifafollow(x)error
(1);
elseerror
(2);
//在前述的数据定义中查表为-2表示afollow(x)
}while(x!
=“#”)
5.程序源代码
1.程序源代码
#include<
iostream.h>
stdio.h>
malloc.h>
//
#include<
conio.h>
#definetrue1
typedefstructLLchar
charchar_ch;
structLLchar*next;
}Lchar;
Lchar*p,*h,*temp,*top,*base;
charzhongjf;
//终结符
charfeijf;
//非终结符
inta=0,i,j,k=0,table_index;
//i,j用来表示数组中的位置,table_index用来记录10*i+j的值
inttable[5][10]=//tstring的简化表-1代表当前终结符属于follow(A)-2代表当前终结符不属于follow(A)
/*i+-*/()#%n*/
{1,-2,-2,-2,-2,1,-1,-1,-2,1},//E
{-2,1,1,-2,-2,-2,1,1,-2,-2},//G
{1,-1,-1,-2,-2,1,-1,-1,-2,1},//T
{-2,1,1,1,1,-2,1,1,1,-2},//S
{1,-1,-1,-1,-1,1,-1,-1,-1,1}//F
char*tstring[5][10]=
{
/*0123456789*/
/*i+-*/()#%n*/
{"
TG"
"
ERROR"
},//E
G->
+TG"
-TG"
ε"
},//G
FS"
},//T
S->
*FS"
/FS"
%FS"
},//S
i"
n"
}//F
//分析表
voidPush(charpchar)//压栈
temp=(Lchar*)malloc(sizeof(Lchar));
temp->
char_ch=pchar;
next=top;
top=temp;
voidPop(void)//出栈
if(top->
char_ch!
='
#'
)
top=top->
next;
voidDoForPush(intt)//输出动作
switch(t)
{
case0:
Push('
G'
);
Push('
printf("
\t\t%s%s"
展开非终结符"
tstring[i][j]);
k=0;
break;
case5:
case6:
\t\t%s%c"
错误1,跳过,弹出"
top->
char_ch);
Pop();
k=1;
case7:
case9:
case11:
+'
case12:
-'
case16:
case20:
S'
F'
case21:
/////
case22:
case25:
case27:
case29:
case33:
*'
case34:
/'
case38:
%'
case40:
i'
case41:
case43:
case44:
case45:
)'
('
case47:
case48:
case49:
n'
default:
//输出*->
ε
}
voidPrintInputString()//输出当前单词记号
Lchar*pis;
pis=h;
/*
if(pis->
char_ch=='
if(k==1)
{printf("
\t%c%c\t\t%s%c%c"
pis->
char_ch,h->
next,"
匹配终结符"
next);
else
printf("
\t%c%c"
\t%c%c%c\t\t%s%c%c%c"
next,h->
next->
\t%c%c%c"
else*/
{printf("
\t%c\t\t%s%c"
char_ch,"
\t%c"
a=1;
}//输出当前单词记号
voidPrintStack()//打印栈中符号
Lchar*psk;
psk=top;
while(psk!
=NULL)
%c"
psk->
psk=psk->
//根据符号栈和输入串中的字符确定所用的分析表表项
voidChangCharToint()//给i,j赋值
switch(feijf)
case'
:
i=0;
case'
i=1;
i=2;
i=3;
i=4;
switch(zhongjf)
j=0;
j=1;
j=2;
j=3;
j=4;
j=5;
j=6;
j=7;
j=8;
j=9;
intDoSome()//分析函数
intflag=1;
while(true)
\n"
PrintStack();
//打印栈中符号
\t"
PrintInputString();
//打印当前单词记号
feijf=top->
char_ch;
zhongjf=h->
//依次将i+i*i#赋值给zhongjf
if(feijf=='
&
&
zhongjf=='
\t\t%s"
结束"
||feijf=='
{if(feijf!
{
ChangCharToint();
//给i,j赋值
if(table[i][j]>
0)
{
Pop();
//栈顶元素出栈
table_index=10*i+j;
DoForPush(table_index);
//压栈,输出动作
continue;
}
if(table[i][j]==-1)//错误1,字符属于follow(A)集合,弹出A
{
table_index=10*i+j;
}
else
if(table[i][j]==-2)//错误2
{h=h->
\t\t错误2,跳过,h=h->
next"
else
{flag=0;
}
Pop();
//终结符出栈
if(feijf!
=h->
char_ch&
h->
printf("
错误3,弹出"
h->
else
h=h->
}
returnflag;
voidmain(intargc,char*argv[])
charch,c='
y'
;
intflag;
while(c=='
base=(Lchar*)malloc(sizeof(Lchar));
//base指向该栈
base->
next=NULL;
char_ch='
//base指向栈顶'
temp=(Lchar*)malloc(sizeof(Lchar));
next=base;
//temp->
next指向#
//temp指向'
//top指向'
h=(Lchar*)malloc(sizeof(Lchar));
//h申请一个新的结构
h->
p=h;
////p指向该栈
cout<
<
输入一个以#结束的符号串(包括+-*/()in%)"
endl;
do{
ch=getch();
printf("
ch);
//屏幕上显示输入的数据
if(ch=='
||ch=='
char_ch=ch;
char_ch等于输入数据
next=temp;
//h指向输入的数据
h=h->
//h指针向上移动一位
else//****++++++++++++++出错提醒
{
temp=p->
//temp指向输入字符串的第一个字符
\nInputawrongchar!
Inputagain:
{
if(temp!
temp->
//输出刚刚输入的数据
break;
temp=temp->
}//warning
}while(ch!
p=p->
h=p;
//h指向第一个元素
\n栈中元素\t当前单词记号\t动作"
flag=DoSome();
//进行语法分析
if(1==flag)//判断分析是否成功
\nOK!
\nError!
\nDoyouwanttogoagain?
(y/n)\n"
c=getch();
while(c!
c!
%c\n%s\n"
c,"
inputerror!
c=getch();
6.实验结果
四、心得体会:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 wai