如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
(完整word版)编译原理预测分析法实验报告(C语言编写)
(完整word版)编译原理预测分析法实验报告(C语言编写)
(完整word版)编译原理预测分析法实验报告(C语言编写)
编译原理
实
验
报
告
实验名称:预测分析法
姓名:
专业班级:计科
学号:
指导老师:
日期:2011年6月1日
目的要求
构造文法的语法分析程序,要求采用预测分析法对输入的字符串进行语法分析。
加深对预测分析LL(1)分析法的理解和掌握。
实验内容
对文法G进行语法分析,文法G如下所示:
*0. S→a*/
*1.S→^
*2. S→(T)
*3. T→SW*
*4.W→,SW
*5. W→ε;
并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行预测分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。
程序输入/输出示例:
输入:一个以#结束的符号串:例如:(a,a)#
输出:
步数分析栈输入串所用规则
(1)#S(a,a))#2
源程序:
//LL(1)预测分析控制程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
charstr[100];//存储待分析的句子
constcharT[]="a^(),#";//终结符,分析表的列符
constcharNT[]="STW";//非终结符,分析表的行符
/*指向产生式右部符号串*/
constchar*p[]={
/*0. S→a*/ "a",
/*1.S→^ */"^",
/*2. S→(T)*/ "(T)",
/*3. T→SW*/ "SW",
/*4.W→,SW*/ ",SW",
/*5. W→ε;*/ ""
};
//设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。
constintM[][6]={
/*a^(),#*/
/*S*/ {0,1,2,-1,-1,-1},
/*T*/ {3,3,3,-1,-1,-1},
/*W*/ {-1,-1,-1,5,4,-1}
};
voidinit()//输入待分析的句子
{
printf("请输入待分析的句子(以$结束):\n");
scanf("%s",str);
}
intlin(charc);//非终结符转换为行号
intcol(charc);//终结转换为列号
boolisNT(charc);//isNT判断是否是非终结符
boolisT(charc);//isT判断是否是终结符。
voidmain(void)
{
inti,j=0;
intflag=1,flag2=0;
charA; //设置指示句子的当前字符
charstack[20]= {'#','S'}; //栈赋初值
inttop=1; //设置栈顶指针
charX=''; //存储栈顶字符
init();
A=str[0];
printf("\t步数\t分析栈\t输入串\t所用规则\n"); //在屏幕上输出列表标题
while(1)
{
printf("\n\t(%d)\t",++j); //输出当前执行步数
for(i=0;i<=top;i++)//输出当前栈的内容(出栈前)
{
printf("%c",stack[i]);
}
printf("\t");
for(i=flag-1;str[i]!='$';i++)
{
printf("%c",str[i]);
}
if(flag2==1)
{
printf("\t%d",M[lin(X)][col(A)]);
flag2=0;
}
//出栈
X=stack[top--];
if(X=='#')//是结束符
{
if(X==A)//是结束符
{
printf("\tAcc\n");
}
elseprintf("\tERROR\n");
break;
}
elseif(isT(X))//是终结符
{
A=str[flag++];
}
elseif(isNT(X))//是否是非终结符
{
flag2=1;
//逆序入栈
for(i=strlen(p[M[lin(X)][col(A)]])-1;i>=0;i--)
{
stack[++top]=*(p[M[lin(X)][col(A)]]+i);
}
}
else
{
pr
17****21
实名认证
内容提供者
最近下载