ImageVerifierCode 换一换
格式:DOC , 页数:38 ,大小:1,014.50KB ,
资源ID:11306776      下载积分:12 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/11306776.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(城市学院编译原理实验指导书.doc)为本站上传会员【精***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

城市学院编译原理实验指导书.doc

1、 城市学院编译原理实验指导书 38 2020年4月19日 文档仅供参考 《编译原理》实验指导书 适用实验课时:30 适用对象:城市学院计算机系 实验目的和内容 编译原理实验的目的是使学生将编译理论运用到实际当中,实现一个简单语言集的词法分析程序、语法分析程序和简单语义处理程序,验证实际编译系统的实现方法,并加深对编译理论的认识。 基本实验分为三个部分,实验一识别无符号数的词法分析器设计实现、实验二无符号数的算术四则运算LR语法分析器设计实现,实验三是无符号数的算术四则

2、运算语义处理程序实现,总的实验学时为30课时。要求每个学生独立完成所有实验要求。 每部分基本实验还包括若干扩展实验,供编程能力较强的学生自愿进行。 实验一 词法分析程序实现 一、实验目的与要求 经过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表示式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数

3、的值暂不要求计算)。 三、实现方法与环境 1、首先设计识别各类单词的状态转换图。 描述无符号常数的确定、最小化状态转换图如图1所示。其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 图1 文法G[<无符号数>]的状态转换图 其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别

4、结束状态。 在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。 四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢线至一个新的终态即可。根据自己的习惯,也能够将其转换为状态矩阵形式。 2、词法分析程序编写 根据描述语言中各类单词的文法状态转换图或状态矩阵,利用某种语言(C语言或JAVA语言)直接编写词法分析程序。 3、词法分析程序测试 用于测试扫描器的实例源文件中应有词法正确的,也应有错误的字符

5、串,对于输入的测试用例的源程序文件,以对照的形式将扫描器的分析结果信息在输出文件中表示出来。 四、参考资料 实现无符号数识别的参考方法:将设计的状态转换图直接转化为一张程序流程图,并在外层再增加一个以EOF为循环终止条件的while循环,即形成能连续识别各类单词的词法分析程序。 各类单词的编码建议如表1。 表1 单词的内部编码 单词符号 类别码(CLASS) 单词值(VALUE) 无符号数 1 数字值 + 2 无值 - 3 无值 * 4 无值 / 5 无值 ( 6 无值 ) 7 无值 五、扩展实验 1、试对基础实验识别的单词种类

6、进行扩充,构造识别以下单词的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 表2 扩展单词分类码表 单词符号 类别编码 类别码的助记符 单词值 begin 1 BEGIN end 2 END if 3 IF then 4 THEN else 5 ELSE 标识符 6 ID 字母打头的字母数字串 整常数 7 INT 数字串 < 8 LT <= 9 LE =

7、10 EQ <> 11 NE > 12 GT >= 13 GE := 14 IS + 15 PL - 16 MI * 17 MU / 18 DI 处理过程:在此为了使词法分析程序结构比较清晰,且尽量避免某些枝节问题的纠缠,假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;在源程序的输入文本中,关键字、标识符、整常数之间,若未出现关系和算术运算符以及赋值符,则至少须用一个空白字符加以分隔。作了这些限制以后,就能够把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视

8、到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表已事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。采用上述策略后,针对表2中部分单词能够构造一个如图2所示的有限自动机(以状态转换图表示)。在图2中添加了当进行状态转移时,词法分析程序应执行的语义动作。根据图2,可用C语言编写出符合以上几项要求的一个相应的扫描器程序,如程序一所示。 图2 识别表I所列语言中的部分单词的DFA及相关函数 图2所出现的变量及函数的含义和功能说明如下:

9、 函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。 字符数组TOKEN:用来依次存放一个单词词文中的各个字符。 函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。 函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。 函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。 函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。其中,实参c为相应单词的类别

10、码或其助记符;当所识别的单词为标识符和整数时,实参VAL为TOKEN(即词文分别为字母数字串和数字串),对于其余种类的单词,VAL均为空串。函数OUT的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。 参考程序: # include # include # include # define ID 6 # define INT 7 # define LT 8 # define LE 9 # define EQ 10 # define NE 11 # define GT 12 # def

11、ine GE 13 char TOKEN[20]; extern int lookup (char*); extern void out (int, char*); extern report_error (void); void scanner_example (FILE *fp) { char ch; int i, c; ch=fgetc (fp); if (isalpha (ch)) /*it must be a identifer!*/ { TOKEN[0]=ch; ch=fgetc (fp); i=1; while (isalnum (ch)) { TO

12、KEN[i]=ch; i++; ch=fgetc (fp); } TOKEN[i]= ′\0′ fseek(fp,-1,1); /* retract*/ c=lookup (TOKEN); if (c==0) out (ID,TOKEN); else out (c," "); } else if(isdigit(ch)) { TOKEN[0]=ch; ch=fgetc(fp); i=1; while(isdigit(ch)) { TOKEN[i]=ch; i++; ch=fgetc(fp); } TOKEN[i]= ′\0′; fseek(fp,-1,1)

13、 out(INT,TOKEN); } else switch(ch) { case ′<′: ch=fgetc(fp); if(ch==′=′)out(LE," "); else if(ch==′>′) out (NE," "); else { fseek (fp,-1,1); out (LT," "); } break; case ′=′: out(EQ, " "); break; case ′>′: ch=fgetc(fp); if(ch==′=′)out(GE," "); else { fseek(fp,-1,1); out(GT," ");

14、 } break; default: report_error( ); break; } return; } 提示:扫描器所用的若干函数以及主程序有待于具体编写,并需事先建立好保留字表,以备查询。例如: /* 建立保留字表 */ #define MAX_KEY_NUMBER 20 /*关键字的数量*/ #define KEY_WORD_END “waiting for your expanding” /*关键字结束标记*/ char *KeyWordTable[MAX_KEY_NUMBER]={“begin”, “end”, “if”, “then”, “else”,

15、KEY_WORD_END}; /* 查保留字表,判断是否为关键字 */ int lookup (char *token) { int i=0; while (strcmp(KeyWordTable[n], KEY_WORD_END)) /*strcmp比较两串是否相同,若相同返回0*/ { if (!strcmp(KeyWordTable[n], token)) /*比较token所指向的关键字和保留字表中哪个关键字相符*/ { return n+1; /*设置正确的关键字类别码,并返回此类别码的值*/ break; } n++; } return 0; /*单词不

16、是关键字,而是标识符*/ } 另外,在扫描源程序字符串时,一旦识别出关键字、标识符、整常数以及运算符中之一,即以二元式形式(类别编码,值)输出单词到指定文件中。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。 2、在词法分析过程中建立变量名表和常数表,以备以后的编译过程(如语法分析)查询;扩充关键字的数目、增加单词类别(如逻辑运算符等)、将常数分成字符串常量、整型常量和实型常量等;添加词法分析中单词出错的位置、错误类型检查,以及删除注释部分等。 实验二 语法分析程序实现 一、实验目的与要求 经过设计、编制、

17、调试典型的SLR(1)语法分析程序,实现对实验一所得词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常见的语法分析方法。 二、实验内容 选择对各种常见高级程序设计语言都较为通用的语法结构无符号数的算术四则运算作为分析对象,给出其文法描述(注意应与所采用的语法分析方法比较贴近),设计并实现一个完整的语法分析程序。 输入:由实验一输出的单词类别串,如1,3,1。 输出:对于所输入的源程序,如果输入符号串是给定文法定义的合法句子,则输出“RIGHT”,而且给出每一步归约的过程;如果不是句子,即输入串有错误,则输出“ERROR”,而且显示已经归约出的各个文法符号,以及必要的出错说

18、明信息。 三、实现方法与环境 1、 首先根据算术四则运算的语法定义,构造SLR(1)分析表。 无符号数的算术四则运算的语法可表示为: E->E+T| E-T|T T->T*F| T/F|F F->(E)|i 2、语法分析程序编写 设置输入缓冲区、状态栈、符号栈,并根据SLR(1)分析表利用某种语言(C语言或JAVA语言)直接编写移进、归约、接受子程序,编写语法分析程序。 3、语法分析程序测试 用于测试的实例源文件中应有语法正确的,也应有语法错误的符号串,以对照的形式将分析结果信息在输出文件中表示出来。 四、扩展实验 1、对以下复合语句进行语法分析器的设计与实现。

19、G[<复合语句>]: <复合语句> → begin<语句表>end <语句表> → <语句>|<语句>;<语句表> <语句> → <赋值语句> <赋值语句> → <变量>:=<算术表示式> <算术表示式> → <项> | <算术表示式>+<项> | <算术表示式>-<项> <项> → <因式> | <项>*<因式> | <项>/<因式> <因式> → <变量> | <常数> | (<算术表示式>) <变量> → <标识符> <标识符> → <标识符> <字母> | <标识符> <数字> | <字母> <常数> → <整数> | <浮点数> <整数> → <数字> | <数

20、字> <整数> <浮点数> → • <整数> | <整数> • <整数> <字母> → A|B|C|…|X|Y|Z|a|b|c|…|x|y|z <数字> → 0|1|2|…|9 2、增强语法检查功能,对出错位置、错误类型给予提示。 实验三 语义分析程序实现 一、实验目的与要求 经过设计、编制、调试一个简单的语义处理分析程序,实现对实验一和实验二所得单词和语句的语义信息简单处里,进一步掌握语义处理的内容和简单方法。 二、实验内容 对实验一进行扩展,对识别的无符号数进行计值,并将输出形式改为(类别码,值)的二元式形式。 对实验二进行扩展,在语法分析的基础上,增加语义操作来

21、实现语法制导翻译。对于给定文法中的每一产生式,编写相应的语义子程序。在语法分析过程中,每当用一产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,计算并输出算术表示式的值。 将实验一与实验二的程序合并,以能对完整的输入源文件进行词法分析生成中间文件,然后进行语法制导翻译,输出最终翻译结果。 输入:由无符号数和+,—,*,/, ( , ) 构成的算术表示式。 输出:如果输入单词串是合法的无符号数的算术四则运算,输出运算结果,而且给出每一步的分析过程;如果不是无符号数的算术四则运算,输出“非法四则运算表示式”。 三、基本实验题目 对实验一中每个无符

22、号数识别状态插入计值处理,最终获得无符号数的取值。 对实验二进行扩展,在归约(分析表中的归约动作已经反应了运算优先级)处理子程序中加入计值处理,接受子程序中加入输出算数表示式值的处理。 四、参考资料 与无符号数状态转换图对应的包含语义处理过程(据此可计算求得无符号数的数字值)的状态矩阵和参考程序如下所示。 表3包含语义处理过程的识别无符号数的状态矩阵 根据加入语义过程说明的状态转换图直接编写词法分析程序,部分实现代码如下: 1 #include 2 #include 3 #include 4 #de

23、fine LETTER 0 5 #define DIGIT 1 6 #define POINT 2 7 #define OTHER 3 8 #define POWER 4 9 #define PLUS 5 10 #define MINUS 6 11 #define UCON 7 //Suppose the class number of unsigned constant is 7 12 #define ClassOther 200 13 #define EndState -1 14 int w,n,p,e,d; 15 int Class

24、 //Used to indicate class of the word 16 int ICON; 17 float FCON; 18 static int CurrentState; //Used to present current state, the initial value:0 19 20 int GetChar (void); 21 int EXCUTE (int,int); 22 int LEX (void); 23 int HandleOtherWord (void) 24 {return ClassOther; 25 } 26

25、 int HandleError (void) 27 {printf ("Error!\n"); return 0;} 28 29 int GetChar (void) 30 { 31 int c; 32 c=getchar ( ); 33 if(isdigit(c)) {d=c-′0′;return DIGIT;} 34 if (c==′.′) return POINT; 35 if (c==′E′||c==′e′) return POWER; 36 if (c==′+′) return PLUS; 37 if (c==′-′) re

26、turn MINUS; 38 return OTHER; 39 } 40 int EXCUTE (int state, int symbol) 41 { 42 switch (state) 43 { 44 case 0:switch (symbol) 45 { 46 case DIGIT: n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON;break; 47 case POINT: w=0;n=0;p=0;e=1;CurrentState=3;Class=UCON;

27、break; 48 default: HandleOtherWord( );Class=ClassOther; 49 CurrentState=EndState; 50 } 51 break; 52 case 1:switch (symbol) 53 { 54 case DIGIT: w=w*10+d;break; //CurrentState=1 55 case POINT: CurrentState=2;break; 56

28、 case POWER: CurrentState=4;break; 57 default: ICON=w;CurrentState=EndState; 58 } 59 break; 60 case 2:switch (symbol) 61 { 62 case DIGIT: n++;w=w*10+d;break; 63 case POWER: CurrentState=4;break; 64 default: FCON=w*pow(10,e*p-n

29、);CurrentState=EndState; 65 } 66 break; 67 case 3:switch (symbol) 68 { 69 case DIGIT: n++;w=w*10+d;CurrentState=2;break; 70 default: HandleError( );CurrentState=EndState; 71 } 72 break; 73 case 4:switch (symbol) 74 {

30、75 case DIGIT: p=p*10+d;CurrentState=6;break; 76 case MINUS: e=-1;CurrentState=5;break; 77 case PLUS: CurrentState=5;break; 78 default: HandleError( );CurrentState=EndState; 79 } 80 break; 81 case 5:switch (symbol) 82 { 83

31、 case DIGIT: p=p*10+d;CurrentState=6;break; 84 default: HandleError( );CurrentState=EndState; 85 } 86 break; 87 case 6:switch (symbol) 88 { 89 case: DIGIT:p=p*10+d;break; 90 default: FCON=w*pow(10,e*p-n);CurrentState=EndState; 91

32、 } 92 break; 93 } 94 return CurrentState; 95 } 96 int LEX (void) 97 { 98 int ch; 99 CurrentState=0; 100 while (CurrentState!=EndState) 101 { 102 ch=GetChar( ); 103 EXCUTE (CurrentState,ch); 104 } 105 return Class; 106 } 五、扩展实验 对以下复合语句进行语法制导翻译程序的设计与实现。 G[

33、<复合语句>]: <复合语句> → begin<语句表>end <语句表> → <语句>|<语句>;<语句表> <语句> → <赋值语句> <赋值语句> → <变量>:=<算术表示式> <算术表示式> → <项> | <算术表示式>+<项> | <算术表示式>-<项> <项> → <因式> | <项>*<因式> | <项>/<因式> <因式> → <变量> | <常数> | (<算术表示式>) <变量> → <标识符> <标识符> → <标识符> <字母> | <标识符> <数字> | <字母> <常数> → <整数> | <浮点数> <整数> → <数字> | <数字>

34、 <整数> <浮点数> → • <整数> | <整数> • <整数> <字母> → A|B|C|…|X|Y|Z|a|b|c|…|x|y|z <数字> → 0|1|2|…|9 实验报告要求 要求每人针对每个实验上交一份实验报告,不接受不完整的实验报告,或者说明与程序或结果不符合的实验报告。 实验报告主要包括三方面内容: 1、实验设计:实验采用的文法,状态转换图或状态矩阵,SLR(1)分析表。程序流程设计和每部分的主要功能说明等。 2、程序代码:实验实现的源程序,要求符合一般的程序书写风格,并包括必要的注释。 3、实验结果及分析:程序运行结果(实验一至少包括一个正确单词或表示式的识别结果和一个错误单词或表示式的识别结果;实验二至少包括一个语法正确的表示式识别结果和一个语法错误表示式的识别结果)、结果分析,改进设想等。 其中2和3的运行结果部分能够是打印稿,1、3部分必须手写。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服