编译原理语义分析实验报告_第1页
编译原理语义分析实验报告_第2页
编译原理语义分析实验报告_第3页
编译原理语义分析实验报告_第4页
编译原理语义分析实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理综合训练语义分析实验报告指导老师:班级:学生:zeadom学号:学生:学号:错误!未定义书签.错误!未定义书签。错误!未定义书签。错误!未定义书签。 错误!未定义书签。 错误!未定义书签。,错误!未定义书签。 错误!未定义书签。 错误!未定义书签。.错误!未定义书签。.错误!未定义书签。2011/6/29目录语言文法的形式化描述语义规则运行环境介绍关犍算法的流程图及文字解释. 1、本编译器的总框架2、在语义分析中的主要函数介绍 3、产生布尔表达式4、While-do语句的语义分析. 5、词法、语法和语义分析的衔接 测试报告附录语言文法的形式化描述(BNF范式)程序开始P->pro

2、gram i;SDn SC;定义语句 SDn->SDSDn|nullSD->var int iSDTSDT ->null|,iSDT复合语句SC->begin Sn endSn->S;Sn| | null单个语句 S->SD|SA|SIF|SW|SC赋值语句SA->i:=E算术表达式 E->cET|iET|(E)ETET->AE|CE|DE|null;C->+|-|*l/;布尔表达式 B->EAEBT|NOTB|(B)BTBT->DB|nullA-»|<| = |>=|<=|<>D-

3、>AND|OR语句 ifSIF->if B then S SELSESELSE->null|else S2语句 whileSW->while B do S语义规则(属性文法).产生式语义规则i:=E Gen(:=, , 一 , entry(i) = Nevtemp; EE1+E2 Gen(十一 , ) = Newtemp; EE1*E2);Gen(*/ZEl -E = Newtemp;Gen(f/ , )E(E1) = Ei = Entry(i)产生式则语义规:=makelist(nextquad); :=makelist(nextquad+l);EiGen( jnzt

4、 entry(i), 一 ,0); Gen( j , 一 , 一 , 0) :=makelist(nextquad); :=makelist(nextquad+l);Eil R i2 0 ), 一 , 0); Gen( j Gen(JR, entry(il), entry(i2)> ; := E - El;:= E ( El) 一 /M )£ := nextquad ;backpatch,);ME2 EE1A :二merge,E2. Falselist)backpatch(El. falselist,);:=merge(El. truelist, E2. truelist);M

5、E2 EE1V := E2. Falselist backpatch,); 一 .一 fME2 EEI A emerge, 产生式语义规则backpatch, SI );Sif E then M:二merge,:= nextquad; M £N £ :=makelist(nextquad); 一 , ,0) Gen(j,Sif E then Ml SI); backpatch, else M2 S2);backpatch, N:=merge, ,Swhile MIE backpatch, ); Gen( j, , 一 / ); backpatch, ); := do M2

6、SI :=S begin L endSA:= makelist() /* 空链 */:=L S backpatch, ); SLL1: M运行环境介绍运行环境是DEVC+Dev-C+是一个C&C+开发工具,它是款自由软件,遵守GPL协议。它集合了 GCC、MinGW32 等众多自由软件,并且可以取得最新版本的各种工具支持,而这切工作都是来自全球的狂热者 所做的工作,并且你拥有对这切工具自由使用的权利,包括取得源代码等,前提是你也必须遵 守GNU协议。Dev-C+每一天都在进步着,因为它是个自由软件。Dev-C+是个非常实用的 编程软件,多款着名软件均由它编写而成,它在C的基础上,增强了

7、逻辑性关键算法的流程图及文字解释1、本编译器的总框架2、在语义分析中的主要函数介绍Backpatch(int listjnt quad)代码:void backpatch(int listjnt patch) int tmp;while(list)tmp = list;list = RSStmp.jump;RSStmp.jump = patch;Merge (int listl,int Iist2)代码:int merge(int listl, int Iist2)int tmp = Iist2; if(list2=0)list2 = listl;elsewhile(RSStmp.jump)

8、(tmp = RSStmp.jump;)RSStmp.jump = listl;return Iist2;. "n二一 l 三 口 r;nFv :la i * tnM储对迎5 一漕指丁至少,4、While-do语句的语义分析5、词法、语法和语义分析的衔接1、词法分析是分析输入代码产生司法三元式的程序。读入代码,并将代码中的单词分解成同法 三元式。2、语法分析读入词法三元式,并根据词法三元式对句子进行语法分析。3、语义分析嵌入在语法分析中。根据语法分析中得到的句r类型和语义四元式产生规则,产生 四元式测试报告(测试用例,测试结果)测试用例输入程序(文件):program example

9、;va 门 nt j,m,n;begin /*there is a comment*/j:=6;m:=3; :/<=:_x0019_/>=:/<>:)def isLetter():global chif ch=None:return Falseelse:return ()global chif ch=None:return Falseelse:return ()def concat():global codeglobal chcode = code+ch def getchar(lj):if len(l)<=i or i<0:return Noneelse:

10、return lidef getstr():global codeglobal key_wordsglobal IItype = 0state = Nonestr = ;if code=None:str = u(0/+code+/%d)%llelif code in key_words:if(key_wordscode=25):str = error code in line %dn%llstr = str + error code :else:str= u(+key_wordscode+u/+code+z%d)%llelif ():str= (16/+code+/%d)%llelse:str

11、= (15,+code+,%d)%llreturn str11 = 0flag =;if _name_=_main_:src = routfile = rif notprint cannot open file,srcelse:inputf = open(srczoutputf = open(outfile,w) annotation = 011 = 0for line in inputf:11=11+1i = 0I = len(line) while i<l: if i>=len(line): break code = ch = getchar(linej) i = i+l if

12、 annotation=l:if ch=* and getchar(line,i)!=None and getchar(line/i)=7,: str = annotation end in line %dn%ll(str)annotation = 0i=i+l continueif ch=7, and getchar(line,i)!=None and getchar(line/i)=7,: (line annotation in line %dn%ll)i = i+l break if ch=None: breakelif ch=V and getchar(line,i)!=None an

13、d getchar(line/i)=,#,: str = annotation start in line %dn%ll(str)i=i+lannotation = 1elif ch= or ch= or ch=,t,:continueelif isLetter():while isLetter() or isDigit(): concat()ch = getcharflinej) i=i+li=i-lstr = getstr()str = str+(str)continueelif isDigit():while isDigit():concat()ch = getchar(linezi)i

14、=i+li=i-lstr = getstr()str = str+(str)continueelif ch in key_words:concat()ch = getchar(linej)i=i+lif ch!=None and (code+ch) in key_words:concat()str = getstr()str = str+(str)else:i=i-lstr = getstr()str = str+(str)else:str = error in line %dn%ll(str)(error code +ch+);*资源文件O今*率*ffifndef RESOURCE_H_ZE

15、ADOM#define RESOURCE_H_ZEADOM ftdefine $program 1# define $begin 2# define $end 3ftdefine $var 4# define $integer 5# define $if 6# define $then 7# define $else 8# define $do 9# define $while 10# define $int 11# define $and 12# define $or 13# define $not 14# define $flag 15# define $num 16# define $a

16、dd 17ftdefine $sub 18# define $left 19# define $right 20# define $eq 21# define $gt 22# define $lt 23# define $ 24# define $copy 26# define $comma 27# define $mul 28# define $div 29# define $point 30# define $loe 31# define $goe 32#define $ne 33#endif ffifndef ZEADOM_SEMANTIC_H*今*冬*拿*语义分析头文件O*#defin

17、e ZEADOM_SEMANTIC_H #include string using namespace std; #includeiostream includestream#include sstreamint quadzvarT;int Nextquad() return quad+;string NextT()varT+;string temp = T;stringstream ss;ss«varT;temp = temp+ (); return temp;)void semanticjnit()varT=O;quad=100;struct siyuanshi(string o

18、p,parl/par2/result;bool hasop.hasparlasparZasresult;bool isjump;int jump;siyuanshi()op = pari = par2 = result = ;hasop = hasparl = haspar2 = hasresult = false;jump = 0;isjump=false;)void setop(string arg)op = arg;hasop = true;void setparl(string arg)pari = arg;hasparl = true;)void setpar2(string arg

19、)par2 = arg;haspar2 = true;)void setresult(string arg)result = arg;hasresult = true;)void setjump(int arg)jump = arg;isjump = true;)void output(ofstream &s)(s« («op«z;if(hasparl) s«parl«z;elseif(haspar2)s«par2«z; elseif(isjump)s«jump«)«endl;elsei

20、f(hasresult) s«result«)«endl;elses«-«)«endl;);siyuanshi RSS10000;struct Estruct(string lexval;Estruct()lexval=;struct Bstructint truelist;int falselist;Bstruct()truelist=falselist=O;struct Mstructint quad;Mstruct()quad=O;void backpatch(int listjnt patch)int tmp;while(li

21、st)(tmp = list;list = RSStmp.jump;RSStmp.jump = patch;int merge(int listl, int Iist2)int tmp = Iist2;if(list2=0)list2 = listl;elsewhile(RSStmp.jump) (tmp = RSStmp.jump;)RSStmp.jump = listl;return Iist2; void semantic_output()(ofstream out();for(int i=100;i<quad;i+) (out«i;RSSi.output(out);)

22、();struct Sstruct int nextlist; Sstruct()nextlist=O;struct Nstruct (int nextlist;Nstruct()nextlist=O; ;Sendif*.*.*.*.*语法和语义分析程序()*include iostream using namespace std;#includeffinclude string#include#include#include#include#define deal(s) if!(s)return false;撅院潼?挚愤?桀?筏溷瑶?没有找到文件结尾(程序是否未完成)«endl;r

23、eturn false; etop(:=);RSSquad.setparl;RSSquad.setresult(result);return true;etop(j);RSS.setjump(O);Mstruct m2;=quad;Sstruct ss2;if(!SELSE(ss2)ret =false; deal;backpatch,; backpatch,;=merge(merge/;return ret;etop(j);RSSswquad.setjump;backpatch,;backpatch,;return ret;etjump(O);RSSquad.setparl;RSSquad.setpar2;RSSquad.setop(op);quad = Nextquad();=quad;RSSquad

温馨提示

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

评论

0/150

提交评论