编译原理实验LL1分析法综述Word格式文档下载.docx
- 文档编号:20256796
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:12
- 大小:38.54KB
编译原理实验LL1分析法综述Word格式文档下载.docx
《编译原理实验LL1分析法综述Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验LL1分析法综述Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
M→ω0TM|ε
T→F|N
N→ω1FN|ε
F→i|(E)
2.LL
(1)分析表
表1.LL
(1)分析表
i
+
-
*
/
(
)
#
E
MT,p
M
MT,n
ε,p
T
NF,p
N
NF,n
F
ε,n
)E,n
OK
二、数据结构
1.输入表达式
定义char型数组expstr为存放输入表达式的数组,
charexpstr[100];
2.分析栈
定义一个栈来进行LL
(1)分析。
栈中有bottom、top、stacksize等元素,用于程序调用栈和对栈操作。
typedefstruct//定义语法的栈
{
SElemType*bottom;
//底
SElemType*top;
//顶
intstacksize;
}SqStack;
(包括:
概要设计、数据结构、流程图、关键函数等
有选择填写)
源程序代码:
(加入注释)
#include<
iostream>
stdio.h>
cstdlib>
usingnamespacestd;
#defineSTACKSIZE30//栈大小
#defineSTACKINCREMENT10//栈增量
#defineOK1
#defineError0
#defineOVERFLOW-1
typedefcharSElemType;
typedefintStatus;
inti=0;
intcount1=0;
intcount2=0;
//计数终结符的个数
StatusInitStack(SqStack&
S)//初始化栈
S.bottom=(SElemType*)malloc(STACKSIZE*sizeof(SElemType));
if(!
S.bottom)
exit(OVERFLOW);
S.top=S.bottom;
S.stacksize=STACKSIZE;
returnOK;
}
StatusPUSH(SqStack&
S,SElemTypee)
if(S.top-S.bottom>
=S.stacksize)
{
S.bottom=(SElemType*)realloc(S.bottom,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.top=S.bottom+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*(S.top)=e;
(S.top)++;
StatusPOP(SqStack&
S,SElemType&
e)
if(S.top==S.bottom)
returnError;
S.top--;
e=*(S.top);
voidwrong()//调用此函数,表示出错
cout<
<
"
Wrong!
endl;
getchar();
exit(0);
boolch_judge(chars[],intn)//字符是否合法
if((s[n]=='
('
)||(s[n]=='
)'
)||(s[n]>
='
0'
&
s[n]<
9'
a'
z'
+'
-'
*'
/'
#'
))
return1;
else
return0;
boolter_judge(charc)//终结符集合与非终结符集合
if((c=='
)||(c=='
)||(c>
c<
//终结符返回1
else//if(c=='
E'
||c=='
E1'
T'
T1'
F'
//非终结符或#,返回0
boolnum_letter(chars[],inti)//判断当前字符是数字还是字母
if((s[i]>
s[i]<
)||(s[i]>
i++;
while((s[i]>
count1++;
while(count1!
=0)
i--;
count1--;
//是字母或数字返回1
//不是字母或数字返回0
voidLL1(SqStack&
S,chars[],inti)//LL1文法分析函数
SElemTypee;
PUSH(S,'
);
while(s[i]!
if(ch_judge(s,i))
POP(S,e);
(ter_judge(e)))//是非终结符
if(e=='
s[i]=='
break;
//表达式正确
elseif(e=='
s[i]!
wrong();
elseif(e!
)//分析表匹配
switch(e)
case'
:
if(num_letter(s,i)||s[i]=='
e='
M'
;
//E'
M
PUSH(S,e);
if(s[i]=='
||s[i]=='
e=s[i];
elseif(s[i]=='
N'
//T'
N
if(num_letter(s,i))
))//将连续的终结符压栈
count2++;
//给连续终结符计数
//使s[i]为连续终结符即一个整数的最后一字
default:
))//如果是数字或字母则依次计数
while(ter_judge(e))
if(e==s[i])
while(count2!
count2--;
else//如果是+-*/则直接比较
intmain()
SqStackS;
InitStack(S);
LL
(1)\nPleaseentertheexpressionandendwiththe\"
#\"
cin>
>
expstr;
LL1(S,expstr,i);
Right!
"
程序运行结果:
(截屏)
图1.正确的算术表达式(((a+b)*(c/B)))的判断
图2.错误的算术表达式a/b++的判断
思考问题回答:
(如果有)
LL
(1)分析法和递归下降子程序法在语法分析中同属于自顶向下分析法,LL
(1)分析法相对于递归下降子程序法的优势是:
LL
(1)分析法消除了文法的左递归性,而且克服了回溯,使程序运行的效率大大提升。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 LL1 分析 综述