编译技术第5次上机内容解析Word格式.docx
- 文档编号:17080811
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:14
- 大小:16.95KB
编译技术第5次上机内容解析Word格式.docx
《编译技术第5次上机内容解析Word格式.docx》由会员分享,可在线阅读,更多相关《编译技术第5次上机内容解析Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
输出:
24
4.若输入有误,如:
3++2
则应提示:
重新输入!
5.由于输入串是具体的数值,因此应调用相应的词法分析的功能。
//Expression.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"
stdafx.h"
conio.h"
#include<
string.h>
iostream>
stack>
usingnamespacestd;
#defineL0
#defineE1
#defineT2
#defineE_3
#defineT_4
#defineF6
#definedigit7//数字
#defineadd8//左括号
#definemul9//右括号
#definelb10
#definerb11
intnStackPtr;
intStack[100];
//栈
voidguiyue(stack<
int>
&
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中
请输入表达式串:
"
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:
Push(T_);
Push(F);
Push(T_);
Push(F);
}
elsebResult=false;
caseE_:
if(strInput[nInputPtr]=='
+'
Push(add);
)'
||strInput[nInputPtr]==0)Pop();
caseT_:
||strInput[nInputPtr]=='
*'
Push(mul);
caseF:
strInput[nInputPtr]<
='
Push(digit);
Push(rb);
Push(E);
Push(lb);
casedigit:
nInputPtr++;
elsebResult=false;
caseadd:
casemul:
caselb:
caserb:
default:
bResult=false;
break;
}
if(bResult==false)printf("
表达式有问题了\n"
elseprintf("
表达式没问题!
!
//以上是词法、语法分析代码
//------------------------------------------------------------------------------------------------------------
//以下是语义分析代码
stack<
state;
value;
inti=0;
intsize=strlen(strInput);
for(i=0;
i<
size;
i++)
if(strInput[i]>
strInput[i]<
state.push(digit);
value.push(strInput[i]-'
if(i!
=(size-1))
guiyue(state,value,strInput[i+1]);
else
guiyue(state,value,'
#'
elseif(strInput[i]=='
state.push(add);
state.push(mul);
state.push(lb);
state.push(rb);
//printf("
HelloWorld!
return0;
value,charnex)
intnext;
if(nex>
nex<
next=digit;
elseif(nex=='
next=0;
else
switch(nex)
case'
:
next=add;
next=mul;
next=lb;
next=rb;
state1=state;
value1=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();
top_s2=state1.top();
if(top_s1==mul&
top_s2==T)
state1.push(T);
state=state1;
value1.pop();
top_v1=value1.top();
value1.push(top_v1*value.top());
value=value1;
state.pop();
state.push(T);
state1=state;
else
state.pop();
state.push(T);
state1=state;
caseT:
if(next==mul)
flag=false;
elseif(state.size()>
if(top_s1==add&
top_s2==E)
state1.push(E);
value1.push(top_v1+value.top());
state.push(E);
state.push(E);
caseE:
if(next==add||next==rb)
if(state.size()==1&
state.top()==E)
state.push(L);
printf("
%d\n"
value.top());
exit(0);
caserb:
state1.pop();
top_s1=state1.top();
top_s2=state1.top();
if(top_s1==E&
top_s2==lb)
state1.push(F);
state=state1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 技术 上机 内容 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)