编译原理实验编译器综合报告附源代码docx.docx
- 文档编号:1949206
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:18
- 大小:21.14KB
编译原理实验编译器综合报告附源代码docx.docx
《编译原理实验编译器综合报告附源代码docx.docx》由会员分享,可在线阅读,更多相关《编译原理实验编译器综合报告附源代码docx.docx(18页珍藏版)》请在冰豆网上搜索。
编译原理实验编译器综合报告附源代码docx
编译原理编译器综合实验
工程精品神刀公子
-.实验背景
编译器就是将"一种语言(通常为高级语言)"翻译为"另一种语言(通常为低级语言)"的程序。
一个现代编译器的主要工作流程:
源代码(sourcecode)T预处理器(preprocessor)->编译器(compiler)->目标代码(objectcode)->链接器(Linker)->可执行程序(executables)
高级计算机语言便于人编写,阅读交流.维护。
机器语音是计算机能直接解读、运行的。
编译器将汇编或高级计算机语言源程序(Sourceprogram〉作为输入,翻译成目标语言(Targetlanguage)机器代码的等价程序。
源代码一般为高级语言(High-levellanguage).如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Objectcode),有时也称作机器代码(Machinecode)。
对于C"、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)«最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(Nativecode)。
二.算法设计
典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。
一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,
词法分析程序9语法分析程序9语义分析程序9编译器。
不断完善,不断改进。
渐变的过程。
O0O函数。
OO
voidscanner。
;//扫描voidlrparser();
voidstaBlock(int•nChain);//语旬块
voidstaString(int*nChain);//ifi句串
voidsta(int*nChain);//ifi句
voidfuzhi();//賦值语句
voidtiaojianfint*nChain);//条件语句
voidxunhuan();//循环语句
char*E{);//Expresiion表达式
char*T();//Term项
char*F();//Factor因子
char•newTemp();//l1动生成临时变址
voidbackpatch(intp,intt);//回填
intmerge(intpl,intp2);//合并pl和p2
voidemit(char*res,char*numl,char*op,char*num2);//生成四元式
截图说明:
综合输入:
(赋值,循环,条件。
结合,口己定义即可)
Pleaseinputyoursourcestring:
nainO
do
x-5;y-6;
>whilo<7*8<9*10>;
b-12
;
>tt
t
<
1
♦
2
T1
>
2
<
3
♦
4
12
>
3
<
if
T1 goto 5 > -1 < goto 7 > S < 5 ■ X > b < 6 ■ y > 7 < 7 ♦ 8 T3 > H < 9 ♦ 10 T4 > 9 < if T3 goto 1 > 10 < goto 11 > 11 < 11 a a > 12 < 12 ■ b > Press any key1 ;ocontinue. 源代码: //•♦**♦*******编译器 // //***Erin*** //*"软件工程0801班"* //***HUST*** // 〃*******! ***♦・・・・・・********I******・ #include #include #include #include charprog[80];〃存放所有输入字符 chartoken[8};//存放词组 charch;〃单个字符 intsyn,p,m,n,i;〃syn: 种别编码 doublesum; intcount; intisSignal;//是否带正负号(0不带,1负号,2正号) intisError; intisDecimal;//是否是小数 doubledecimal;〃小数 intisExp;〃是否是指数 intindex;〃指数算 intisNegative;〃是否带负号 doubletemp; inttemp2; intrepeat;〃是否连续出现+,- intnextq; intkk;〃临时变址的标号 intntc,nfc,nnc,nnb,nna; char»rwtab[9)={"main","int","float","double","char","if","else","do","while"}; struct{ charresult[10];〃字符串(字符数组) chararglflO]; charopera[10]; chararg2[10]; }fourCom(20];〃结构体数组 voidscanner。 ;//扫描 voidlrparser(); voidstaBlock(int*nChain);//语句块 voidstaString(int*nChain);〃语句串 voidsta(int*nChain);〃语句 voidfuzhi();〃赋值语句 voidtiaojian(int*nChain);//条件语句 voidxunhuan();//循环语句 char*E();//Expresiion表达式 char*T();//Term项 char*F();//Factor因子 char・newTemp();〃f|动生成临时变虽 voidbackpatch(intp,intt);〃回填 intmerge(intpl,intp2);〃合并pl和p2 voidemit(char*佗s,char*numl,char*op,char*num2);〃生成四元式 voidmain() { P=0; count=0; isDecimal=O; index=O; repeat=O; kk=O; printf("\nPleaseinputyoursourcestring: \n"); do{ ch=getchar();prog[p++]=ch; }while(ch! ='#'); P=0; isError=0; scanner(); lrparser(); for(i=l;i { \t%5s printf("\n%d\t",i); printf("(%5s%5s%5s )\n"/fourCom[i].argl,fourCom[i].opera,fourCom[i].arg2/fourCom(i].result); } }voidIrparserf) { intnChain;nfc=ntc=l;nextq=l;if(syn==l)//main { scanner();if(syn==26)//( scanner();if(syn==27)//)scanner();staBlockf&nChain); else printfC*缺少右括号W);}else printfC缺少左括号\n"); } else printf("缺少main\n"); } //<语句块>: : ='{'<语句串>'}' voidstaBlock(int*nChain)//语句块{ if(syn==28)//{ { scanner(); staString(nChain);〃backpatch(*nChain,nextq);if(syn==29)//} scanner。 ;〃读下一个else printfC缺少}号\“); } else printff1缺少{号\岸); } //<语句串>: : =<语句〉{;<语句>}; voidstaString(int*nChain)//语句串{ sta(nChain);backpatch(*nChain,nextq);while(syn==31)//; { scanner();sta(nChain); } //backpatch(*nChain,nextq-l); voidstafint*nChain)〃语句 if(syn==10) {fuzhi(); //*nChain=O; } elseif(syn==6)//if {tiaojian(nChain); } elseif(syn==8)//doxunhuan(); } //<条件语句A>if(<条件>)<语句块〉 voidtiaojian(int*nChain) { charres[10],numl[10Lnum2[10],op[10]; intnChainTemp; //<条件a><表达式><关系运算符><表达式〉 if(syn==6)//if { scanner(); 〃strcpy(numl,E()); if(syn==26)//( { scanner();strcpyfnuml^O); if((syn<=37)&&(syn>=32)){ switch(syn) { case32: strcpy(op,">");break; case33: strcpy(op,">=");break; case34: strcpy(op/'<"); break; case35: strcpy(op,“<="); break; case36: strcpy(op,"=="); break; case37: strcpy(op,"! ="); break; default: printf("error"); } } scanner(); strcpy(num2,E());strcat(numl,op); strcat(numl,num2); //nfc=nextq+l; ntc=nextq;//记住if语句位置emit("0",“if”,numl,"goto"); nfc=nextq;//if中表达式为假 〃第一个0已回填backpatch(ntc,nextq);〃ntc链接的所有四元式都回填nextq} if(syn==27)//) scanner(); staBlockf&nChainTemp);//语句块*nChain=merge(nChainTemp,nfc); } } 〃<循环语句>: : =do<语句块>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 编译器 综合 报告 源代码 docx