语法分析程序实验报告及代码.docx
《语法分析程序实验报告及代码.docx》由会员分享,可在线阅读,更多相关《语法分析程序实验报告及代码.docx(11页珍藏版)》请在冰点文库上搜索。
语法分析程序实验报告及代码
LL
(1)语法分析实验报告
一、实验题目 LL
(1)语法分析
二、实验目的
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,检查语法错误,进一步掌握常用的语法分析方法。
三、实验内容
构造LL
(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。
程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合则输出错误信息。
消除递归前的文法 消除递归和提取公因子后的等价文法
SSaT|aT|aTSaTS’|vaTS’
TaT|a S’ vaTS’|ε
TaT’
T’aT’|ε
根据已建立的分析表,对下列输入串:
aaa进行语法分析,判断其是否符合文法。
四、实验要求
1.根据已由的文法规则建立LL
(1)分析表;
a
#
S
SaTS’
S’
S’ ε
T
TaT’
T’
T’aT’
T’ε
2.输出分析过程。
请输入待分析的字符串:
aaa
符号栈 输入串 所用产生式
#Saaa#
#S’Taaaa#SaTS’
#S’Taa#
#S’T’aaa#TaT’
#S’T’aaa#
#S’T’a#
#S’T’aa#T’aT’
#S’T’aa#
#S’T’#
#S’#T’ε
##S’ ε
五、程序思路
模块结构:
1、定义部分:
定义常量、变量、数据结构。
2、初始化:
设立LL
(1)分析表、初始化变量空间(包括堆栈、结构体等);
3、运行程序:
让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则;
4、利用LL
(1)分析算法进行表达式处理:
根据LL
(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。
六、程序源代码
/*程序名称:
LL
(1)文法分析程序*/
/*S->S>aT|aT|>aT*/
/*T->/************************************/
/********************************************/
/*程序相关说明*/
/*A=S’B=T’*/
/*0=S1=S’2=T3=T’*/
/*0=a1=<2=#*/
/************************************/
#include"iostream.h"
#include"stdio.h"
#include"malloc.h"
#include"conio.h"
structLchar{
charchar_ch;
structLchar*next;
}Lchar,*p,*h,*temp,*top,*base;
charcurchar;
charcurtocmp;
intright;
inttable[4][3]={{1,0,0},
{0,0,1},
{0,1,0},
{0,1,1}};
inti,j;
voidpush(charpchar)
{
temp=(structLchar*)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)
{
case3:
push('A');push('T');push('a');push('<');break;
case0:
push('A');push('T');push('a');break;
case6:
push('T');push('a');push('<');break;
case21:
push('B');push('a');push('<');break;
case31:
push('T');break;
}
}
voidchangchartoint()
{
switch(curtocmp)
{
case'S':
i=0;break;
case'A':
i=1;break;
case'T':
i=2;break;
case'B':
i=3;break;
}
switch(curchar)
{
case'a':
j=0;break;
case'<':
j=1;break;
case'#':
j=2;
}
}
voiddosome(void)
{
intt;
for(;;)
{
pop();
curchar=h->char_ch;
printf("\n%c\t%c",curchar,curtocmp);
if(curtocmp=='#'&&curchar=='#')
break;
if(curtocmp=='S'||curtocmp=='A'||curtocmp=='T'||curtocmp=='B')
{
if(curtocmp!
='#')
{
changchartoint();
if(table[i][j])
{
t=10*i+j;
doforpush(t);
continue;
}
else
{
right=0;
break;
}
}
else
if(curtocmp!
=curchar)
{
right=0;
break;
}
else
break;
}
else
if(curtocmp!
=curchar)
{
right=0;
break;
}
else
{
h=h->next;
continue;
}
}
}
voidmain(void)
{
charch;
cout<<"*文件名称:
语法分析"<cout<<""<cout<<"/*程序相关说明*/"<cout<<"---------------------------------------------------------------------"<cout<<"-/*A=S’B=T’*/"<cout<<"-*目的:
对输入LL
(1)文法字符串,本程序能自动判断所给字符串是-"<cout<<"-*否为所给文法的句子,并能给出分析过程。
-"<cout<<"-*-------------------------------------------------------------------"<cout<<"表达式文法为:
"<cout<<"S->S>aT|aT|>aT"<cout<<"T->cout<<"请在下行输入要分析的串(#号结束):
"<right=1;
base=(structLchar*)malloc(sizeof(Lchar));
base->next=NULL;
base->char_ch='#';
temp=(structLchar*)malloc(sizeof(Lchar));
temp->next=base;
temp->char_ch='S';
top=temp;
h=(structLchar*)malloc(sizeof(Lchar));
h->next=NULL;
p=h;
do{
ch=getch();
putch(ch);
if(ch=='a'||ch=='<'||ch=='#')
{
temp=(structLchar*)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("\n成功!
\n");
else
printf("\n错误!
\n");
getch();
}
七、程序调试与测试结果(输出结果截屏)
特别注明:
程序中使用“<”代替“”。
输入a若输入aa#则显示错误信息如图:
注意:
所有的输入串都要以#结束。
八:
实验总结:
实验前首先要明白实验的目的,了解什么是LL
(1)语法,实验前首先要写出分析表,然后写出实验输出的分析过程,然后再写代码,分析实验结果。