东北大学编译原理实验报告二.doc
- 文档编号:84544
- 上传时间:2022-10-02
- 格式:DOC
- 页数:8
- 大小:504KB
东北大学编译原理实验报告二.doc
《东北大学编译原理实验报告二.doc》由会员分享,可在线阅读,更多相关《东北大学编译原理实验报告二.doc(8页珍藏版)》请在冰豆网上搜索。
编译原理程序设计实验报告
——表达式语法分析器的设计与实现
班级:
姓名:
学号:
实验目标:
用两种不同的方法设计一个表达式的语法分析器
实验内容:
①LL
(1)分析法
LL
(1)文法是一种自上而下的语法分析方法,它是从文法的识别符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看1个字符,便能确定当前应该选择的产生式。
LL
(1)分析需要用到一个分析表M和一个符号栈S,分析表M是一个矩阵,它的元素可以存放一个非终结符的产生式,表明当符号栈S的栈顶元素非终结符遇到当前输入字符时,所应选择的产生式;M的元素还可以是存放一个出错标志,说明符号栈S的栈顶元素非终结符不应该遇到当前输入字符(终结符)。
重复调用LL
(1)分析方法对每一个输入字符进行分析,直到输入栈为空为止。
②递归下降子程序
递归下降分析法,在判断一个表达式时首先进入E然后调用T在调用F,判断是否为“(”或字符或常数,如果不是报错,是“(”的话再进入E,是字符或常数的话跳出递归。
然后进入T中下一步,判断是否为“*”,是的话进入T子递归,不是的话跳出,进入E的下一步判断是否为“+”,是的话进入E的子递归,不是的话跳出回到主程序。
当ch标识符为#时结束。
注:
文档可能无法思考全面,请浏览后下载,供参考。
源程序代码:
(加入注释)
LL
(1)分析算法:
#include
注:
文档可能无法思考全面,请浏览后下载,供参考。
#include
usingnamespacestd;
#defineSTACKSIZE50
#defineSTACKINCREMENT10
#defineOK1
#defineerror0
#defineoverflow-1
typedefcharSElemType;
typedefintStatus;
typedefstruct
{
SElemType*base;
SElemType*top;
Intstacksize;
}SqStack;
StatusInitStack(SqStack&S)
{
S.base=(SElemType*)malloc(STACKSIZE*sizeof(SElemType));
if(!
S.base)
exit(overflow);
S.top=S.base;
S.stacksize=STACKSIZE;
returnOK;
}
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(overflow);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
(S.top)++;
*(S.top)=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)
{
if(S.top==S.base)
returnerror;
e=*(S.top);
S.top--;
注:
文档可能无法思考全面,请浏览后下载,供参考。
returnOK;
}
StatusGrammerAnalysis(SqStack&S,char*ch,charc)
{
SElemTypee;
Push(S,'#');
Push(S,'E');
while(!
((*(S.top)=='#')&&(c=='#'))){
Pop(S,e);
if((e=='E')&&(((c>='0')&&(c<='9'))||(c>='a'&&c<='z')||(c=='(')))
{
Push(S,'A');
Push(S,'T');
}
elseif((e=='A')&&(c=='+'))
{
Push(S,'A');
Push(S,'T');
ch++;
c=*ch;
}
elseif((e=='A')&&((c==')')||(c=='#')));
elseif((e=='T')&&(((c>='0')&&(c<='9'))||(c>='a'&&c<='z')||(c=='(')))
Push(S,'B');
Push(S,'F');
}
elseif((e=='B')&&(c=='*'))
{Push(S,'B');
Push(S,'F');
ch++;
c=*ch;
}
elseif((e=='B')&&((c=='+')||(c==')')||(c=='#')));
elseif((e=='F')&&((c>='0'&&c<='9')||(c>='a'&&c<='z')))
{
ch++;
while(((c=*ch)>='0')&&(c<='9')||(c>='a'&&c<='z'))
ch++;
}
elseif((e=='F')&&(c=='('))
{Push(S,')');
Push(S,'E');
ch++;
c=*ch;
注:
文档可能无法思考全面,请浏览后下载,供参考。
}
elseif((e==')')&&(c==')'))
{ch++;
c=*ch;
}
elsereturnerror;
}
returnOK;
}
intmain()
{
charstr[50];
charc;
system("color0B");
SqStackS;
InitStack(S);
printf("|-------------------------------------------------|\n");
printf("|请输入表达式,以#键结束:
|\n");
printf("|-------------------------------------------------|\n");
scanf("%s",str);
c=*str;
if(GrammerAnalysis(S,str,c))
{
printf("语法分析通过\n");
printf("表达式正确\n");
}
else{
printf("语法分析未通过\n");
printf("表达式错误\n");}
main();
return0;
}
递归下降
#include
usingnamespacestd;
inta=1;
charch;
inti=0;
charstr[80];
voidT(void);
voidF(void);
voidE(void);
voidError(void);
注:
文档可能无法思考全面,请浏览后下载,供参考。
voidError()//出错函数
{
cout<<"语法错误"< } voidT(void)//子程序T { F();//进入子程序F if(ch=='*') { i++; ch=str[i]; T();}//递归子程序T } voidF(void)//子程序F { if(ch=='(') { i++; ch=str[i]; E();//回到子程序E if(ch==')') { i++; ch=str[i]; } else{Error();a=0;} } elseif((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')) { i++; ch=str[i]; } else { Error(); a=0; } } voidE(void){//子程序E T(); if(ch=='+') { i++; ch=str[i]; 注: 文档可能无法思考全面,请浏览后下载,供参考。 E();//递归子程序E } } intmain()//主函数 { system("color0B"); cout<<"|-------------------------------------------------|"< cout<<"|输入表达式以#号结束|"< cout<<"|-------------------------------------------------|"< cin>>str; ch=str[0]; while(ch! ='#') { E(); if(! a) break; } if((ch=='#')&&(a! =0))//遇#且a不等于零时语法正确 cout<<"语法正确"< return0; } 程序运行结果: (截屏) LL (1)分析法: 注: 文档可能无法思考全面,请浏览后下载,供参考。 递归下降: 思考问题回答: 语法分析的任务是什么? 语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,语法分析程序判断源程序在结构上是否正确。 通过接受词法分析程序识别出来的单词符号串,判断它们是否由某种语言的文法产生,即判断被识别符号串是否为某语法成分,同时进行语法检查,为后面的语义分析和代码生成作准备。 注: 文档可能无法思考全面,请浏览后下载,供参考。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 编译 原理 实验 报告