计算LL1分析法实验报告Word格式文档下载.docx
- 文档编号:17915870
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:8
- 大小:64.89KB
计算LL1分析法实验报告Word格式文档下载.docx
《计算LL1分析法实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算LL1分析法实验报告Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。
(8)F->
i
输出的格式如下:
(1)提示:
本程序只能对由'
i'
'
+'
*'
('
)'
构成的以'
#'
结束的字符串进行分析
(2)请输入要分析的字符串:
(3)输出过程如下:
步骤分析栈剩余输入串所用产生式
1Ei+i*i#E->
TG
(4)输入符号串为非法符号串(或者为合法符号串)
备注:
(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;
如果为匹配终结符则写明匹配的终结符;
如分析异常出错则写为“分析出错”;
若成功结束则写为“分析成功”。
(2)在此位置输入符号串为用户自行输入的符号串。
(3)上述描述的输出过程只是其中一部分的。
注意:
1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);
二、实验步骤
.程序编写
(1)定义部分:
定义常量、变量、数据结构。
(2)初始化:
设立LL
(1)分析表、初始化变量空间(包括堆栈、结构体、
数组、临时变量等);
(3)控制部分:
从键盘输入一个表达式符号串;
(4)利用LL
(1)分析算法进行表达式处理:
根据LL
(1)分析表对表达式
符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。
三、实验过程记录:
(1)写出程序
/*LL
(1)分析法源程序,只能在VC++中运行*/
#include<
stdio.h>
stdlib.h>
string.h>
dos.h>
charA[20];
/*分析栈*/
charB[20];
/*剩余串*/
charv1[20]={'
};
/*终结符*/
charv2[20]={'
E'
G'
T'
S'
F'
/*非终结符*/
intj=0,b=0,top=0,l;
/*L为输入串长度*/
typedefstructtype/*产生式类型定义*/
{
charorigin;
/*大写字符*/
chararray[5];
/*产生式右边字符*/
intlength;
/*字符个数*/
}type;
typee,t,g,g1,s,s1,f,f1;
/*结构体变量*/
typeC[10][10];
/*预测分析表*/
voidprint()/*输出分析栈*/
inta;
/*指针*/
for(a=0;
a<
=top+1;
a++)
printf("
%c"
A[a]);
printf("
\t\t"
);
}/*print*/
voidprint1()/*输出剩余串*/
intj;
for(j=0;
j<
b;
j++)/*输出对齐符*/
"
for(j=b;
=l;
j++)
B[j]);
\t\t\t"
}/*print1*/
voidmain()
intm,n,k=0,flag=0,finish=0;
charch,x;
typecha;
/*用来接受C[m][n]*/
/*把文法产生式赋值结构体*/
e.origin='
;
strcpy(e.array,"
TG"
e.length=2;
t.origin='
strcpy(t.array,"
FS"
t.length=2;
g.origin='
strcpy(g.array,"
+TG"
g.length=3;
g1.origin='
g1.array[0]='
^'
g1.length=1;
s.origin='
strcpy(s.array,"
*FS"
s.length=3;
s1.origin='
s1.array[0]='
s1.length=1;
f.origin='
strcpy(f.array,"
(E)"
f.length=3;
f1.origin='
f1.array[0]='
f1.length=1;
for(m=0;
m<
=4;
m++)/*初始化分析表*/
for(n=0;
n<
=5;
n++)
C[m][n].origin='
N'
/*全部赋为空*/
/*填充分析表*/
C[0][0]=e;
C[0][3]=e;
C[1][1]=g;
C[1][4]=g1;
C[1][5]=g1;
C[2][0]=t;
C[2][3]=t;
C[3][1]=s1;
C[3][2]=s;
C[3][4]=C[3][5]=s1;
C[4][0]=f1;
C[4][3]=f;
提示:
结束的字符串进行分析,\n"
请输入要分析的字符串:
"
do/*读入分析串*/
{
scanf("
&
ch);
if((ch!
='
)&
&
(ch!
)&
))
输入串中有非法字符\n"
exit
(1);
}
B[j]=ch;
j++;
}while(ch!
l=j;
/*分析串长度*/
ch=B[0];
/*当前分析字符*/
A[top]='
A[++top]='
/*'
进栈*/
步骤\t\t分析栈\t\t剩余字符\t\t所用产生式\n"
do
x=A[top--];
/*x为当前栈顶字符*/
%d"
k++);
j++)/*判断是否为终结符*/
if(x==v1[j])
{
flag=1;
break;
}
if(flag==1)/*如果是终结符*/
if(x=='
)
{
finish=1;
/*结束标记*/
printf("
acc!
\n"
/*接受*/
getchar();
exit
(1);
}/*if*/
if(x==ch)
print();
print1();
%c匹配\n"
ch);
ch=B[++b];
/*下一个输入字符*/
flag=0;
/*恢复标记*/
else/*出错处理*/
%c出错\n"
/*输出出错终结符*/
}/*else*/
}/*if*/
else/*非终结符处理*/
for(j=0;
if(x==v2[j])
{
m=j;
/*行号*/
break;
}
if(ch==v1[j])
n=j;
/*列号*/
cha=C[m][n];
if(cha.origin!
)/*判断是否为空*/
%c-"
cha.origin);
/*输出产生式*/
for(j=0;
cha.length;
cha.array[j]);
for(j=(cha.length-1);
j>
=0;
j--)/*产生式逆序入栈*/
A[++top]=cha.array[j];
if(A[top]=='
)/*为空则不进栈*/
top--;
x);
/*输出出错非终结符*/
}/*else*/
}while(finish==0);
}/*main*/
(2)给出运行结果
四、实验总结:
通过对语法分析程序的设计和编写,使自己获得了很大的收获,并且使自己对语法分析程序的功能有了更进一步认识。
虽然在程序的设计和编写过程中出现了一些错误,但是经过同学的帮助和指导,顺利的将程序中存在的错误顺利解决,从而顺利完成了本程序的设计和编程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 LL1 分析 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)