实验四 LL1语法分析程序的设计与实现C语言.docx
- 文档编号:10150974
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:15
- 大小:31.40KB
实验四 LL1语法分析程序的设计与实现C语言.docx
《实验四 LL1语法分析程序的设计与实现C语言.docx》由会员分享,可在线阅读,更多相关《实验四 LL1语法分析程序的设计与实现C语言.docx(15页珍藏版)》请在冰豆网上搜索。
实验四LL1语法分析程序的设计与实现C语言
实验四LL
(1)文法识别程序设计
一、实验目的
通过LL
(1)文法识别程序的设计理解自顶向下的语法分析思想。
二、实验重难点
FIRST集合、FOLLOW集合元素的求解,预测分析表的构造
三、实验内容与要求
实验内容:
1.熟悉VisualC++6.0集成开发环境,掌握VC下创建工程的方法和步骤;
2.阅读参考代码,对源代码进行改造,使之能解决指定的文法识别过程;
3.预测分析表的构造
四、实验学时
4课时
五、实验设备与环境
C语言编译环境
六、根据实验过程填写下列内容
1.测试数据及结果分析
2.在原有代码的基础上选择教材中P96例题1文法,对该程序进行改造,使之能实现对新文法的识别。
(此处写代码)
#include"stdio.h"
#include"malloc.h"
typedefstructLchar{
charchar_ch;
structLchar*next;
}Lchar;
Lchar*p,*h,*temp,*top,*base;
charcurchar;
charcurtocmp;
intright;
inttable[4][5]={{1,0,0,0,0},{1,1,0,0,0},{1,1,1,1,0},
{1,0,0,1,0,}};
inti,j;
voidpush(charpchar){
temp=(Lchar*)malloc(sizeof(Lchar));
temp->char_ch=pchar;
temp->next=top;top=temp;
}
voidpop(void){
curtocmp=top->char_ch;
if(top->char_ch!
='#')
top=top->next;
}
voiddoforpush(intt){
switch(t){
case0:
push('H');push('a');break;
case10:
push('d');push('M');push('a');break;
case11:
push('d');break;
case20:
push('b');push('A');break;
case21:
break;
case22:
break;
case23:
push('b');push('A');break;
case30:
push('M');push('a');break;
case33:
push('e');
}
}
voidchangchartoint(){
switch(curtocmp){
case'H':
i=1;break;
case'A':
i=3;break;
case'S':
i=0;break;
case'M':
i=2;
}
switch(curchar){
case'a':
j=0;break;
case'd':
j=1;break;
case'b':
j=2;break;
case'e':
j=3;break;
case'#':
j=4;
}
}
voiddosome(void){
intt;
for(;;){
pop();
curchar=h->char_ch;
printf("\n%c\t%c\n",curchar,curtocmp);
if(curtocmp=='#'&&curchar=='#')
break;
if(curtocmp=='S'||curtocmp=='H'||curtocmp=='M'||curtocmp=='A'){
if(curtocmp!
='#'){
changchartoint();
if(table[i][j]){
t=10*i+j;
doforpush(t);
continue;
}
else{
right=0;break;
}
}
elseif(curtocmp!
=curchar){
right=0;break;
}
else
break;
}
elseif(curtocmp!
=curchar)
{
right=0;break;
}
else
{
h=h->next;continue;
}
}
}
voidmain(void){
charch;
right=1;
base=(Lchar*)malloc(sizeof(Lchar));
base->next=NULL;
base->char_ch='#';
temp=(Lchar*)malloc(sizeof(Lchar));
temp->next=base;
temp->char_ch='S';
top=temp;
h=(Lchar*)malloc(sizeof(Lchar));
h->next=NULL;
p=h;
do{
ch=getchar();
putchar(ch);
if(ch=='a'||ch=='d'||ch=='b'||ch=='e'||ch=='#'){
temp=(Lchar*)malloc(sizeof(Lchar));
temp->next=NULL;
temp->char_ch=ch;
h->next=temp;
h=h->next;
}
else{
temp=p->next;
printf("\nInputawrongchar!
Inputagain:
\n");
for(;;){
if(temp!
=NULL)
printf("%c",temp->char_ch);
else
break;
temp=temp->next;
}
}
}while(ch!
='#');
p=p->next;
h=p;
dosome();
if(right)
printf("\nOK!
\n");
else
printf("\nError!
\n");
getchar();
}
教师评语:
是否完成实验程序的预备设计?
是:
不是:
程序能否正常运行?
是:
不是:
有无测试数据及结果分析是:
不是:
是否在本次规定时间完成所有项目?
是:
不是:
实验成绩等级:
教师签名:
N0:
时间:
参考程序:
/************************************/
/*程序名称:
LL
(1)文法分析程序*/
/*E->E+T|E-T|T*/
/*T->T*F|T/F|F*/
/*F->(E)|i*/
/************************************/
/********************************************/
/*程序相关说明*/
/*A=E’B=T’*/
/*0=E1=E’2=T3=T’4=F*/
/*0=i1=+2=-3=*4=/5=(6=)7=#*/
/************************************/
#include"stdio.h"
#include"malloc.h"
typedefstructLchar{
charchar_ch;
structLchar*next;
}Lchar;
Lchar*p,*h,*temp,*top,*base;
charcurchar;
charcurtocmp;
intright;
inttable[5][8]={{1,0,0,0,0,1,0,0},{0,1,1,0,0,0,1,1},{1,0,0,0,0,1,0,0},
{0,1,1,1,1,0,1,1},{1,0,0,0,0,1,0,0}};
inti,j;
voidpush(charpchar){
temp=(Lchar*)malloc(sizeof(Lchar));
temp->char_ch=pchar;
temp->next=top;top=temp;
}
voidpop(void){
curtocmp=top->char_ch;
if(top->char_ch!
='#')
top=top->next;
}
voiddoforpush(intt){
switch(t){
case0:
push('A');push('T');break;
case5:
push('A');push('T');break;
case11:
push('A');push('T');push('+');break;
case12:
push('A');push('T');push('-');break;
case20:
push('B');push('F');break;
case25:
push('B');push('F');break;
case33:
push('B');push('F');push('*');break;
case34:
push('B');push('F');push('/');break;
case40:
push('i');break;
case45:
push(')');push('E');push('(');
}
}
voidchangchartoint(){
switch(curtocmp){
case'A':
i=1;break;
case'B':
i=3;break;
case'E':
i=0;break;
case'T':
i=2;break;
case'F':
i=4;
}
switch(curchar){
case'i':
j=0;break;
case'+':
j=1;break;
case'-':
j=2;break;
case'*':
j=3;break;
case'/':
j=4;break;
case'(':
j=5;break;
case')':
j=6;break;
case'#':
j=7;
}
}
voiddosome(void){
intt;
for(;;){
pop();
curchar=h->char_ch;
printf("\n%c\t%c\n",curchar,curtocmp);
if(curtocmp=='#'&&curchar=='#')
break;
if(curtocmp=='A'||curtocmp=='B'||curtocmp=='E'||curtocmp=='T'||curtocmp=='F'){
if(curtocmp!
='#'){
changchartoint();
if(table[i][j]){
t=10*i+j;
doforpush(t);
continue;
}
else{
right=0;break;
}
}
elseif(curtocmp!
=curchar){
right=0;break;
}
else
break;
}
elseif(curtocmp!
=curchar)
{
right=0;break;
}
else
{
h=h->next;continue;
}
}
}
voidmain(void){
charch;
right=1;
base=(Lchar*)malloc(sizeof(Lchar));
base->next=NULL;
base->char_ch='#';
temp=(Lchar*)malloc(sizeof(Lchar));
temp->next=base;
temp->char_ch='E';
top=temp;
h=(Lchar*)malloc(sizeof(Lchar));
h->next=NULL;
p=h;
do{
ch=getchar();
putchar(ch);
if(ch=='i'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'){
temp=(Lchar*)malloc(sizeof(Lchar));
temp->next=NULL;
temp->char_ch=ch;
h->next=temp;
h=h->next;
}
else{
temp=p->next;
printf("\nInputawrongchar!
Inputagain:
\n");
for(;;){
if(temp!
=NULL)
printf("%c",temp->char_ch);
else
break;
temp=temp->next;
}
}
}while(ch!
='#');
p=p->next;
h=p;
dosome();
if(right)
printf("\nOK!
\n");
else
printf("\nError!
\n");
getchar();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四 LL1语法分析程序的设计与实现C语言 实验 LL1 语法分析 程序 设计 实现 语言
![提示](https://static.bdocx.com/images/bang_tan.gif)