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

加入VIP,免费下载
 

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

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《编译原理》实验指导书Word文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《编译原理》实验指导书Word文档格式.docx

1、表I 语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字母打头的字母数字串整常数7INT数字串11NE12GT13GE:14IS+15PL-16MI*17MU/18DI处理过程:在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。在此为了使词法分析程序结构比较清晰,且尽量避免某些枝节问题的纠缠,假定要编译的语言中,全

2、部关键字都是保留字,程序员不得将它们作为源程序中的标识符;在源程序的输入文本中,关键字、标识符、整常数之间,若未出现关系和算术运算符以及赋值符,则至少须用一个空白字符加以分隔。作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表已事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。采用上述策略后,针对表I中部分单词可以构造一个如图1所示的有限自动机(以状

3、态转换图表示)。在图1中添加了当进行状态转移时,词法分析程序应执行的语义动作。根据图1,可用C语言编写出符合以上几项要求的一个相应的扫描器程序,如程序一所示。图1 识别表I所列语言中的部分单词的DFA及相关的语义过程图1及程序一中所出现的语义变量及语义函数的含义和功能说明如下:函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。字符数组TOKEN:用来依次存放一个单词词文中的各个字符。函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表

4、,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。其中,实参c为相应单词的类别码或其助记符;当所识别的单词为标识符和整数时,实参VAL为TOKEN(即词文分别为字母数字串和数字串),对于其余种类的单词,VAL均为空串。函数OUT的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。程序一 根据图1编写的扫描器# include ctype.hstring.h# define ID 6# defin

5、e INT 7# define LT 8# define LE 9# define EQ 10# define NE 11# define GT 12# define GE 13char TOKEN20;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!*/TOKEN0=ch

6、; ch=fgetc (fp); i=1;while (isalnum (ch)TOKENi=ch; i+;TOKENi= 0fseek(fp,-1,1); /* retract*/c=lookup (TOKEN);if (c=0) out (ID,TOKEN); else out (c, );if(isdigit(ch) ch=fgetc(fp);while(isdigit(ch) i+;ch=fgetc(fp);TOKENi= 0;out(INT,TOKEN);switch(ch)case :if(ch=)out(LE,);else if(ch=) out (NE,fseek (fp,-1

7、,1);out (LT,break;case =: out(EQ, break;case :if(ch=)out(GE,out(GT,default: report_error( );return;提示:扫描器所用的若干函数以及主程序有待于具体编写,并需事先建立好保留字表,以备查询。例如:/* 建立保留字表 */#define MAX_KEY_NUMBER 20 /*关键字的数量*/#define KEY_WORD_END “waiting for your expanding” /*关键字结束标记*/char * KeyWordTableMAX_KEY_NUMBER=“begin”, “en

8、d”, “if”, “then”, “else”, KEY_WORD_END;/* 查保留字表,判断是否为关键字 */int lookup (char *token)int i=0;while (strcmp(KeyWordTablen, KEY_WORD_END) /*strcmp比较两串是否相同,若相同返回0*/if (!strcmp(KeyWordTablen, token) /*比较token所指向的关键字和保留字表中哪个关键字相符*/return n+1; /*设置正确的关键字类别码,并返回此类别码的值*/n+;return 0; /*单词不是关键字,而是标识符*/另外,在扫描源程序

9、字符串时,一旦识别出关键字、标识符、整常数以及运算符中之一,即以二元式形式(类别编码,值)输出单词到指定文件中。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。题目2:将表I单词集中的整常数改为无符号常数,修改题目1中已开发的扫描器。无符号常数的单词分类码助记符:UCON;其值为无符号常数的机内二进制表示。描述无符号数的正规文法和状态转换图:无符号数的右线性文法G如下:无符号数 d余留无符号数无符号数 小数部分无符号数 d余留无符号数 d余留无符号数余留无符号数 十进小数余留无符号数 E指数部分余留无符号数 d十进小数

10、E指数部分十进小数 d十进小数十进小数 d小数部分 d十进小数小数部分 d指数部分 d余留整指数指数部分 +整指数指数部分 -整指数指数部分 d整指数 d余留整指数整指数 d余留整指数 d余留整指数余留整指数 d图2所示为上述文法的状态转换图,其中编号0、1、2、6分别代表非终结符号、十进小数小数部分指数部分整指数及。图2 文法G的状态转换图实现无符号数识别的参考方法:在计算机内实现状态转换图的方法之一,是以状态图中的各个状态为行,以可能输入的各个输入符号为列,组成一个状态矩阵。其中,矩阵的元素用来指明下一个状态和扫描器应完成的语义动作(如拼接字符、数制转换、查填符号表以及输出单词的内部表示等

11、)。由于在一个状态矩阵中,通常有许多状态都是出错状态,为了节省存放状态矩阵的存储空间,在具体实现时,常常采用更为紧凑和有效的数据结构。例如,对于文法G的状态转换图,可按表II的形式来存放其状态矩阵。表II中的第一列为各状态Si的编号,第二列分别列出了在每一状态下可能扫视到的输入符号aj(其中“other”是一个符号集合,用来表示在相应状态所属的那一栏中,除其前所列字符之外的全部其它字符),第三列指出当(Si,aj)出现时应执行的语义动作(通常用若干个语句来实现,若其后空,则表示不进行任何处理),最后一栏用来指明下一状态的编号(若其后NULL或“结束”则表示无后继状态)。状态矩阵中所嵌入的语义动

12、作,其功能是在扫描源程序字符串的过程中,把识别出的字符串形式的无符号数的值,逐步转换为相应的二进制整数(ICON)或二进制浮点数(FCON)的内部形式,方法详见教材第56页。(注:考虑能否采用C语言的库函数实现此语义处理工作。)表II 包含语义处理过程的识别无符号数的状态矩阵根据加入语义过程说明的状态转换图直接编写词法分析程序,部分实现代码如下:程序二 单词分类码为UCON的无符号数的识别程序1 #include 2 #include 3 #include 4 #define LETTER 05 #define DIGIT 16 #define POINT 27 #define OTHER 3

13、8 #define POWER 49 #define PLUS 510 #define MINUS 611 #define UCON 7 /Suppose the class number of unsigned constant is 712 #define ClassOther 20013 #define EndState -114 int w,n,p,e,d;15 int Class; /Used to indicate class of the word16 int ICON;17 float FCON;18 static int CurrentState; /Used to pres

14、ent current state, the initial value:1920 int GetChar (void);21 int EXCUTE (int,int);22 int LEX (void);23 int HandleOtherWord (void)24 return ClassOther;25 26 int HandleError (void)27 printf (Error!n return 0;2829 int GetChar (void)30 31 int c;32 c=getchar ( );33 if(isdigit(c) d=c-0;return DIGIT;34

15、if (c=.) return POINT;35 if (c=E|c=e) return POWER;36 if (c=+) return PLUS;37 if (c=-) return 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;47 case POINT: w=0;n=0;CurrentState=

16、3;48 default: HandleOtherWord( );Class=ClassOther;49 CurrentState=EndState;50 51 break;52 case 1:53 54 case DIGIT: w=w*10+d; /CurrentState=155 case POINT: CurrentState=2;56 case POWER: CurrentState=4;57 default: ICON=w;CurrentState=EndState;58 59 break;60 case 2:61 62 case DIGIT: n+;w=w*10+d;63 case

17、 POWER:64 default: FCON=w*pow(10,e*p-n);65 66 break;67 case 3:68 69 case DIGIT:CurrentState=2;70 default: HandleError( );71 72 break;73 case 4:74 75 case DIGIT: p=p*10+d;CurrentState=6;76 case MINUS: e=-1;CurrentState=5;77 case PLUS: CurrentState=5;78 default: HandleError( );79 80 break;81 case 5:82

18、 83 case DIGIT:84 default:85 86 break;87 case 6:88 89 case: DIGIT:p=p*10+d;90 default:91 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 五、扩展要求有余力的同学,可选

19、作以下内容(上机实验成绩有加分):1、在词法分析过程中建立变量名表和常数表,以备以后的编译过程(如语法分析)查询;扩充关键字的数目、增加单词类别(如逻辑运算符等)、将常数分成字符串常量、整型常量和实型常量等;添加词法分析中单词出错的位置、加细错误类型的检查,以及删除注释部分等。2、识别一个程序设计语言(如C语言或其大小适宜的一个子集)所有单词的词法分析程序设计。建议利用LEX系统。六、注意1、上机前的准备:完成词法分析程序的程序流图,并选择好相应的数据结构。2、编程:用C语言或你熟悉的其它高级程序设计语言编写一个规模适当的扫描器。3、调试:将各个模块连接成一个完整程序,并整体调试成功。4、测试

20、:用于测试扫描器的实例源文件中应有词法正确的,也应有错误的字符串,并至少应包含两行以上的源代码。5、输出结果:对于输入的测试用例的源程序文件,以对照的形式将扫描器的分析结果在输出文件中表示出来,必要时给出正误信息。实验二 语法分析程序实现通过设计、编制、调试一个典型的语法分析程序(任选有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,作为编制语法分析程序的依据),对扫描器所提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。选择对各种常见高级程序设计语言都较为通用的语法结构作为分析对象,给出其文法描述(注意应与所采用的语法分析方法比

21、较贴近),设计并实现一个完整的语法分析程序。源程序以文件的形式输入。对于所输入的源程序,如果输入符号串是给定文法定义的合法句子,则输出“RIGHT”,并且给出每一步归约的过程;如果不是句子,即输入串有错误,则输出“ERROR”,并且显示已经归约出的各个文法符号,以及必要的出错说明信息。三、基本实验题目以如下文法G1所定义的算术表达式的赋值语句作为分析对象,编写并调试一个语法分析程序。G1: begin |变量=项 | +-*/ | ( 数字整数浮点数 A|B|C|X|Y|Z|a|b|c|x|y|z 0|1|2|9说明:1)可将以上文法G1中的语法范畴替换为实验一中的文法G,并将单词类型无符号常数进一步细分成整数和浮点数两类单词。2)注意修改实验一中的词法分析程序,并将它编写为子程序的形式,以便供语法分析程序调用,从而在对源程序的一遍扫描过程中,同时完成词法和语法分析任务。3)要求加强错误检查,对输入符号串中有词法、语法错误的语句,给出必要的错误说明信息,尽可能多地、确切地指出错误的位置、原因和性质。例如,在词法分析阶段,对当前正在处理的字符ch,可进一步定义一些与该字符相关的信息row和col

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1