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

上传人:b****5 文档编号:5570432 上传时间:2022-12-27 格式:DOCX 页数:10 大小:101.49KB
下载 相关 举报
东北大学编译原理实验报告二.docx_第1页
第1页 / 共10页
东北大学编译原理实验报告二.docx_第2页
第2页 / 共10页
东北大学编译原理实验报告二.docx_第3页
第3页 / 共10页
东北大学编译原理实验报告二.docx_第4页
第4页 / 共10页
东北大学编译原理实验报告二.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

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

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

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

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

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

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

递归下降:

 

思考问题回答:

语法分析的任务是什么?

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

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

 

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

当前位置:首页 > 农林牧渔

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

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