一个PASCAL语言子集编译器的设计与实现.doc
-
资源ID:1600813
资源大小:107KB
全文页数:8页
- 资源格式: DOC
下载积分:16金币
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
一个PASCAL语言子集编译器的设计与实现.doc
一个PASCAL语言子集编译器的设计与实现总体思想词法分析语法及语义分析目标代码的生成问题收获与感想裴卫军同组成员:蒋世凯(一)总体思想本程序分成两遍,词法分析单独作为一遍,语法、语义分析及目标代码产生合并起来作为另一遍。词法分析器语法、语义分析及代码产生出错处理标识符标和符号表源程序(二)词法分析一、单词符号及内部表示:由于编译程序工作过程中关心的并不是各元素的名字,可以给个单词符号编码以利于处理。单词符号特别编码单词符号特别编码标识符0+17program1-18const2*19var3/20procedure4<>21begin5<=22end6<23if7>=24then8>25else9=26while10:=27do11;28call12,29read13.30write14n31odd15(32常数(整)16)33二、词法分析主要算法思想算法的基本任务是从字符串表示的源程序中(先把源程序保存到一数组中,把“TAB”键替换为一空格)识别出具有独立意义的单词符号,其基本思想是跟据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。主程序示意图:矚慫润厲钐瘗睞枥庑赖賃軔朧。置初值调用扫描子程序把单词二元组插入链表中输入串结束结束是否三、词法分析结果:词法分析结果保存在一个链表中,其节点为:typedef struct lexnodeint code;int value;lexnode *next;lexnode;聞創沟燴鐺險爱氇谴净祸測樅。其中code表示单词符号的特别编码,value表示其值,next指向下一个节点。标识符的具体属性也保存在一链表中,其节点为:typedef struct idnodechar idMAX_ID_LENGTH;int num;int value;idnode *next;idnode;残骛楼諍锩瀨濟溆塹籟婭骒東。其中id表示标识符的名字,num表示其次序以和其他区别,value表示其值,next指向下一个节点。识别出的任一标识符首先查关键字表(通过函数Reserve() ),若是关键字则返回其特别码,否则返回0(标识符的特别码)。酽锕极額閉镇桧猪訣锥顧荭钯。词法分析结果同时也属处在一文件中(“lexresult.txt”)。如对如下的一段代码:program a;const c=10;var b;procedure f(b);beginb:=10;write(b)endbeginb:=10;b:=10;write (b);read (b);while b<>10 do beginb:=2;b:=10end;if b<>10 then b:=10end.输出到文件结果为:关键字: program 标识符: a 符号: ; 换行符!关键字: const 标识符: c 符号: = 常数: 10 符号: ; 换行符!关键字: var 标识符: b 符号: ; 换行符!关键字: procedure 标识符: f 符号: ( 标识符: b 符号: ) 符号: ; 换行符!彈贸摄尔霁毙攬砖卤庑诒尔肤。关键字: begin 换行符!标识符: b 符号: := 常数: 10 符号: ; 换行符!关键字: write 符号: ( 标识符: b 符号: ) 换行符!关键字: end 换行符!关键字: begin 换行符!标识符: b 符号: := 常数: 10 符号: ; 换行符!标识符: b 符号: := 常数: 10 符号: ; 换行符!关键字: write 符号: ( 标识符: b 符号: ) 符号: ; 换行符!关键字: read 符号: ( 标识符: b 符号: ) 符号: ; 换行符!关键字: while 标识符: b 符号: <> 常数: 10 关键字: do 换行符!关键字: begin 换行符!标识符: b 符号: := 常数: 2 符号: ; 换行符!标识符: b 符号: := 常数: 10 换行符!关键字: end 符号: ; 换行符!关键字: if 标识符: b 符号: <> 常数: 10 关键字: then 标识符: b 符号: := 常数: 10 换行符!謀荞抟箧飆鐸怼类蒋薔點鉍杂。关键字: end 符号: . 换行符!四、其他本程序把“换行符n”也作为一词法分析结果,保存在词法分析结果链表中,极大方便了后面语法和语义分析中报告出错位置,对调试本程序,更重要的还是对编译程序的出错处理带来了极大的方便。厦礴恳蹒骈時盡继價骚卺癩龔。语法及语义分析一、语法分析采用LL(1)文法分析方法中的递归下降子程序法,给每一个非终结符编一段程序,其中“”(可有可无的产生式)用if语句实现,“”(0到多次重复的产生式)用if语句加另一函数实现(如:constt_1()函数是constt()函数的闭包声明,其他相同)。茕桢广鳓鯡选块网羈泪镀齐鈞。二、语义分析和语法分析同遍穿插进行,其分析过程中的符号表定义如下:typedef struct tablechar nameMAX_ID_LENGTH;/符号的名字int kind;/符号的种类:变量、常量、过程名等等int value,level,adrress,size;/值,层次,相对地址,大小table;具体过程中建立一数组,如下面的代码:Const a=1,b=2;Var c,d;Procedure e;Var f;将会产生下面的符号表:NAMEKINDVALUELEVELADDRRESSSIZEPointeraConst1tx0bConst2cVarlevdxdVarlevdx+1eProcedurelevdx+24fVarlev+1tx可以通过查询、修改符号表来进行类型检查、检查变量是否定义、当前过程层次的确认、目标代码的生成等等一系列工作。鹅娅尽損鹌惨歷茏鴛賴縈诘聾。 三、 函数rowc()定义如下:(它不仅实现指针指向下一个单词符号,而且实现行数:row的计算)。void rowc(void)/lexpointer=lexpointer->next;if(lexpointer->code)=31)while(lexpointer->code=31)printf("n%d",row);lexpointer=lexpointer->next;row+;else lexpointer=lexpointer->next;if(lexpointer->code)=31)while(lexpointer->code=31)printf("n%d",row);lexpointer=lexpointer->next;row+;四、出错处理中仅列出第一个错误,因为有一个错误发生后很可能引起错报,把后面正确的代码误认为有错,所以仅报告第一个错误的行数和原因。籟丛妈羥为贍偾蛏练淨槠挞曉。五、语法分析流程图如下:开 始是否为关键字program否出错处理是否是否为程序名出错处理否是否为符号;出错处理是是否为关键字const是是否符号,是是否整常量是是否符号=是是否常量名是否否否否否是否符号;出错处理出错处理出错处理否出错处理是是是否关键字var是否是是否变量名是否符号;是否符号,出错处理否出错处理否否是否过程名是是否符号;是是是否关键字procedure否否否出错处理出错处理否是否关键字begin出错处理是是是是否符号;是是否算术表达式是是否为符号:=是否变量名否否否否出错处理出错处理出错处理是是是是否为具体操作是否关键字then是否为比较结果是否关键字if是否否否否出错处理出错处理出错处理是否是是否为具体操作是否为else否出错处理是是是是是否为具体操作是否关键字do是否比较结果是否为关键字while否否否出错处理出错处理否出错处理是是否过程名是是否关键字call否否出错处理是是否为常量或变量是是否为关键字read否否出错处理是是否为常量或变量是是否为关键字write否否出错处理否是否为关键字end出错处理是否是否为结束符号.出错处理是结束目标代码的生成本部分预定在语法和语义分析过程中,采用语法制导翻译进行,但由于本人能力有限,对目标机的存储结构和指令系统理解得不够透彻,目标代码生成找不到有效的方法,未能完成。預頌圣鉉儐歲龈讶骅籴買闥龅。问题在完成课设的过程中,遇到了无数的困难和问题,有的得到了很好的解决,有的到目前还没有得到很好的解决,比如说目标代码的产生。其中最大的一个问题是在要验收的前几天我突然病倒了,在医院住了几天,我的同伴在医院照料我,两个人都无暇顾及我们的课设,最后课设的目标代码生成部分没有完成。当然这只能怪我们自己,谁让我们没有好好利用最开始的几天呢,如果我们提前就完成的话就不会出现这种问题了。渗釤呛俨匀谔鱉调硯錦鋇絨钞。另外在课设验收时,由于自己生病头晕,回答问题时前言不搭后语,有两个问题没有给老师明确答复,现给出自己的答案:铙誅卧泻噦圣骋贶頂廡缝勵罴。递归下降子程序法就是LL(1)文法分析方法的一种(另一种是构造预测分析表法),递归下降子程序法就是自顶向下的LL(1)分析法。擁締凤袜备訊顎轮烂蔷報赢无。在进行SLR(1)分析时需要构造FOLLOW集来确认用哪一个产生式归约,而FOLLOW集的构造要建立在FIRST集构造的基础上,故进行SLR(1)分析要构造FIRST和FOLLOW集。贓熱俣阃歲匱阊邺镓騷鯛汉鼉。收获与感想经过这次课设,学到了许多仅仅研究书本所得不到的东西:一、了解到了编译的一些实际所要解决的问题,学到了编译程序设计的一般过程,以及在此过程中的一些技巧,基本方法和手段等等。坛摶乡囂忏蒌鍥铃氈淚跻馱釣。二、认识到一种计算机语言和他的编译程序是紧紧联系在一起的,没有他的编译程序,语言毫无用处,它的编译程序决定了这种计算机语言的功能、风格等等几乎全部东西。蜡變黲癟報伥铉锚鈰赘籜葦繯。三、自动机理论在计算机学科中的重要性,以前觉得Turing对计算机的贡献都是别人胡嘘的,现在才知道自动机理论在计算机语言、计算机解决问题的可行性等方面具有重要的基础作用,真的是:“在不了解形式语言及自动机理论的前提下就不能对计算机科学进行严肃的研究。”買鲷鴯譖昙膚遙闫撷凄届嬌擻。四、做任何事情越早完成越好,千万不能往后面拖,明天是什么样子,谁也不知道,唯一能牢牢把握的只有今天和现在。綾镝鯛駕櫬鹕踪韦辚糴飙钪麦。本课设报告仅列出了自认为比较关键和一些个人观点较浓的地方,可能内容有些不是太连贯,跨度比较大。20XX年1月