东北大学编译原理实验报告二.doc

上传人:wj 文档编号:84544 上传时间:2022-10-02 格式:DOC 页数:8 大小:504KB
下载 相关 举报
东北大学编译原理实验报告二.doc_第1页
第1页 / 共8页
东北大学编译原理实验报告二.doc_第2页
第2页 / 共8页
东北大学编译原理实验报告二.doc_第3页
第3页 / 共8页
东北大学编译原理实验报告二.doc_第4页
第4页 / 共8页
东北大学编译原理实验报告二.doc_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

东北大学编译原理实验报告二.doc

《东北大学编译原理实验报告二.doc》由会员分享,可在线阅读,更多相关《东北大学编译原理实验报告二.doc(8页珍藏版)》请在冰豆网上搜索。

东北大学编译原理实验报告二.doc

编译原理程序设计实验报告

——表达式语法分析器的设计与实现

班级:

姓名:

学号:

实验目标:

用两种不同的方法设计一个表达式的语法分析器

实验内容:

①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)分析法:

注:

文档可能无法思考全面,请浏览后下载,供参考。

递归下降:

思考问题回答:

语法分析的任务是什么?

语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,语法分析程序判断源程序在结构上是否正确。

通过接受词法分析程序识别出来的单词符号串,判断它们是否由某种语言的文法产生,即判断被识别符号串是否为某语法成分,同时进行语法检查,为后面的语义分析和代码生成作准备。

注:

文档可能无法思考全面,请浏览后下载,供参考。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1