编译原理语法分析实验Word格式文档下载.docx
- 文档编号:452030
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:13
- 大小:212.17KB
编译原理语法分析实验Word格式文档下载.docx
《编译原理语法分析实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析实验Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。
其中:
ω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<
stdio.h>
stdlib.h>
string.h>
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()
表达式错误!
voidE()
T();
E1();
voidE1()
if(m[i]=='
+'
||m[i]=='
-'
{
read();
T();
E1();
}
voidT()
F();
T1();
voidT1()
if(m[i]=='
*'
/'
{read();
voidF()
('
read();
)'
error();
else
i'
(2)LL1
malloc.h>
#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));
exit(-1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
(S.top)++;
*(S.top)=e;
StatusPop(SqStack&
S,SElemType&
e)//弹栈
if(S.top==S.base)//判断栈是否为空
return0;
e=*(S.top);
S.top--;
StatusGrammerAnalysis(SqStack&
S,char*ch,charc)//分析函数
chare;
Push(S,'
//先把#号压与栈
E'
while(!
((*(S.top)=='
)&
&
(c=='
)))
Pop(S,e);
if((e=='
(((c>
='
0'
(c<
9'
))||(c=='
)||((c>
A'
)&
(c<
Z'
))||((c>
a'
z'
))||c=='
.'
))
{
Push(S,'
T'
}
elseif((e=='
((c=='
)||(c=='
ch++;
c=*ch;
((c=='
;
B'
F'
)||(c=='
((c>
while(((c=*ch)>
ch++;
Push(S,'
elsereturn0;
charstr[50];
charc;
SqStackS;
InitStack(S);
printf("
请输入一个正确的表达式,并以#号键结束\n"
scanf("
%s"
str);
c=*str;
if(GrammerAnalysis(S,str,c))
printf("
表达式正确\n"
else
表达式不正确\n"
return0;
程序运行结果:
输出:
(1)递归下降
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法分析 实验