编译技术第5次上机内容解析.docx
- 文档编号:4164798
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:14
- 大小:16.95KB
编译技术第5次上机内容解析.docx
《编译技术第5次上机内容解析.docx》由会员分享,可在线阅读,更多相关《编译技术第5次上机内容解析.docx(14页珍藏版)》请在冰豆网上搜索。
编译技术第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
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");
//以上是词法、语法分析代码
//------------------------------------------------------------------------------------------------------------
//以下是语义分析代码
stack
stack
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 { 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; } } stack stack 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; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 技术 上机 内容 解析