编译技术第5次上机内容.docx

上传人:b****6 文档编号:3601490 上传时间:2022-11-24 格式:DOCX 页数:14 大小:16.93KB
下载 相关 举报
编译技术第5次上机内容.docx_第1页
第1页 / 共14页
编译技术第5次上机内容.docx_第2页
第2页 / 共14页
编译技术第5次上机内容.docx_第3页
第3页 / 共14页
编译技术第5次上机内容.docx_第4页
第4页 / 共14页
编译技术第5次上机内容.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

编译技术第5次上机内容.docx

《编译技术第5次上机内容.docx》由会员分享,可在线阅读,更多相关《编译技术第5次上机内容.docx(14页珍藏版)》请在冰豆网上搜索。

编译技术第5次上机内容.docx

编译技术第5次上机内容

编译技术第5次上机内容

目的:

充分理解语义分析的方法及相关语义计算的执行时机。

要求:

1.以S属性的语法制导定义为基础,将下表的语义规则嵌套在语法分析的过程中,即实现语法制导的翻译过程。

产生式

语义规则

LEn

print(E.val)

EE1+T

E.val:

=E1.val+T.val

ET

E.val:

=T.val

TT1*F

T.val:

=T1.val*F.val

TF

T.val:

=F.val

F(E)

F.val:

=E.val

Fdigit

F.val:

=digit.lexval

2.以词法分析和语法分析部分的上机结果为基础,添加语义分析部分。

即以LR文法为基础。

当进行产生式归约时执行对应的语义动作。

3.输入:

5+3+8*2

输出:

24

4.若输入有误,如:

3++2

则应提示:

重新输入!

5.由于输入串是具体的数值,因此应调用相应的词法分析的功能。

//Expression.cpp:

Definestheentrypointfortheconsoleapplication.

//

#include"stdafx.h"

#include"conio.h"

#include

#include

#include

usingnamespacestd;

#defineL0

#defineE1

#defineT2

#defineE_3

#defineT_4

#defineF6

#definedigit7//数字

#defineadd8//左括号

#definemul9//右括号

#definelb10

#definerb11

intnStackPtr;

intStack[100];//栈

voidguiyue(stack&state,stack&value,charnex);

voidPush(intn)

{

nStackPtr++;

Stack[nStackPtr]=n;

}

voidPop()

{

nStackPtr--;

}

voidPrintStack()

{

inti;

for(i=nStackPtr;i>=0;i--)

{

if(Stack[i]==E)printf("E");

if(Stack[i]==E_)printf("E'");

if(Stack[i]==T)printf("T");

if(Stack[i]==T_)printf("T'");

if(Stack[i]==F)printf("F");

if(Stack[i]==digit)printf("digit");

if(Stack[i]==add)printf("+");

if(Stack[i]==mul)printf("*");

if(Stack[i]==lb)printf("(");

if(Stack[i]==rb)printf(")");

}

printf("\n");

}

/////////////////////////////////////////////////////////////////

//利用栈来分析表达式串,判定表达式串是否正确

//

/////////////////////////////////////////////////////////////////

intmain(intargc,char*argv[])

{

charstrInput[100];//存放表达式串

boolbResult;

intnInputPtr;

nStackPtr=-1;

nInputPtr=0;

bResult=true;

//输入表达式串,存放在strInput中

printf("请输入表达式串:

");

scanf("%s",strInput);

Push(E);

PrintStack();

while(bResult&&nStackPtr>=0)

{

switch(Stack[nStackPtr])

{

caseE:

if(strInput[nInputPtr]>='0'&&strInput[nInputPtr]<='9')

{

Pop();

Push(E_);

Push(T);

}

elseif(strInput[nInputPtr]=='(')

{

Pop();

Push(E_);

Push(T);

}

else

bResult=false;

PrintStack();

break;

caseT:

if(strInput[nInputPtr]>='0'&&strInput[nInputPtr]<='9')

{

Pop();

Push(T_);

Push(F);

}

elseif(strInput[nInputPtr]=='(')

{

Pop();

Push(T_);

Push(F);

}

elsebResult=false;

PrintStack();

break;

caseE_:

if(strInput[nInputPtr]=='+')

{

Pop();

Push(E_);

Push(T);

Push(add);

}

elseif(strInput[nInputPtr]==')'||strInput[nInputPtr]==0)Pop();

elsebResult=false;

PrintStack();

break;

caseT_:

if(strInput[nInputPtr]=='+'||strInput[nInputPtr]==')'||strInput[nInputPtr]==0)Pop();

elseif(strInput[nInputPtr]=='*')

{

Pop();

Push(T_);

Push(F);

Push(mul);

}

elsebResult=false;

PrintStack();

break;

caseF:

if(strInput[nInputPtr]>='0'&&strInput[nInputPtr]<='9')

{

Pop();

Push(digit);

}

elseif(strInput[nInputPtr]=='(')

{

Pop();

Push(rb);

Push(E);

Push(lb);

}

elsebResult=false;

PrintStack();

break;

casedigit:

if(strInput[nInputPtr]>='0'&&strInput[nInputPtr]<='9')

{

Pop();

nInputPtr++;

}

elsebResult=false;

PrintStack();

break;

caseadd:

if(strInput[nInputPtr]=='+')

{

Pop();

nInputPtr++;

}

elsebResult=false;

PrintStack();

break;

casemul:

if(strInput[nInputPtr]=='*')

{

Pop();

nInputPtr++;

}

elsebResult=false;

PrintStack();

break;

caselb:

if(strInput[nInputPtr]=='(')

{

Pop();

nInputPtr++;

}

elsebResult=false;

PrintStack();

break;

caserb:

if(strInput[nInputPtr]==')')

{

Pop();

nInputPtr++;

}

elsebResult=false;

PrintStack();

break;

default:

bResult=false;break;

}

}

if(bResult==false)printf("表达式有问题了\n");

elseprintf("表达式没问题!

!

\n");

//以上是词法、语法分析代码

//------------------------------------------------------------------------------------------------------------

//以下是语义分析代码

stackstate;

stackvalue;

inti=0;

intsize=strlen(strInput);

for(i=0;i

{

if(strInput[i]>='0'&&strInput[i]<='9')

{

state.push(digit);

value.push(strInput[i]-'0');

if(i!

=(size-1))

guiyue(state,value,strInput[i+1]);

else

guiyue(state,value,'#');

}

elseif(strInput[i]=='+')

{

state.push(add);

}

elseif(strInput[i]=='*')

{

state.push(mul);

}

elseif(strInput[i]=='(')

{

state.push(lb);

}

elseif(strInput[i]==')')

{

state.push(rb);

if(i!

=(size-1))

guiyue(state,value,strInput[i+1]);

else

guiyue(state,value,'#');

}

}

//printf("HelloWorld!

\n");

return0;

}

voidguiyue(stack&state,stack&value,charnex)

{

intnext;

if(nex>='0'&&nex<='9')

next=digit;

elseif(nex=='#')

next=0;

else

{

switch(nex)

{

case'+':

next=add;

break;

case'*':

next=mul;

break;

case'(':

next=lb;

break;

case')':

next=rb;

break;

}

}

stackstate1=state;

stackvalue1=value;

inttop_s1,top_s2;

inttop_v1;

inttop=state.top();

boolflag=true;

while(flag)

{

switch(state.top())

{

casedigit:

state.pop();

state.push(F);

state1=state;

break;

caseF:

if(state.size()>=3)

{

state1.pop();

top_s1=state1.top();

state1.pop();

top_s2=state1.top();

state1.pop();

if(top_s1==mul&&top_s2==T)

{

state1.push(T);

state=state1;

value1.pop();

top_v1=value1.top();

value1.pop();

value1.push(top_v1*value.top());

value=value1;

}

else

{

state.pop();

state.push(T);

state1=state;

}

}

else

{

state.pop();

state.push(T);

state1=state;

}

break;

caseT:

if(next==mul)

{

flag=false;

}

elseif(state.size()>=3)

{

state1.pop();

top_s1=state1.top();

state1.pop();

top_s2=state1.top();

state1.pop();

if(top_s1==add&&top_s2==E)

{

state1.push(E);

state=state1;

value1.pop();

top_v1=value1.top();

value1.pop();

value1.push(top_v1+value.top());

value=value1;

}

else

{

state.pop();

state.push(E);

state1=state;

}

}

else

{

state.pop();

state.push(E);

state1=state;

}

break;

caseE:

if(next==add||next==rb)

{

flag=false;

}

else

{

if(state.size()==1&&state.top()==E)

{

state.pop();

state.push(L);

printf("%d\n",value.top());

exit(0);

}

state1=state;

}

break;

caserb:

state1.pop();

top_s1=state1.top();

state1.pop();

top_s2=state1.top();

state1.pop();

if(top_s1==E&&top_s2==lb)

{

state1.push(F);

state=state1;

}

state1=state;

break;

}

}

}

 

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

当前位置:首页 > 高中教育 > 语文

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

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