编译程序实验_第1页
编译程序实验_第2页
编译程序实验_第3页
编译程序实验_第4页
编译程序实验_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

附录B编译程序实验B.1选择实验题目的途径B.2实验题B.3实验报告范例附录B编译程序实验B.1选择实验题目的途径编译程序是一个十分复杂的加工处理程序,它将便于人们阅读但不能直接在计算机上执行的源代码程序翻译成语义上等价且可以在计算机上执行的目标程序。为此,一般将整个编译程序划分为5个处理阶段,它们是词法分析、语法分析、中间代码生成(语义分析)、代码优化和目标代码生成。词法分析阶段对源程序进行自左至右的扫描,将它从外部形式(字符串)变换成便于后几个阶段处理的内部形式,即分解出一个个有独立语法意义的单位,称之为单词(或符号),同时识别出与其相关的属性。语法分析阶段根据程序语言的语法规则对词法分析产生的单词序列进行语法检查,凡不合语法者,尽可能多和确切地指出错误(包括出错的位置、原因和性质)。否则,变换成各类语法范畴(如变量)。语义分析阶段根据语法分析所识别出的语法范畴,分析其含义并产生相应的中间代码(如三元式、四元式等)。优化阶段对语义分析所产生的中间代码进行改造以获得等价但更为高效(指时间和空间的节省)的中间代码。图1编译工作流程图目标代码生成阶段根据中间代码和表格信息进行存储分配、选择代码,形成可在计算机上执行的目标程序。如果目标代码生成阶段产生的代码为汇编程序,那么还应先经过汇编阶段才能产生机器代码程序。上述各阶段在处理中都要利用若干表格查找、填写信息,还要完成检测和报告源程序中的错误。各个阶段的工作流程如图1所示。“阶段”是对编译程序逻辑功能的划分,具体实现时,受不同源语言、设计要求、使用对象和计算机条件的限制,往往又将编译程序划分为若干“遍”。每一遍处理时,都对前一遍扫描所产生的结果代码从头到尾扫描一遍,以得到新的结果代码。第一遍对源程序进行扫描,最后一遍产生目标代码。“遍”与“阶段”可以相同也可不同,既可以将几个不同阶段合并为一遍,也可以将一个阶段划分为若干遍。例如,词法分析这一阶段既可以单独作为一遍,也可与语法分析合并为一遍。又如,为了有效起见,语法分析和语义分析又常常合为一遍进行。编译程序可以专设优化阶段,也可把它合并到其它阶段(如代码生成)中去。在优化功能特强时,往往还可把优化阶段分为若干遍来实现。由上述可见,编译程序的实习有三种选题途径:1) 按“编译阶段”选题。若实习时数不多,可重点选择语法分析,其次是词法分析和语义分析,它们都是编译不可缺少的阶段,而且词法分析和语法分析还有相当成熟的理论和算法。2) 按“遍”选题。例如将词法分析与语法分析并作一遍实习。3) 将整个编译程序作为实习题。此时宜突出重点,比如可以从实际程序语言中选择一个大小合适的子集作为源语言,将一些非必要的阶段(如优化)略去以降低实现的难度。B.2实验题实验一一、题目使用直接分析法编制C语言子集的词法分析程序二、 目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法.三、 要求根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到);在实习前一定要制出相应的表.实验时间:4-8学时.检查内容及时间:A)完整的实验报告(算法流程必须要有);B)在机器上调试成功的源程序;请同学们使用新的实验报告模式模板完成实验报告 )下面以一个完整的实验报告形式给出实验完成的情况.这个实验报告形式也是同学们完成实验后提交书面作业的形式.实验报告题目:用直接分析方法编制PASCAL语言子集的词法分析程序.一、分析对于单词符号我们将其分成四类:保留字K、标识符I、常数C和界符P,每类单词符号均可使用一张表格表示.在词法分析过程中,保留字K和界符P这两个表格的内容是固定不变的(由语言确定),源程序字符串只能从其中选取,而标识符I、常数C这两表是在分析过程中不断形成的.对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是K、I、C或P中之一,那么就以单词的二元式形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串.各类单词的二元式表述均具有相同的结构与长度,形式如下:(单词种别t,单词自身的值i)t是单词种别,而单词种别共分为K、I、C、P四类且每类对应一张表格.因此,t实际上就是一个指向这四类中某一类对应表格的指针.i则为指向该类表格中一个特定项目的指针.所以整个的词法分析过程就是从源程序中获得一个个的单词符号,将这些符号分别填入四张类表中,并且有一个二元式序列构成一个索引,这个索引为以后的语法分析提供处理上的方便.为了减少实习量,可以适量地选取K,P中的一个子集来进行.如下表:表1保留字K表内部地址12345678910保留字BEGINCONSTDOELSEENDIFPROCEDURETHENVARWHILE表2界符P表内部地址12345678910界符+::(,)VVV组合界符==〉保留字表包括10个有代表性的保留字,界符表包括关系运算符三种(8,9,10),算术运算符(2),分隔符三种(1,4,6),一对圆括号,加上赋值号共10种.这两表的内容表明PASCAL语言的条件语句,赋值语句,WHILE型循环语句,复合语句,过程及变量说明均可作为源程序例子输入给词法分析程序,标识符表I中的每一项包含一个标识符,常数表C中的每一项包含一个整常数,后两表的内容都是在词法分析过程中产生的.如何从源程序中识别出一个个的单词符号呢?图1中的流图清晰地反映出这一过程.图1中,双圆圈的状态表示终态,即能到达终态就代表识别出一个单词符号,而带有*号的终态是指处理时应回退一字符.

图1扫描程序的状态转换图二、算法图1扫描程序的状态转换图词法分析器在扫描过程中,依次从源程序中取出源字符,根据图1的扫描过程状态转换图,当碰到终态时,即双圆圈的状态时就得到一个单词符号,此时可以根据第一个字符判断单词属于K,I,C,P中哪一类,从而确定单词的”单词种别”和"单词自身的值".整个词法分析的算法流程如图2.三、实现选择实习环境为TURBOC2.0语言.实现程序见附录.qT调试的例子应有词法正确的,也应有词法错误的或是超出所选数据结构范围的.实验完成达到实习目的之后,若尚有余力者,可以对所选子集适当扩大或是增加相应功能如:①扩充界符和保留字数目;②允许实型常数;③进行词法错误检查;qT调试的例子应有词法正确的,也应有词法错误的或是超出所选数据结构范围的.实验完成达到实习目的之后,若尚有余力者,可以对所选子集适当扩大或是增加相应功能如:①扩充界符和保留字数目;②允许实型常数;③进行词法错误检查;④最大范围扩充以至PASCAL语言所有字符的集合.实验完成以后编写出完整的实验报告,反映出最后的实验学习结果.图2词法分析算法流图上机前应做好准备.即根据实习目的、要求和分析,选择相应的数据结构,使用C语言参照算法中的流程编写词法分析的程序.将编好的程序上机进行调试.注意图2词法分析算法流图附录/*词法分析器程序分析对象为PASCAL语言源程序文件分析程序主文件:wanalyse.c;保留字文件:token.txt;分析结果存放文件:result.txtWORDANALYSEDEMOFORTURBOC2.0Copyright(c)2006,07Authors:WQJAllrightsreserved."stdio.h""ctype.h""string.h"Fromthecommandline,use:C:\>wanalyseOBJECT.PAS*/"stdio.h""ctype.h""string.h"#defineNULL0#defineTOKENSUM100FILE*fin,*fout,*fp;charch,wordget[10];inti;voidmakeword();/*扫描源程序获得一个单词符号*/voidwordproc();/*对单词符号进行分类处理生成二元式*/voidmakeword(fpoint)/*扫描源程序获得一个单词符号*/FILE*fpoint;{}voidwordproc()/*对单词符号进行分类处理生成二元式*/{}main(argc,argv)/*词法分析主程序*/intargc;char*argv[];{if(argc==l) /*没有被分析文件作为参数1*/{printf("PleaseinputfilenamesofOBJECT\n");exit(0);}if((fin=fopen(argv[1],"r"))==NULL){printf("Cannotopeninfile\n");exit(0);}if((fout=fopen("result.txt","w"))==NULL){printf("Cannotopenoutfile\n");exit(0);}if((fp=fopen("token.txt","r"))==NULL){printf("Cannotopentokenfile\n");exit(0);}while(!feof(fin)){makeword(fin);/*扫描源程序获得一个单词符号*/wordproc(); /*对单词符号进行分类处理生成二元式*/}}分析对象文件OBJECT.PASprogramexe6(input,output);{PASCAL分析对象程序}constmax=1000;typear=array[0..max]ofinteger;varm,n,i,j,s:integer;d:ar;beginreadln(n);form:=1tondobegins:=m*m;j:=0;whiles>0dobeginj:=j+1;d[j]:=smod10;s:=sdiv10end;i:=1;while(d[i]=d[j])and(i<j)dobegini:=i+1;j:=j-1;end;ifi<=j.or.i<>jthenwriteln(m,m*m:10)%$endend.分析结果文件RESULT.TXT(25,-)#PROGRAM#(12,-)#FOR#(100,1)(46,-) #(#(101,EXE6)(101,M)(55,-) #;#(101,M)(46,-) #(#(52,-) #:=#(34,-)#WHILE#(54,-) #,#(68,-)#INPUT#(100,1)(46,-) #(#(101,M)(54,-) #,#(30,-)#TO#(101,D)(38,-) #*#(69,-)#OUTPUT#(101,N)(48,-) #[#(101,M)(47,-) #)#(7,-)#DO#(101,I)(56,-) #:#(55,-) #;#(3,-)#BEGIN#(49,-) #]#(100,10)(5,-)#CONST#(101,S)(40,-) #=#(47,-) #)#(101,MAX)(52,-) #:=#(101,D)(ERROR,%)(40,-) #=#(101,M)(48,-) #[#(ERROR,$)(100,1000)(38,-) #*#(101,J)(10,-)#END#(55,-) #;#(101,M)(49,-) #]#(10,-)#END#(31,-)#TYPE#(55,-) #;#(47,-) #)#(53,-) #.#(101,AR)(101,J)(1,-)#AND#(40,-) #=#(52,-) #:=#(46,-) #(#

(2,-)#ARRAY#(100,0)(101,I)(48,-) #[#(55,-) #;#(42,-) #<#(100,0)(34,-)#WHILE#(101,J)(57,-) #..#(101,S)(47,-) #)#(101,MAX)(43,-) #>#(7,-)#DO#(49,-) #]#(100,0)(3,-)#BEGIN#(21,-)#OF#(7,-)#DO#(101,I)(63,-)#INTEGER#(3,-)#BEGIN#(52,-) #:=#(55,-) #;#(101,J)(101,I)(33,-)#VAR#(52,-) #:=#(36,-) #+#(101,M)(101,J)(100,1)(54,-) #,#(36,-) #+#(55,-) #;#(101,N)(100,1)(101,J)(54,-) #,#(55,-) #;#(52,-) #:=#(101,I)(101,D)(101,J)(54,-) #,#(48,-) #[#(37,-) #-#(101,J)(101,J)(100,1)(54,-) #,#(49,-) #]#(55,-) #;#(101,S)(52,-) #:=#(10,-)#END#(56,-) #:#(101,S)(55,-) #;#(63,-)#INTEGER#(18,-)#MOD#(15,-)#IF#(55,-) #;#(100,10)(101,I)(101,D)(55,-) #;#(44,-) #<

温馨提示

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

评论

0/150

提交评论