




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理实验指导编译原理实验指导高丽 淮阴工学院计算机工程系2内容简介编译原理是计算机专业中的一门专业必修课程,在理论上它要求学生掌握有关形式语言和自动机的抽象概念,在技术上要求学生能够熟练地利用各种数据结构进行编程,很具有挑战性。我们希望学生在学习完本课之后,能够对形式语言和其内部结构有一个较深刻的认识。本书包含三个实验:词法分析器,递归下降分析、语义与代码生成。这三个实验构成了编译器的主要组成部分,全部在VC+6.0环境下完成。目 录实验一 词法分析实验1实验二 递归下降分析4实验三 语义及代码生成8实验一 词法分析实验1、实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。2、实验内容对源程序进行词法分析:要求识别出关键字、标识符、数字和符号,并以(单词类别,单词值)二元组的形式显示。如int a;经过词法分析程序后得到的二元组为:intintIDa; 以下为词法分析程序的测试数据main()int a,b;a = 10; b = a + 20;请对以上代码利用词法分析程序分析并得到相应的二元组。3、实验分析在本次实验中是对一个简化的c语言程序进行分析,它的单词符号有: 标识符:字母打头,后接字母数字,识别出的标识符用ID标记。 保留字(它是标识符的子集): if,else,for,while,do,int,write,read,识别出的保留字直接用该保留字标记。 无符号整数:由数字组成,用NUM标记。 分界符:+、-、*、/、(、)、;、,、=、=、!=、=等双字符分界符,直接用双分界符标记。 注释符:用/*.*/括起为了从源程序字符流中正确识别出各类单词符号,相邻的标识符、整数或保留字之间至少要用一个空格分开。此语言的各类单词符号的正则文法规则如下:=|ID|ID=| = a|b|z|A|B|Z=1|2|9|0=+|-|*|/|=|(|)|:|,|;|!=|=|!=|=/*=*/identifiernumbersinglelworddoublewordfirstworderror*/letterdigit+、;、=、!/*非*非=其他letter,digitdigitS图1 单词符号的状态图根据状态图,分析相应动作就可以构造出词法分析程序的算法流程图,如下图所示,在程序开始时,首先读入一个字符,若为空字符,则继续读,直到读进一个非空字符,读进的字符有如下6种情况,要进行不同的处理。(1) 字母。继续读,直到遇见空格、分界符、文件尾或非字母数字字符。组合标记符,查保留字表。若为保留字,输出相应单词记号;若不是,输出标记符的单词记号及单词值(标识符)。(2) 数字。继续读,直到遇见空格、或非数字字符出现或文件尾。输出无符号整数的单词记号及数字串。(3) =、!。读入下一个字符,判断是否为双字符分界符,若是,组成双字符分界符,输出相应单词记号及双分界符;若不是,输出单分界符记号。(4) 非=、/等与双分界符首字符不同的单分界字符。输出相应单词记号及单分界符。(5) /。读入下一个字符。若不是“*”,输出/的单词记号;若是“*”,进行注释处理。词法分析不输出“/*”,并要跳过整个注释内容直到遇到“*/”为止,然后返回开始状态,继续识别下一个单词符号。(6) 非法字符。如果读进的字符不属于上面任意情况,则说明词法分析程序从源程序读入了一个不合法的字符,即该字符不属于程序语言所定义的所有单词符号首字符集合。词法分析程序在遇到不合法字符时要进行错误处理,报告错误信息,跳过这个字符,然后转入开始状态,继续识别下一个单词符号。 图2 词法分析程序流程图4、实验步骤(1)启动Visual C+系统,新建一个工程;(2)新建一个源程序文件;(3)编译,调试该程序;(4)运行该程序,输入测试数据,观察输出数据;(5)分析实验结果。实验二 递归下降分析1、实验目的详细了解递归子程序方法对源程序的具体分析处理2、实验内容类C语言的语法规则如下:1):=2):=|3):=int ID;4):=|5):= |6):= if () else 7):= while () 8):= for(,)9):=write ;10):=read ID;11):=12):=;|;13):= ID=|14):= |(|=|=|=|!=) 15):=(+|-) 16):=(*| /) 17):=()|ID|NUM其中,规则1和规则11中的符号符号、为终结符号,不是元符号,而规则6、7、8中出现的符号(和)也是终结符号,不是元符号。为了便于理解规则中的每个符号含义,下面对应上面的每条规则,给出中文表达形式:1):=2):=|3) :=int ;4):=|5):=|6):= if () else 7):=while() 8):=for(;) 9):=write ;10):=read ;11):=12):=;|;13):=|14):=|(|=|=|=|!=)15):=(+|-)16):=(*|/)17):=()|构造递归下降子程序,然后对测试程序进行分析,如果输入的测试程序没有语法错误,则显示语法分析成功;如果有错误,则该语法分析程序遇到错误时,立即停止分析,并报告错误信息。测试程序如下: int a;int b;int c;read a;b=a;(2+a);if (a3) a=10;b=4; else a=10;b=4;while (a10) a=10;b=4;c=(b+a)*c;write c;for(a=1;a20;a=a+1)c=(b+a)*c;b=8;c=9;3、实验分析 递归下降分析的方法极为简单,其思路是将文法中的每一个非终结符U的文法规则看作是识别U的一个过程定义,为每个非终结符号构造一个子程序,已完成该非终结符号所对应的语法成分的分析和识别任务。如果U的文法规则的右部只有一个候选式,则按从左向右的顺序依次构造规则U的识别过程代码。如果有终结符号,判断能否与数据如的符号相等,如果相等,表示识别成功,读入指针指向下一个输入符号;如果不等,则意味着输入串此时有语法错误。如果是非终结符号,则简单调用这个非终结符号的子程序,由这个子程序完成该非终结符号所对应的语法成分的分析和识别任务。当一条规则右部有多个候选式时,则根据每个候选式的第一个符号确定该候选式分支。只有被调用的分析和识别某语法成分的子程序匹配输入串成功,且正确返回时,该语法成分才算真正获得识别。针对每一条规则,分别来设计其递归下降分析过程,其相应的分析程序流程图如图1至图5所示。对于规则(13)在程序设计时,由于存在冲突,在程序设计时,通过超前读一个符号来解决。方法是:如果识别出标示符的符号ID后,再读入一个符号,如果这个符号是“=”,说明选择的是赋值表达式;如果不是“=”,则说明选择的是布尔表达式。 在语法分析程序的实现中,对应每条规则的分析函数的取名与规则中的符号同名。语法分析程序的名为TESTparse(),在这个函数里,调用对应与规则(1)的分析函数program()开始进行语法分析,其他规则的分析函数会从函数program()中递归调用。图1 图2 图3 图4 图54、实验步骤(1)启动Visual C+系统,新建一个工程;(2)新建一个源程序文件;(3)编译,调试该程序;(4)运行该程序,输入测试数据,观察输出数据;(5)分析实验结果。实验三 语义及代码生成1、实验目的理解并掌握语义分析的基本概念,基本方法;掌握代码优化与目标生成的基本原理与技术实现;编写类C语言编译程序的目标代码生成的程序,调试成功后,以给出的程序段为测试数据,并按一定格式显示结果。2、实验内容和分析与实验二的语法规则相比,只有部分规则需要添加动作符号,下面我们列出添加了动作符号的规则。(1)vartablep,datap -int IDnname-defn,t;动作解释:vartablep指出符号表的最后一个记录的下一个位置,即第一个空白记录位置。每当有一个记录加入符号表,该值加1;datap表示已经分配的地址空间,它开始时为0,每声明一个变量,该值则根据变量类型累加,如整型加2,实型加4等等。name-defn, t的动作:查询符号表,从vartablep所指的前一个位置起往回查直到第一个记录,若没有,将标识符名n及类型1、datap的值填入符号表vartablep所指的位置,然后vartablep加1,datap根据类型t增加;若有,报告错误:变量重复定义。(2):=IDnLOOKndASSIGN =STOd |(3):= |GT |LES |=GE |=LE |=EQ |!=NOTEQ (4):=(+ADD |-SUB) (5):=(*MULT | /DIV) (6):=()| IDnLOOKndLOADd |NUMiLOADIi(2)、(3)、(4)、(5)、(6)规则中的动作符号解释如下:LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义ASSIGN:超前读一个符号,如果是=,则表示进入赋值表达式,如果不是=,则选择,然后还要将超前读的这个符号退回。STOd:输出指令代码STO d, 且codep+(因产生了指令,所以指令记数加1)LOADIi:输出指令代码LOADI i ,且codep+LOADd :输出指令代码LOAD d , 且codep+GT、ADD等:输出后的指令代码GT、ADD等(7):=if ()BRFlabel1 BRlabel2 SETlabellabel1 else SETlabellabel2其中动作符号的含义如下 BRFlabel1 :输出 BRF label1,codep+ BRlabel2:输出 BR label2,codep+ SETlabellabel1:设置标号label1 SETlabellabel2:设置标号label2(8):=while SETlabellabel1() BRFlabel2 BRlabel1 SETlabellabel2动作解释如下:SETlabellabel1:设置标号label1BRFlabel2 :输出 BRF label2,codep+BRlabel1:输出 BR label1,codep+SETlabellabel2:设置标号label2(9):=for (; SETlabellabel1BRFlabel2BRlabel3; SETlabellabel4 BRlabel1) SETlabellabel3 BRlabel4SETlabellabel2 动作解释:SETlabellabel1:设置标号label1BRFlabel2 :输出 BRF label2,codep+BRlabel3:输出 BR label3,codep+SETlabellabel4:设置标号label4BRlabel1:输出 BR label1,codep+SETlabellabel3:设置标号label3BRlabel4:输出 BR label4,codep+SETlabellabel2:设置标号label2 (10):=write OUT;动作解释: OUT:输出 OUT(11):=read IDn LOOKnd INd;动作解释: LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义 IN:输出IN STId:输出指令代码STI d抽象机常用汇编指令如下:LOAD D 将D中的内容加载到操作数栈LOADI 常量 将常量压入操作数栈LOAD (D) 将变量地址D压入操作数栈STO D 将操作数栈栈顶单元内容存入DADD 将次栈顶单元与栈顶单元内容相加,和置于栈顶SUB 将栈顶单元减去次栈顶单元内容,差置于栈顶MULT 将次栈顶单元与栈顶单元内容相乘,积置于栈顶DIV 将栈顶单元除次栈顶单元内容,商置于栈顶(分母为栈) BR lab 无条件转移到lab BRF lab 检查栈顶单元逻辑值,若为假(0)则转移到labEQ 将栈顶两单元做等于比较,并将结果真或假(1或0)置于栈顶NOTEQ 将栈顶两单元做不等于比较,并将结果真或假(1或0)置于栈顶GT 次栈顶大于栈顶操作数,则栈顶置1,否则置0LES 次栈顶小于栈顶操作数,则栈顶置1,否则置0GE 次栈顶大于等于栈顶操作数,则栈顶置1,否则置0LE 次栈顶小于等于栈顶操作数,则栈顶置1,否则置0AND 将栈顶两单元做逻辑与运算,并将结果真或假(1或0)置于栈顶OR 将栈顶两单元做逻辑或运算,并将结果真或假(1或0)置于栈顶NOT 将栈顶的逻辑值取反构造语义和代码生成程序,然后对测试程序进行分析测试程序int a;int b;read a;write a;if (a=10) b=1; else b=2;write b;while (a=6) b=3;wr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学物业必考题目及答案
- 西柏坡观后感300字(15篇)
- 我的暑假生活作文生活作文(7篇)
- 时间和位移课件
- 古诗文鉴赏教学计划:古韵今风
- 海上日出文本深度解读与教学建议:小学高年级语文教学案例
- 海外游子诗词欣赏:羁旅情怀的诗词教学教案
- 我想对您说小学生作文15篇范文
- 纪念馆消防知识培训课件信息
- 2025年汽车维修工职业技能鉴定试卷(汽车维修成本控制)
- 铁路防寒安全培训
- 工业机器人系统操作员(三级)认定理论考试复习题及答案
- 湖北荆州2023年中考语文现代文阅读真题及答案
- 重庆市字水中学2024届九年级上学期期中考试数学试卷(含答案)
- 水闸现场安全检测分析报告
- 车辆定点维修服务保障方案
- 学生营养餐(中央厨房)集中配送项目计划书
- 连云港市新海初中2022-2023七年级新生入学素质测试英语试卷及答案
- 2024版买房定金合同范本
- 小猪佩奇英语版台词
- 开票税点自动计算器
评论
0/150
提交评论