编译原理-预测分析程序设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告《编译原理》课程
预测分析程序设计与实现
一、实验目的及要求
1.根据文法采用手工方式或程序方式构造预测分析表的构造;
2.若采用程序方式构造预测分析表,还需要考察文法、First(α)、Follow(A)的计算机
实现,有一定难度,可以给予较高加分;
3.必须针对相应预测分析表,设计并实现预测分析总控程序,从而完成一个具有自上而
下分析能力的语法分析器(Parser)
二、实验内容
◆构造该文法的预测分析表
◆实现预测分析的总控程序
三、实验原理
LL(1)文法的判定
First集与Follow集的构造
预测分析表的设计
预测分析总控程序的设计与实现
四、文法的定义
E→TE’
E’→+TE’|ε
T→FT’
T’→*FT’|ε
F→(E)|i
五、实验步骤
1.设计上下文无关文法;
2.构造该文法的预测分析表;
3.设计并实现相应的预测分析总控程序;
六、描述核心数据结构和算法。
/*函数的定义*/
int yuCeFenXi()
{
char X; /*X变量存储每次弹出的栈顶元素*/
char a; /*a变量存储用户输入串的第一个元素*/
int i;
int counter=1; /*该变量记录语法分析的步骤数*/
init(); /*初始化数组*/
printf("wen fa : \n\n"); /*输出文法做为提示*/
printf("E->Te \n");
printf("e->+Te | $ \n");
printf("T->Ft \n");
printf("t->*Ft|$\n");
printf("F ->(E)|i \n");
printf("input string ,'#' is a end sign !!( i1+i2 ) \n "); /*提示用户输入将要测试的字符串*/
scanf("%s",inputString);
push('#');
push('E');
printf(" Counter-----Stack---------------Input string "); /*输出结果提示语句*/
while(1) /*while循环为语法分析主功能语句块*/
{
printf(" ");
printf("\n");
printf(" %d",counter); /*输出分析步骤数*/
printf(" "); /*输出格式控制语句*/
printStack(); /*输出当前栈内所有元素*/
X=pop(); /*弹出栈顶元素赋给变量X*/
printinputString(); /*输出当前用户输入的字符串*/
if( search(X)==0 ) /*在终结符集合VT中查找变量X的值,存在返回 1,否则返回 0*/
{
if(X == '#') /*栈已经弹空,语法分析结果正确,返回 1*/
{
printf("success ... "); /*语法分析结束,输入字符串符合文法定义*/
return 1;
}
else
{
a = inputString[firstCharIntex];
if( M(X,a)==1 ) /*查看预测分析表M[A,a]是否存在产生式,存在返回1,不存在返回0*/
{
for(i=0;i<13;i++) /* '$'为产生式的结束符,for循环找出该产生式的最后一个元素的下标*/
{
if( chanShengShi[i]=='$' ) break;
}
i-- ; /*因为 '$' 不是产生式,只是一个产生式的结束标志,所以i自减1*/
while(i>=0)
{
push( chanShengShi[i] ); /*将当前产生式逆序压入栈内*/
i-- ;
}
}
else
{
printf(" error(1) !!"); /*若预测分析表M[A,a]不存在产生式,说明语法错误*/
return 0;
}
}
}
else /*说明X为终结符*/
{
if( X==inputString[firstCharIntex] ) /*如果X等于a,说明a匹配*/
{
firstCharIntex++; /*输入串的第一个元素被约去,下一个元素成为新的头元素*/
}
else
{
printf(" error(2) !! ");
return 0;
}
}
counter++;
}
}
void init()
{
int i;
for(i=0;i<13;i++)
{
inputString[i]=NULL; /*初始化数组inputString[10] */
stack[i]=NULL; /*初始化栈stack[10] */
chanShengShi[i]=NULL; /*初始化数组chanShengShi[10]*/