天津理工大学编译原理实验3语义分析与中间代码生成Word文件下载.docx
- 文档编号:18936754
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:21
- 大小:132.70KB
天津理工大学编译原理实验3语义分析与中间代码生成Word文件下载.docx
《天津理工大学编译原理实验3语义分析与中间代码生成Word文件下载.docx》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验3语义分析与中间代码生成Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
实验要求:
1.在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;
2.要求详细描述所选分析方法进行制导翻译的设计过程;
3.完成对所设计分析器的功能测试,并给出测试数据和实验结果;
4.为增加程序可读性,请在程序中进行适当注释说明;
5.整理上机步骤,总结经验和体会;
6.认真完成并按时提交实验报告。
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
分析的四元式:
(+,E1.place,T.place,E.place)
(-,E1.place,T.place,E.place)
(=,T.place,_,E.place)
(*,T1.place,F.place,T.place)
(/,T1.place,F.place,T.place)
(=,F.place,_,T.place)
(^,P.place,_,F.place)
(=,P.place,_,F.place)
(=,E.place,_,P.place)
(=,lookup(i.name),_,P.place)
根据语法分析修改的程序流程图
程序运行结果:
部分源代码:
Main.cpp
#include<
iostream>
#include"
Syntax.h"
intmain(intargc,char**argv)
{
std:
:
stringsource;
cout<
<
"
pleaseinputanarithmeticexpression"
std:
endl;
cin>
>
source;
ccyg:
Syntax*syn=newccyg:
Syntax(source);
syn->
analysis();
"
symbolStack:
<
inputStack:
semStack:
while(!
syn->
getSuccess())
{
syn->
printSymbol();
printSource();
printSemantic();
nextStep();
std:
cout<
}
deletesyn;
system("
pause"
);
}
Lexical.h
#pragmaonce
string>
vector>
namespaceccyg
classLexical
public:
enumletter
{
add=0,
sub=1,
mul=2,
div=3,
pow=4,
ide=5,
lef=6,
rig=7,
sha=8
};
Lexical();
Lexical(std:
string);
~Lexical();
boolanalysis();
voidprintSource();
voidsetSourceCode(std:
chartoChar(int);
vector<
int>
identifier;
private:
stringsourceCode;
};
Lexical.cpp
Lexical.h"
stdio.h>
usingnamespaceccyg;
Lexical:
Lexical()
Lexical(std:
strings)
sourceCode=s;
~Lexical()
boolLexical:
analysis()
if(sourceCode.size()==0)
sourceisempty!
returnfalse;
source.clear();
identifier.clear();
intnumber=NULL;
for(inti=0;
i<
=sourceCode.size();
i++)
if(i==sourceCode.size())
if(number!
=NULL)
{
source.push_back(ide);
identifier.push_back(number);
number=0;
}
source.push_back(sha);
returntrue;
}
elseif(sourceCode[i]>
='
0'
&
sourceCode[i]<
9'
)
number=number*10+sourceCode[i]-48;
else
switch(sourceCode[i])
case'
+'
source.push_back(add);
break;
-'
source.push_back(sub);
*'
source.push_back(mul);
/'
source.push_back(div);
^'
source.push_back(pow);
('
source.push_back(lef);
)'
source.push_back(rig);
default:
std:
cannotidentify:
returnfalse;
source.push_back(sha);
returntrue;
voidLexical:
printSource()
source.size();
toChar(source[i]);
;
charLexical:
toChar(inta)
switch(a)
caseadd:
return'
casesub:
casemul:
casediv:
casepow:
caseide:
i'
caselef:
caserig:
casesha:
#'
default:
break;
return0;
setSourceCode(std:
stringsource)
sourceCode=source;
Syntax.h
classSyntax:
publicccyg:
Lexical
enumRelation//定义优先关系枚举
equal=0,
less=1,
greater=2,
//错误
i_i=3,
i_left=4,
left_sharp=5,
right_i=6,
right_left=7,
sharp_right=8
enumSymbol
E=9,
T=10,
F=11,
P=12
Syntax(std:
string=0);
~Syntax();
boolreduced();
//定义归约方法
voidmovein();
//定义移进方法
intfindOperator();
//查找最近运算符
boolnextStep();
voidinitNext();
voidprintSymbol();
voidprintSemantic();
boolgetSuccess();
symbolStack;
//定义符号栈
inputStack;
//定义输入栈
double>
semStack;
//定义语义栈
boolisSuccess;
boolisInitNext;
staticconstintpreArray[9][9];
Syntax.cpp
constintSyntax:
preArray[9][9]={2,2,1,1,1,1,1,2,2,
2,2,1,1,1,1,1,2,2,
2,2,2,2,1,1,1,2,2,
2,2,2,2,1,1,1,2,2,
2,2,2,2,2,1,1,2,2,
2,2,2,2,2,3,4,2,2,
1,1,1,1,1,1,1,0,5,
2,2,2,2,2,6,7,2,2,
1,1,1,1,1,1,1,8,0};
longlongpoow(inta,intb)
if(b==1)
returna;
else
returnpoow(a,b-1)*a;
Syntax:
Syntax(std:
strings):
Lexical(s)
isSuccess=false;
isInitNext=false;
~Syntax()
voidSyntax:
movein()
symbolStack.push_back(source[0]);
if(source[0]==ide)
semStack.push_back(identifier[0]);
iteratoriter=identifier.begin();
identifier.erase(iter);
semStack.push_back(NULL);
iteratorit=source.begin();
source.erase(it);
boolSyntax:
reduced()
if(symbolStack[symbolStack.size()-1]==ide)
symbolStack[symbolStack.size()-1]=P;
switch(symbolStack[symbolStack.size()-2])
caseadd:
symbolStack[symbolStack.size()-3]=E;
symbolStack.pop_back();
semStack[semStack.size()-3]=semStack[semStack.size()-3]+semStack[semStack.size()-1];
semStack.pop_back();
break;
casesub:
semStack[semStack.size()-3]=semStack[semStack.size()-3]-semStack[semStack.size()-1];
casemul:
symbolStack[symbolStack.size()-3]=T;
semStack[semStack.size()-3]=semStack[semStack.size()-3]*semStack[semStack.size()-1];
casediv:
semStack[semStack.size()-3]=(double)semStack[semStack.size()-3]/(double)semStack[semStack.size()-1];
casepow:
symbolStack[symbolStack.size()-3]=F;
semStack[semStack.size()-3]=poow(semStack[semStack.size()-3],semStack[semStack.size()-1]);
caselef:
symbolStack[symbolStack.size()-2]=E;
semStack[semStack.size()-2]=semStack[semStack.size()-1];
std:
source.erase(it);
casesha:
analysissuccess"
returntrue;
returnfalse;
intSyntax:
findOperator()
for(inti=symbolStack.size()-1;
i>
=0;
i--)
if(symbolStack[i]<
E)
returnsymbolStack[i];
return-1;
charSyntax:
toChar(inti)
charch=Lexical:
toChar(i);
if(ch!
=0)
returnch;
switch(i)
caseE:
E'
caseT:
T'
caseF:
F'
caseP:
P'
error:
unknownsymbol"
initNext()
if(isInitNext==false)
symbolStack.clear();
symbolStack.push_back(sha);
semStack.clear();
isSuccess=false;
isInitNext=true;
nextStep()
if(isSuccess==true)
returntrue;
if(!
isInitNext)
initNext();
inta=findOperator();
intb=source[0];
switch(preArray[a][b])
caseless:
movein();
casegreater:
reduced();
caseequal:
isSuccess=reduced();
returnisSuccess;
printSymbol()
symbolStack.size();
toChar(symbolStack[i]);
getSuccess()
printSemantic()
semStack.size();
if(semStack[i]==NULL)
std:
'
_'
semStack[i];
心得体会:
这次实验做得还是不够理想,虽然做出了语法制导翻译的全过程,但是还有部分地方不够完美。
例如四元式的使用及输出,不过总体来说,也算是深入的掌握了语法制导翻译的全过程,获益匪浅。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 天津 理工大学 编译 原理 实验 语义 分析 中间 代码 生成