编译原理-预测分析程序设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]*/

相关文档
最新文档