您好,欢迎访问三七文档
编译原理实验报告PL/0语言编译器分析词法分析实验递归下降语法分析实验LL(1)分析法语法分析实验教师:姓名:班级:学号:PL/0语言编译器分析实验报告一、实验目的通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码,加深对编译阶段(包括词法分析、语法分析、语义分析、中间代码生成等)和编译系统软件结构的理解,并达到提高学生学习兴趣的目的。二、实验要求(1)要求掌握基本的程序设计技巧(C语言)和阅读较大规模程序源代码的能力;(2)理解并掌握编译过程的逻辑阶段及各逻辑阶段的功能;(3)要求能把握整个系统(PL/0语言编译器)的体系结构,各功能模块的功能,各模块之间的接口;(4)要求能总结出实现编译过程各逻辑阶段功能采用的具体算法与技术。三、实验步骤(1)根据PL/0语言的语法图,理解PL/0语言各级语法单位的结构,掌握PL/0语言合法程序的结构;(2)从总体上分析整个系统的体系结构、各功能模块的功能、各模块之间的调用关系、各模块之间的接口;(3)详细分析各子程序和函数的代码结构、程序流程、采用的主要算法及实现的功能;(4)撰写分析报告,主要内容包括系统结构框图、模块接口、主要算法、各模块程序流程图等。四、报告内容1、PL/0语言语法的BNF表示-1,对语法描述图的解析程序→程序体.程序体→[常量说明部分][变量说明部分][过程说明部分]语句常量说明部分→const常量定义{,常量定义};常量定义→标识符=无符号整数无符号整数→数字{数字}变量说明部分→var标识符{,标识符};标识符→字母{字母|数字}过程说明部分→过程首部程序体{;过程说明部分};过程首部→procedure标识符;语句→赋值语句|条件语句|当型循环语句|过程调用语句|复合语句赋值语句→标识符:=表达式复合语句→begin语句序列end语句序列→语句{;语句}条件→表达式关系运算符表达式|odd表达式表达式→[+|-]项{加法运算符项}项→因子{乘法运算符因子}因子→标识符|无符号整数|'('表达式')'加法运算符→+|-乘法运算符→*|/关系运算符→=|||=||=条件语句→if条件then语句过程调用语句→call标识符当型循环语句→while条件do语句字母→a|b|...|x|y|z数字→0|1|2|...|8|92、PL/0编译程序的总体设计•其编译过程采用一趟扫描方式•以语法、语义分析程序为核心•词法分析程序和代码生成程序都作为一个过程,•当语法分析需要读单词时就调用词法分析程序,•而当语法、语义分析正确,•需要生成相应的目标代码时,则调用代码生成程序。•表格管理程序实现变量,•常量和过程标识符的信息的登录与查找。•出错处理程序,•对词法和语法、语义分析遇到的错误给出在源程序中出错的位置和与错误性质有关的编号,并进行错误恢复。3、PL/0编译程序结构4、编译程序总体流程图词法分析程序语法语义分析程序代码生成程序表格管理程序出错处理程序PL/0源程序目标程序启动置初值调用GETSYM取单词调用BLOCK过程当前单词是否为源程序结束符'.'?出错源程序中是否有错误?调用解释过程INTERPRET解释执行目标程序打印错误结束NYYN4、详细分析4.1主要函数功能4.2语法调用关系图Pl/0词法分析程序Getsym识别的单词:(类别,值)保留字:如:BEGIN、END、IF、THEN等运算符:如:+、-、*、/、:=、#、=、=等标识符:用户定义的变量名、常数名、过程名常数:如:10、25、100等整数界符:如:‘,’、‘.’、‘;’、‘(’、‘)’等Getsym用到三个单元:SYM:存放单词类别ID:存放标识符的值NUM:存放整数的值词法分析过程GETSYM所要完成的任务:滤空格识别保留字识别标识符程序pl0分程序block语句statement条件condition表达式项term因子factor拼数识别单字符单词(,等)拼双字符单词(=,等)输出源程序读字符子程序(getch)PL/0编译程序语法分析的设计与实现自顶向下的语法分析递归子程序法:对于每个非终结符,编写一个子程序,由该子程序负责识别该语法单位是否正确。递归子程序法递归子程序法:对应每个非终结符语法单元,,编一个独立的处理过程(或子程序)。语法分析从读入第一个单词开始,由非终结符程序(即开始符)出发,沿语法描述图箭头所指出的方向进行分析。当遇到非终结符时,则调用相应的处理过程,从语法描述图看,也就进入了一个语法单元,再沿当前所进入的语法单元所指箭头方向继续进行分析。当遇到描述图中是终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,再读取下一个单词继续分析。遇到分支点时,将当前的单词与分支点上多个终结符逐个相比较,若都不匹配时可能是进入下一个非终结符语法单位或是出错。〈表达式〉的递归子程序实现procedureexpr;beginifsymin[plus,minus]thenbegingetsym;term;endelseterm;whilesymin[plus,minus]dobegingetsym;term;endend;〈因子〉∷=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’〈因子〉的递归子程序实现procedurefactor;beginifsymidentthenbeginifsymnumberthenbeginifsym=‘(‘thenbegingetsym;expr;ifsym=‘)’thengetsymelseerrorendelseerrorendelsegetsymendelsegetsymend;说明部分的分析与处理对每个过程(含主程序)说明的对象(变量,常量和过程)造符号表,登录标识符的属性。标识符的属性:种类,所在层次,值和分配的相对位置。登录信息由ENTER过程完成。常量定义语句的处理语法:常量说明部分::=const常量定义{,常量定义};常量定义::=标识符=无符号整数无符号整数::=数字{数字}ifsym=constsymthenbegingetsym;(*获取下一个token,正常应为用作常量名的标识符*)repeat(*反复进行常量声明*)constdeclaration;(*声明以当前token为标识符的常量*)whilesym=commado(*如果遇到了逗号则反复声明下一常量*)begingetsym;(*获取下一个token,这里正好应该是标识符*)constdeclaration(*声明以当前token为标识符的常量*)end;ifsym=semicolonthen(*如果常量声明结束,应遇到分号*)getsym(*获取下一个token,为下一轮循环做好准备*)elseerror(5)(*提示5号错误*)untilsymident(*如果遇到非标识符,则常量声明结束*)end;常量说明处理procedureconstdeclaration;beginifsym=identthenbegingetsym;ifsymin[eql,becomes]then(*如果是等号或赋值号*)ifsym=becomesthen(*如果是赋值号(常量生明中应该是等号)*)error(1);(*提示1号错误*)getsym;(*获取下一个token,等号或赋值号后应接上数字*)ifsym=numberthen(*如果的确是数字*)beginenter(constant);(*把这个常量登陆到符号表*)getsym(*获取下一个token,为后面作准备*)endelseerror(2)(*如果等号后接的不是数字,提示2号错误*)elseerror(3)(*如常量标识符后不是等号或赋值号,提示3号错误*)endelseerror(4)end(*constdeclaration*);变量定义语句的处理语法:变量说明部分::=var标识符{,标识符};ifsym=varsymthenbegingetsym;repeatvardeclaration;(*变量说明处理*)whilesym=commadobegingetsym;vardeclarationend;ifsym=semicolonthengetsymelseerror(5)untilsymident;end;变量说明处理procedureardeclaration;beginifsym=identthenbeginenter(variable);getsymendelseerror(4)end(*vardeclaration*);过程定义语句的处理程序:whilesym=procsymdo(*循环声明各子过程*)begingetsym;(*获取下一个token,此处正常应为作为过程名的标识符*)ifsym=identthen(*如果token确为标识符*)beginenter(procedur);(*把这个过程登录到名字表中*)getsym(*获取下一个token,正常情况应为分号*)endelseerror(4);(*否则提示4号错误*)ifsym=semicolonthen(*如果当前token为分号*)getsym(*获取下一个token,准备进行语法分析的递归调用*)elseerror(5);(*否则提示5号错误*)目标代码结构和代码生成代码生成代码生成是由过程GEN完成。GEN有3个参数,分别代表目标代码的功能码,层差和位移量。PL/0编译程序的语法错误处理在进入某个语法单位时,调用TEST,检查当前符号是否属于该语法单位的开始符号集合。若不属于,则滤去开始符号和后继符号集合外的所有符号。在语法单位分析结束时,调用TEST,检查当前符号是否属于调用该语法单位时应有的后继符号集合。若不属于,则滤去后继符号和开始符号集合外的所有符号。解释执行的流程图interpret三个寄存器赋初值t:=0;b:=1;p:=0;主程序的SL,DL,RA赋初值s[1]:=0;s[2]=0;s[3]=0;i:=code[p];p:=p+1;执行指令iP=0?返回词法分析实验报告一、实验目的1、加深对词法分析理论的理解,培养动手实践的能力。词法分析的功能:扫描源程序字符流,按照源语言的词法规则识别出各类单词版本号,并产生用于语法分析的符号序列,即将字符串源程序转换成符号串源程序.2、巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解。3、掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等)。4、提高利用计算机分析解决综合性实际问题的基本能力。二、实验内容与设计思想内容:编写一个词法分析程序,并进行简单的词法进行分析.设计思想:编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值,并促留在文件中。三、详细设计#includestdio.h#includeconio.h#includestring.h#includestdlib.h#defineBAOLZ1#defineBIAOSF2#defineCHANGS3#defineYUNSF4#defineFENGF5char*baoliuzi[10]={if,int,for,while,do,return,break,continue,main,void};char*yunsuanfu[5]={+,-,*,/,=};char*fengefu[6]={,,;,{,},(,)};//函数声
本文标题:编译原理实验报告
链接地址:https://www.777doc.com/doc-3259313 .html