编译原理实验编译器综合报告附源代码 (1)_第1页
编译原理实验编译器综合报告附源代码 (1)_第2页
编译原理实验编译器综合报告附源代码 (1)_第3页
编译原理实验编译器综合报告附源代码 (1)_第4页
编译原理实验编译器综合报告附源代码 (1)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理编译器综合实验工程精品神刀公子-. 实验背景编译器就是将一种语言(通常为高级语言)翻译为另一种语言(通常为低级语言) 的程序。一个现代编译器的主要工作流程:源代码(source code) T预处理器 (preprocessor)- 编译器(compiler)- 目标代码(object code)- 链接器(Linker)- 可执 行程序(executables)高级计算机语言便于人编写,阅读交流.维护。机器语音是计算机能直接解读、运行 的。编译器将汇编或高级计算机语言源程序(Source program作为输入,翻译成目标 语言(Targetlanguage)机器代码的等价程序。源代

2、码一般为高级语言(High-level language).如Pascal、C、C+、Java、汉语编程等或汇编语言,而目标则是机器语言 的目标代码(Objectcode),有时也称作机器代码(Machinecode)。对于C、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成 通用中间语言(MSIL/CIL)的字节码(ByteCode)最后运行的时候通过通用语言运行 库的转换,编程最终可以被CPU直接计算的机器码(Nativecode)。二.算法设计典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文 件中的函数调用)的机器代码所组成的目标文

3、件。一组目标文件,不必是同一编译器产生, 但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的 EXE,词法分析程序9语法分析程序9语义分析程序9编译器。不断完善,不断改进。 渐变的过程。O 0 O函数。O Ovoid scanner。; /扫描 void lrparser();void staBlock(int nChain);/语旬块void staString(int *nChain); /ifi句串void sta(int *nChain);/ifi句void fuzhi(); /賦值语句void tiaojianfint *nChain); /条件语句voi

4、d xunhuan(); /循环语句char* E); /Expresiion 表达式char* T();/Term 项char* F(); /Factor 因子char newTemp();/l1动生成临时变址void backpatch(int p,int t); /回填int merge(int pl,int p2); /合并 pl 和 p2void emit(char *res,char *numl,char *op,char *num2);/生成四元式截图说明:综合输入:(赋值,循环,条件。结合,口己定义即可)Please input your source string: nain

5、Odo ifl*2x-5; y-6;whilo7*8;b-12;ttt23ifT1-1Sb7H9ifT3101112Pressanykey 1;o continue.源代码:/* 编译器/*Erin*/*软件工程0801班*/*HUST*/*!*I* #include#include#include#includechar prog80; 存放所有输入字符char token8; /存放词组char ch; 单个字符int syn,p,m,n,i; syn:种别编码double sum;int count;int isSignal; /是否带正负号(0不带,1负号,2正号)int isErro

6、r;int isDecimal; /是否是小数double decimal; 小数int isExp; 是否是指数int index; 指数算int isNegative; 是否带负号double temp;int temp2;int repeat; 是否连续出现+,-int nextq;int kk;临时变址的标号int ntc,nfc,nnc,nnb,nna;char rwtab9)=main,int,float,double,char,if,else,do,while;structcharresult10;字符串(字符数组)char arglflO;char opera10;char a

7、rg210;fourCom(20; 结构体数组void scanner。; /扫描void lrparser();void staBlock(int *nChain); /语句块void staString(int *nChain); 语句串void sta(int *nChain); 语句void fuzhi(); 赋值语句void tiaojian(int *nChain); /条件语句void xunhuan(); /循环语句char* E(); /Expresiion 表达式char* T(); /Term 项char* F(); /Factor 因子char newTemp();f|

8、动生成临时变虽void backpatch(int p,int t); 回填int merge(int pl,int p2);合并 pl 和 p2void emit(char *佗s,char *numl,char *op,char *num2); 生成四元式void main()P=0;count=0;isDecimal=O;index=O;repeat=O;kk=O;printf(nPlease input your source string:n);doch=getchar(); progp+=ch;while(ch!=#);P=0;isError=0;scanner();lrparse

9、r();for(i=l;inextq;i+) /循环输出四元式t%5sprintf(n%dt,i);printf(%5s%5s%5s)n/fourComi.argl,fourComi.opera,fourComi.arg2/fourCom(i.result); void Irparserf)int nChain; nfc=ntc=l; nextq=l; if(syn=l) /mainscanner(); if(syn=26) /(scanner(); if(syn=27)/) scanner(); staBlockf&nChain);elseprintfC*缺少右括号W); elseprint

10、fC缺少左括号n);elseprintf(缺少 mainn);/语句块:=语句串void staBlock(int *nChain) /语句块 if(syn=28) /scanner();staString(nChain); backpatch(*nChain,nextq); if(syn=29) /scanner。; 读下一个 elseprintfC 缺少号“);elseprintff1缺少号岸);/语句串 := 语句;语句;void staString(int *nChain) /语句串 sta(nChain); backpatch(*nChain,nextq); while(syn=31

11、) /;scanner(); sta(nChain);/backpatch(*nChain,nextq-l);void stafint *nChain) 语句if(syn=10) fuzhi();/*nChain=O;else if(syn=6) /if tiaojian(nChain);else if(syn=8) /do xunhuan();/if() 语句块void tiaojian(int *nChain)char res10,numl10Lnum210,op10;int nChainTemp;/ 表达式if(syn=6) /ifscanner();strcpy(numl,E();if

12、(syn=26) /(scanner(); strcpyfnumlO);if(syn=3 2) switch(syn)case 32: strcpy(op,); break;case 33: strcpy(op,=); break;case 34: strcpy(op/scanner?srrcpwnumlmo);5(syrKU37)Q8t(synvM32)switch(syn)srrcpy(op=v=r break case 33:srrcpyopsvsh break case 3asrrcpyopsA-r break case 3Wsrrcpyop-Ae break case 36 八sqc

13、pyopfe break case 37:srrcpyopsHJ break defauFprintf(=error=r)scannersSrrcpy(num2m(=rstrcat(numl,op);strcat(numl,num2); nnb=nextq;backpatch(nnb,n nc); nn a=nextq; backpatch(nna,nextq);if(syn=27) /)scan ner();void fuzhi() /賦值语句只有1个操作数char res10,num10; /num 操作数if(syn=10) 字符串strcpy(res,token); 结果 scanne

14、r。; if(syn=21)/=scanner(); strcpy(num,E(); emit(res,num,=,);elseprintfC 缺少=号n); char* E() /Expression 表达式char *res,*numl,*op/*num2; res=(char *)malloc(10); numl=(char )malloc(10);op=(char *)malloc(10); num2=(char *)malloc(10); strcpy(numlJO);while(syn=22) 11 (syn=23) /+ - if(syn=22) /+strcpy(op,+);e

15、lsestrcpy(op,-);scanner(); strcpy(num2,T(); strcpy(res,newTemp(); emit(res,numl,op,num2); strcpy(numl,res); return numl;char* T() /Term 项char *res,*numl/*op,*num2; res=(char *)malloc(10); numl=(char *)malloc(10); op=(char *)malloc(10); num2=(char )malloc10); strcpy(numl,F();while(syn=24) 11 (syn=25)

16、 /* / jf(syn=24)strcpy(op,);elsestrcpy(op;7); scanner(); strcpy(num2/F(); strcpy(res,newTemp(); emit(佗 s,numl,op,num2); strcpy(numl,res);佗山3 numl;cha严 F() /Factor 因子char *res;res=(char *)malloc(10);if(syn=10) 字符串strcpy(res,token); scanner();else if(syn=2O) 二进制数itoa(int)sum,res,10); /整数转换为字符串 scanner

17、();else if(syn=26) /(scanner(); res=E();if(syn=27) /)scanner();else isError=l;elseisError=l;return res;char *newTemp()char *p;charvarTemp10;p=(char *)malloc(10);kk+;itoa(kk,varTemp,10);strcpy(p+l,varTemp);pO=T;return p;将p所链接的每个四元式的第四个分呈都回填t void backpatch(int p,int t)int w,circle=p;while(circle) /ci

18、rcle 不为 0 的时候 w=atoi(fourComcirdel.result); 四元式 circle 第四分虽:内容 /strcpy(fourComcircle.result,t);/ft! t 填进四元式 circle 的第四分fit sprintf(fourComcircle.result,%d,/t);circle=w; w记录的是链条上下一个四元式,移动!return;int mergefint pl,int p2) /合并 pl 和 p2char circle,nResult;if(p2=0)nResult=pl;elsenResult=cirde=p2;while(atoi

19、(fourComcircle).result) 四元式第四个分虽:不为 0circle=atoi(fourCom(circle).result); /strcpy(fourComcircle.result,pl); sprintf(fourComcircle.result,%s,pl);目的是用pl的值覆孟0return nResult; /p2 是头,pl 覆盖 0,接在 p2 后边void emit(char *res,char *numl,char *op,char *num2)strcpy(fourComnextq.result,res);strcpy(fourComnextq).ar

20、gl/numl);strcpy(fourComnextq.opera,op); strcpy(fourComnextq.arg2,num2); nextq+;void scanner()sum=0;decimal=0;m=0;for(n=0;n=,a,)&(ch=A,)&(chx,a*)&(ch=,A)&(ch=,0,)&(chtoken ch=progp+); 读下一个字符 tokenm+=0; p-;/回退一格 syn=10;标识符如果是begin,if,then,while,do,end标识符中的一个 for(n=0;n=0)&(ch=0)&(ch=,0*)&(ch=0)&(ch=9)指数 index=index* lO+ch-O; ch=progp+J;/10的吊/123e3 代表 123*10(3) sum=sum*pow(10,index);是错误的 if(isNegative) sum=sum*pow(0.1,index);elsesum=sum*pow(10,index);if(isSignal=l) sum=-sum; isSignal=O;P-;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论