编译原理语法分析实验.docx
- 文档编号:23072341
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:13
- 大小:212.17KB
编译原理语法分析实验.docx
《编译原理语法分析实验.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析实验.docx(13页珍藏版)》请在冰豆网上搜索。
编译原理语法分析实验
编译原理程序设计实验报告
语法分析器的构造——实验题目
班级:
计算机1306姓名:
韩远磊学号:
20133948
实验目标:
实现一个能够完成语法分析任务的语法分析器,按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。
给定文法G和字符串R(R∈VT*),检查、判定R∈L(G)?
即检查、判定R是否是文法G所能产生的合法的句子,同时报告和处理语法错误。
实验内容:
语法分析器设计
文法:
G(E):
E->T|Eω1T
T->F|Tω2F
F->i|(E)
其中:
ω1(+,-),ω2(*,/),i(变量或常数)
(1)递归子程序是根据文法各产生式的首符号与当前所读单词进行匹配,以决定候选产生式的;这就要求文法:
①具有相同左部的各产生式,首符号不同;②文法不能有左递归!
消除左递归后的文法1:
流程图:
主程序
子程序E
子程序T
子程序F
(2)LL
(1)分析法是指从左到右扫描、最左推导(LL)和只查看一个当前符号(括号中的1)之意;
LL
(1)分析法又称预测分析法,与递归子程序法同属于自顶向下确定性语法分析方法;
※LL
(1)分析法的基本要点有三:
⑴利用一个分析表,登记如何选择产生式的知识;
⑵利用一个分析栈,记录分析过程;
⑶此分析法要求文法必须是LL
(1)文法。
※此文法含左递归,不是LL
(1)文法;经文法变换(消除左递归)后可得:
G`(E)的选择集合:
构造LL
(1)分析表:
LL
(1)分析法控制程序:
源程序代码:
(1)递归子程序
#include
#include
#include
voidE();
voidT();
voidF();
voidE1();
voidT1();
voidread();
voiderror();
charm[100];
inti=0;
intmain()
{
printf("请输入表达式:
");
gets(m);
E();
if(m[i]!
='#')
error();
elseprintf("表达式正确!
!
");
return0;
}
voidread()
{
i=i+1;
}
voiderror()
{
printf("表达式错误!
!
!
");
}
voidE()
{
T();
E1();
}
voidE1()
{
if(m[i]=='+'||m[i]=='-')
{
read();
T();
E1();
}
}
voidT()
{
F();
T1();
}
voidT1()
{
if(m[i]=='*'||m[i]=='/')
{read();
F();
T1();
}
}
voidF()
{
if(m[i]=='(')
{
read();
E();
if(m[i]!
=')')
error();
}
else
{
if(m[i]!
='i')
error();
}
read();
}
(2)LL1
#include
#include
#include
#defineSTACKSIZE50
#defineSTACKINCREMENT10
typedefcharSElemType;
typedefintStatus;
typedefstruct
{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&S)//初始化
{
S.base=(SElemType*)malloc(STACKSIZE*sizeof(SElemType));
if(!
S.base)
exit(-1);
S.top=S.base;
S.stacksize=STACKSIZE;
return1;
}
StatusPush(SqStack&S,SElemTypee)//压栈
{
if(S.top-S.base>=S.stacksize)//判断栈是否满啦
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)
exit(-1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
(S.top)++;
*(S.top)=e;
return1;
}
StatusPop(SqStack&S,SElemType&e)//弹栈
{
if(S.top==S.base)//判断栈是否为空
return0;
e=*(S.top);
S.top--;
return1;
}
StatusGrammerAnalysis(SqStack&S,char*ch,charc)//分析函数
{
chare;
Push(S,'#');//先把#号压与栈
Push(S,'E');
while(!
((*(S.top)=='#')&&(c=='#')))
{
Pop(S,e);
if((e=='E')&&(((c>='0')&&(c<='9'))||(c=='(')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.'))
{
Push(S,'A');
Push(S,'T');
}
elseif((e=='A')&&((c=='+')||(c=='-')))
{
Push(S,'A');
Push(S,'T');
ch++;
c=*ch;
}
elseif((e=='A')&&((c==')')||(c=='#')))
;
elseif((e=='T')&&(((c>='0')&&(c<='9'))||(c=='(')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.'))
{
Push(S,'B');
Push(S,'F');
}
elseif((e=='B')&&((c=='*')||(c=='/')))
{
Push(S,'B');
Push(S,'F');
ch++;
c=*ch;
}
elseif((e=='B')&&((c=='+')||(c==')')||(c=='#')||(c=='-')))
;
elseif((e=='F')&&((c>='0')&&(c<='9')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.'))
{
ch++;
while(((c=*ch)>='0')&&(c<='9')||((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||c=='.')
ch++;
}
elseif((e=='F')&&(c=='('))
{
Push(S,')');
Push(S,'E');
ch++;
c=*ch;
}
elseif((e==')')&&(c==')'))
{
ch++;
c=*ch;
}
elsereturn0;
}
return1;
}
intmain()
{
charstr[50];
charc;
SqStackS;
InitStack(S);
printf("请输入一个正确的表达式,并以#号键结束\n");
scanf("%s",str);
c=*str;
if(GrammerAnalysis(S,str,c))
printf("表达式正确\n");
else
printf("表达式不正确\n");
return0;
}
程序运行结果:
输出:
(1)递归下降
(2)LL1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法分析 实验