版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理综合训练语义分析实验报告 指引教师: 班级:学生:zeadom学号:学生: 学号: /6/29目录 TOC o 1-3 h z u HYPERLINK l _Toc297722858 语言文法的形式化描述 PAGEREF _Toc297722858 h 3 HYPERLINK l _Toc297722859 语义规则 PAGEREF _Toc297722859 h 3 HYPERLINK l _Toc297722860 运行环境介绍 PAGEREF _Toc297722860 h 5 HYPERLINK l _Toc297722861 关键算法的流程图及文字解释 PAGEREF _To
2、c297722861 h 5 HYPERLINK l _Toc297722862 1、本编译器的总框架 PAGEREF _Toc297722862 h 5 HYPERLINK l _Toc297722863 2、在语义分析中的主要函数介绍 PAGEREF _Toc297722863 h 5 HYPERLINK l _Toc297722864 3、产生布尔表达式 PAGEREF _Toc297722864 h 7 HYPERLINK l _Toc297722865 4、While-do语句的语义分析 PAGEREF _Toc297722865 h 8 HYPERLINK l _Toc297722
3、866 5、词法、语法和语义分析的衔接 PAGEREF _Toc297722866 h 8 HYPERLINK l _Toc297722867 测试报告 PAGEREF _Toc297722867 h 8 HYPERLINK l _Toc297722868 附录 PAGEREF _Toc297722868 h 12语言文法旳形式化描述(BNF范式) 程序开始P-program i;SDn SC;定义语句SDn-SDSDn|nullSD-var int iSDTSDT - null|,iSDT复合语句SC-begin Sn endSn-S;Sn|null单个语句S-SD|SA|SIF|SW|SC
4、赋值语句SA-i:=E算术体现式E-cET|iET|(E)ETET-AE|CE|DE|null;C-+|-|*|/;布尔体现式B-EAEBT|NOT B|(B)BT BT-DB|nullA-|=|=|D-AND|ORif语句SIF-if B then S SELSESELSE-null|else S2while语句SW-while B do S语义规则(属性文法)产生式语 义 规 则i:=E Gen(:=, E.PLACE , ,entry(i) EE1+E2 E.PLACE = Newtemp; Gen(+ , E1.PLACE, E2.PLACE , E.PLACE ) EE1*E2 E.
5、PLACE = Newtemp; Gen(* , E1.PLACE, E2.PLACE , E.PLACE ) E E1 E.PLACE = Newtemp; Gen( , E1.PLACE, , E.PLACE ) E (E1) E.PLACE = E1.PLACE Ei E.PLACE = Entry(i) 产生式语 义 规 则Ei E.truelist:=makelist(nextquad); E.falselist:=makelist(nextquad+1); Gen( jnz,entry(i), ,0 ); Gen( j , , ,0 ) Ei1 R i2 E.truelist:=m
6、akelist(nextquad); E.falselist:=makelist(nextquad+1); Gen( jR,entry(i1),entry(i2),0 ); Gen( j , , ,0 ) E E1 E.truelist:= E1.falselist ; E.falselist:= E1.truelist ; E ( E1 ) E.truelist:= E1.truelist ; E.falselist:= E1.falselist ; M M.quad := nextquad ; EE1ME2 backpatch(E1.truelist, M.quad ); E.trueli
7、st:=E2.truelist; E.falselist:=merge(E1.falselist,E2. Falselist)EE1ME2 backpatch(E1. falselist, M.quad ); E.truelist:= merge(E1. truelist, E2. truelist); E.falselist:= E2. Falselist EE1ME2backpatch(E1.truelist, M.quad );E.truelist:= E2.truelist;E.falselist:=merge(E1.falselist, E2.Falselist) 产生式语 义 规
8、则Sif E then M S1 backpatch(E.truelist, M.quad );S.nextlist:=merge(E.falselist, S1.nextlist) M M.quad := nextquad ; N N.nextlist:=makelist(nextquad);Gen( j , , , 0 ) Sif E then M1 S1 N else M2 S2 backpatch(E.truelist, M1.quad );backpatch(E.falselist, M2.quad );S.nextlist:=merge(S1.nextlist, N.nextlis
9、t, S2.nextlist) Swhile M1 E do M2 S1 backpatch(S1.nextlist, M1.quad ); Gen( j , , , M1.quad ); backpatch(E.truelist, M2.quad ); S.nextlist:= E.falselist S begin L end S.nextlist:=L.nextlist S A S.nextlist:= makelist() /*空链*/ L S L.nextlist:=S.nextlist LL1; M S backpatch(L1.nextlist, M.quad );L.nextl
10、ist:=S.nextlist 运营环境简介运营环境是DEVC+Dev-C+是一种C&C+开发工具,它是一款自由软件,遵守GPL合同。它集合了GCC、MinGW32等众多自由HYPERLINK t _blank软件,并且可以获得最新版本旳多种工具支持,而这一切工作都是来自全球旳狂热者所做旳工作,并且你拥有对这一切工具自由使用旳权利,涉及获得 HYPERLINK t _blank 源代码等,前提是你也必须遵守GNU合同。Dev-C+每一天都在进步着,由于它是一种自由软件。 Dev-C+是一种非常实用旳编程软件,多款出名软件均由它编写而成,它在C旳基本上,增强了逻辑性核心算法旳流程图及文字解释1、
11、本编译器旳总框架2、在语义分析中旳重要函数简介Backpatch(int list,int quad)代码:void backpatch(int list,int patch) int tmp; while(list) tmp = list; list = RSStmp.jump; RSStmp.jump = patch; Merge (int list1,int list2)代码:int merge(int list1, int list2) int tmp = list2; if(list2=0)list2 = list1; else while(RSStmp.jump) tmp = RS
12、Stmp.jump; RSStmp.jump = list1; return list2;3、产生布尔体现式4、While-do语句旳语义分析5、词法、语法和语义分析旳衔接1、词法分析是分析输入代码产生词法三元式旳程序。读入代码,并将代码中旳单词分解成词法三元式。2、语法分析读入词法三元式,并根据词法三元式对句子进行语法分析。3、语义分析嵌入在语法分析中。根据语法分析中得到旳句子类型和语义四元式产生规则,产生四元式测试报告(测试用例,测试成果)测试用例输入程序(文献input.txt):program example;var int j,m,n; begin /*there is a comm
13、ent*/ j:=6; m:=3; /there is a comment n:=j+m; if n=3 and n10 then j:=j*4; while a=,8)(16,3,8)(12,and,8)(15,n,8)(23,10)(16,10,10)(7,then,10)(15,j,10)(26,:=,10)(15,j,10)(28,*,10)(16,4,10)(24,;,10)(10,while,11)(15,a,11)(23,=,n,3,106)105(j,-,-,111)106(j,n,10,113)112(j,-,-,115)113(*,j,4,T3)114(:=,T3,-,j)
14、115(j:22, :23,;:24,:25,:=:26,:27, *:28,/:29,.:30,=:32,:33 def isLetter(): global ch if ch=None: return False else: return ch.isalpha()def isDigit(): global ch if ch=None: return False else: return ch.isdigit()def concat(): global code global ch code = code+chdef getchar(l,i): if len(l)=i or i0: retu
15、rn None else: return lidef getstr():global codeglobal key_wordsglobal lltype = 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+,%d)%llelif code.isdigit():str=
16、 (16,+code+,%d)%llelse:str= (15,+code+,%d)%llreturn strll = 0flag = ;if _name_=_main_: src = rinput.txt outfile = routput.txt if not os.path.exists(src): print cannot open file,src else:inputf = open(src,r)outputf = open(outfile,w)annotation = 0ll = 0for line in inputf:ll=ll+1i = 0l = len(line)while
17、 i=len(line):breakcode = ch = getchar(line,i)i = i+1if annotation=1:if ch=* and getchar(line,i)!=None and getchar(line,i)=/:str = annotation end in line %dn%lloutputf.write(str)annotation = 0i=i+1continueif ch=/ and getchar(line,i)!=None and getchar(line,i)=/:outputf.write(line annotation in line %d
18、n%ll)i = i+1breakif ch=None:breakelif ch=/ and getchar(line,i)!=None and getchar(line,i)=*:str = annotation start in line %dn%lloutputf.write(str)i=i+1annotation = 1elif ch= or ch=n or ch=t:continueelif isLetter():while isLetter() or isDigit():concat()ch = getchar(line,i)i=i+1i=i-1str = getstr()str
19、= str+noutputf.write(str)continueelif isDigit():while isDigit():concat()ch = getchar(line,i)i=i+1i=i-1str = getstr()str = str+noutputf.write(str)continueelif ch in key_words:concat()ch = getchar(line,i)i=i+1if ch!=None and (code+ch) in key_words:concat()str = getstr()str = str+noutputf.write(str)els
20、e:i=i-1str = getstr()str = str+noutputf.write(str)else:str = error in line %dn%lloutputf.write(str)outputf.write(error code +ch+n);*资源文献(resource.h)*#ifndef RESOURCE_H_ZEADOM#define RESOURCE_H_ZEADOM#define $program 1#define $begin 2#define $end 3#define $var 4#define $integer 5#define $if 6#define
21、$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 $add 17#define $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
22、$mul 28#define $div 29#define $point 30#define $loe 31#define $goe 32#define $ne 33#endif*语义分析头文献(semantic.h)*#ifndef ZEADOM_SEMANTIC_H#define ZEADOM_SEMANTIC_H#include stringusing namespace std;#includeiostream#include fstream#include sstreamint quad,varT;int Nextquad() return quad+;string NextT()
23、varT+; string temp = T; stringstream ss; ssvarT; temp = temp+ ss.str(); return temp;void semantic_init() varT=0; quad=100;struct siyuanshi string op,par1,par2,result; bool hasop,haspar1,haspar2,hasresult; bool isjump; int jump; siyuanshi() op = par1 = par2 = result = ; hasop = haspar1 = haspar2 = ha
24、sresult = false; jump = 0; isjump=false; void setop(string arg) op = arg; hasop = true; void setpar1(string arg) par1 = arg; haspar1 = true; void setpar2(string arg) par2 = arg; haspar2 = true; void setresult(string arg) result = arg; hasresult = true; void setjump(int arg) jump = arg; isjump = true
25、; void output(ofstream &s) s (op,; if(haspar1) spar1,; else s-,; if(haspar2) spar2,; else s-,; if(isjump) sjump)endl; else if(hasresult) sresult)endl; else s-)endl; ;siyuanshi RSS10000;struct Estruct string lexval; Estruct()lexval=;struct Bstruct int truelist; int falselist; Bstruct()truelist=falsel
26、ist=0;struct Mstruct int quad; Mstruct()quad=0;void backpatch(int list,int patch) int tmp; while(list) tmp = list; list = RSStmp.jump; RSStmp.jump = patch; int merge(int list1, int list2) int tmp = list2; if(list2=0)list2 = list1; else while(RSStmp.jump) tmp = RSStmp.jump; RSStmp.jump = list1; retur
27、n list2;void semantic_output() ofstream out(Semantic.out); for(int i=100;iquad;i+) outi; RSSi.output(out); out.close();struct Sstruct int nextlist; Sstruct()nextlist=0;struct Nstruct int nextlist; Nstruct()nextlist=0;#endif*语法和语义分析程序(main.cpp)*#include iostreamusing namespace std;#include string.h#i
28、nclude string#include stdlib.h#include stdio.h#include resource.h#include semantic.h#define deal(s) if(!(s)return false;#define pdeal(s) if(!(s)cout没有找到文献结尾(程序与否未完毕?)line; if(!cin)cin.clear();normal = false;return false; while(line0!=() cinline; att=; int i,j=0; int l = line.length(); i=3; if(line2=
29、0&line2=9) type = (line1-0)*10+(line2-0); i=4; else type = line1-0; for(;linei!=,;i+) att.push_back(linei); for(i=0;i=0&linei=9) pos = pos*10 + (linei-0); i+; return true; word;/定义函数 bool error(string s);bool P();bool Sn(Sstruct &ss);bool S(Sstruct &ss);bool SDn();bool SD();bool SDT();bool SA();bool
30、 SIF(Sstruct &ss);bool SELSE(Sstruct &ss);bool SW(Sstruct &ss);bool SC(Sstruct &ss);bool B(Bstruct &bs);bool BT(Bstruct &bs);bool E(Estruct &es);bool ET(Estruct &es);bool A();bool C();bool D();/函数实现 bool error(string s) printf(语法错误:在第%d行n,word.pos); coutsprogram i;SDn SC;bool P() pdeal(word.normal);
31、 bool ret = true; Sstruct ss; if(word.type!= $program )error(缺少程序定义语句);ret = false; else pdeal(word.readNext(); if(word.type!=$flag)error(缺少程序名);ret = false; else pdeal(word.readNext(); if(word.type!=$)error(缺少语句结束标志); ret = false; else pdeal(word.readNext(); if(!SDn()ret = false; pdeal(word.normal)
32、; if(!SC(ss)ret = false; pdeal(word.normal); if(word.type!=$)error(缺少程序结束标志); ret = false; cout程序S;Sn|nullbool Sn(Sstruct &ss) deal(word.normal); bool ret = true; while(word.type!=$if&word.type!=$flag&word.type!=$var&word.type!=$while&word.type!=$begin) if(word.type=$end) return ret; error(语法错误); re
33、t = false; deal(word.readNext(); if(!S(ss)ret = false; backpatch(ss.nextlist,quad); deal(word.normal); if(word.type!=$)ret = false; error(缺少行终结符); else deal(word.readNext(); if(!Sn(ss)ret = false; deal(word.normal); return ret;/S-SD|SA|SIF|SW|SCbool S(Sstruct &ss) deal(word.normal); bool ret = true;
34、 switch(word.type) case $if:return SIF(ss); case $var: ss.nextlist=0; return SD(); case $flag: ss.nextlist=0; return SA(); case $while:return SW(ss); case $begin:return SC(ss); default: error(语法错误); /SDn-SD;SDn|nullbool SDn() deal(word.normal); if(word.type=$begin) return true; bool ret = true; whil
35、e(true) while(word.type!=$begin&word.type!=$var) error(语法错误); deal(word.readNext(); if(word.type=$var) if(!SD() while(true) if(word.type=$|word.type=$begin)break; deal(word.readNext(); else if(word.type!=$) error(缺少行终结符); ret = false; else deal(word.readNext(); if(word.type=$begin)break; return ret;
36、/SD-var int iSDTbool SD() deal(word.normal); bool ret = true; if(word.type!=$var) error(语法错误); return false; else word.readNext(); deal(word.normal); if(word.type!= $int ) error(语法错误); return false; else word.readNext(); deal(word.normal); if(word.type!=$flag) error(语法错误); return false; else word.re
37、adNext(); cout定义语句 null|,iSDTbool SDT() deal(word.normal); bool ret = true; if(word.type!=$comma)return true; word.readNext(); deal(word.normal); if(word.type!=$flag) error(语法错误); return false; else word.readNext(); deal(word.normal); return SDT();/SA-i:=Ebool SA() deal(word.normal); string result;
38、if(word.type!= $flag )error(语法错误);return false; else result = word.att; deal(word.readNext(); deal(word.normal); if(word.type!= $copy )error(语法错误);return false; cout赋值语句if B then S SELSEbool SIF(Sstruct &ss) deal(word.normal); bool ret = true; if(word.type!= $if ) ret =false; error(缺少if); else word.
39、readNext(); deal(word.normal); Bstruct bs; if(!B(bs)return false; if( word.type != $then ) ret = false; error(缺少then); else word.readNext(); deal(word.normal); coutnull|else S2bool SELSE(Sstruct &ss) deal(word.normal); bool ret = true; if(word.type!=$else)return true; word.readNext(); deal(word.norm
40、al); coutwhile B do Sbool SW(Sstruct &ss) cout循环语句begin Sn endbool SC(Sstruct &ss) deal(word.normal); bool ret = true; if(word.type!=$begin)error(复合语句缺少begin);ret = false; else word.readNext(); deal(word.normal); if(!Sn(ss)ret = false; deal(word.normal); if(word.type!=$end)error(复合语句缺少end);ret = fal
41、se; else word.readNext(); cout复合语句EAEBT|NOT B|(B)BT bool B(Bstruct &bs) deal(word.normal); bool ret = true; if(word.type= $left ) word.readNext(); deal(word.normal); if(!B(bs) return false; if(word.type!= $right ) error(缺少括号); ret = false; else word.readNext(); deal(word.normal); if(!BT(bs) ret = fa
42、lse; deal(word.normal); else if(word.type= $not) word.readNext(); deal(word.normal); Bstruct bsa; if(!B(bsa)return false; bs.falselist = bsa.truelist; bs.truelist = bsa.falselist; else if(word.type=$flag|word.type=$num) Estruct es1; if(!E(es1)return false; if(!A()return false; string op = word.att;
43、op = j+op; word.readNext(); Estruct es2; if(!E(es2)return false; int quad = Nextquad(); bs.truelist = quad; RSSquad.setjump(0); RSSquad.setpar1(es1.lexval); RSSquad.setpar2(es2.lexval); RSSquad.setop(op); quad = Nextquad(); bs.falselist=quad; RSSquad.setop(j); RSSquad.setjump(0); if(!BT(bs)return false; else error(语法错误); return false; return ret;/BT-DB|null bool BT(Bstruct &bs) deal(word.normal); if(!D() return true; int type = word.type; word.readNext(); deal(word.normal); Mstruct mtmp; mtmp.quad = quad; Bstruct bsa; if(!B(bsa)cout语法错误 word.ty
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课题申报参考:教育公平与合作学习研究
- 二零二五年度铁路旅客运输合同修订版2篇
- 2025版图书电子文档txt下载代理授权合同3篇
- 二零二五年高校创新创业基地入驻服务合同3篇
- 2025年度个人小产权房屋买卖合同范本与税务筹划要点4篇
- 二零二五年度4S店汽车销售区域代理合同范本3篇
- 二零二五版智慧交通管理系统建设与运营协议3篇
- 二零二五年度马铃薯深加工废弃物资源化利用合同4篇
- 二零二五年度创新型企业房屋租赁合同书
- 2025年度平房出租与城市可持续发展合作协议4篇
- 第1课 隋朝统一与灭亡 课件(26张)2024-2025学年部编版七年级历史下册
- 2025-2030年中国糖醇市场运行状况及投资前景趋势分析报告
- 冬日暖阳健康守护
- 水处理药剂采购项目技术方案(技术方案)
- 2024级高一上期期中测试数学试题含答案
- 盾构标准化施工手册
- 山东省2024-2025学年高三上学期新高考联合质量测评10月联考英语试题
- 不间断电源UPS知识培训
- 三年级除法竖式300道题及答案
- 人教版八级物理下册知识点结
- 2024年江苏省徐州市中考一模数学试题(含答案)
评论
0/150
提交评论