《编译原理上机实验指导》__精品.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《编译原理上机实验指导》__精品

《编译原理上机实验指导》 实验一 词法分析 1 实验目的 设计编制并调试一个词法分析程序,加深对构造词法分析器的原理和技术理解与应用。 2 实验要求 选择一种计算机高级程序语言子语言,运用恰当的词法分析技术线路,设计和实现其子语言的词法分析器。语言选择,建议为《计算机程序设计》课程所采用的语言。技术线路建议如下两种之一:正则式→NFA→DFA→min DFA→程序设计和正则文法→NFA→DFA→min DFA→程序设计。分析器输出结果存入到磁盘文件中。具有出错处理功能。 选择子语言方法举例。以教材选取的PASCAL语言为例,确定其子语言涉及的单词类如下: (1)关键字 begin end if then while do (2)运算符和界符 := + - * / = = = ; ( ) : # (3)标识符 正则式:ID=letter(letter|digit)* (4)整型常数 正则式:NUM= digit(digit)* 3 算法设计 (1)单词种别码设计 单 词 种 别 码 对 照 表 单词符号 种别码 单词符号 种别码 begin 1 : 17 If 2 := 18 then 3 20 while 4 21 do 5 = 22 end 6 23 标识符 10 = 24 整型常数 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0 (2)输出形式设计 词法分析器的输入是源程序字符串,输出是对应的单词串。每个单词按照二元组(种别码,单词符号本身)格式输出。 例如:假设源程序为 begin x:=9; if x0 then x:=2*x+1/3;end #,则词法分析器对应输出的结果是: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)(10,x)(23,)(11,0)(3,then)(10,x)(18,:=)(11,2)(15,*) (10,x)(13, +)(11,1)(16,/)(11,3)(26,;)(6,end)(0,#) (3)算法思想 依据建立的识别单词的DFA,设计算法,其框架如下。其中,①syn存放单词的种别码; ②token存放符合标识符规则的单词; ③sum存放整型常量的单词。 实现技术细节注意的几个要点:A)标识符和关键字,属于同一构词规则,识别方法是建立一个关键字表,在识别出标识符单词时,查关键字表,以确认或区别是否是关键字,还是标识符。B)对前导空格符、制表符和换行,均须过滤。详细处理技术请参见陈火旺等编写《程序设计语言编译原理》(第三版);C)约定标识符单词8位有效。 4 程序框架 #includestdio.h #includestring.h void scanner(void); char prog[8],token[8],ch; int syn,p,m,sum; char *rwtab[6]={“begin”, “if”, “then”, “while”, “do”, “end”}; void main(void){ p=0; printf(“\n please input string:\n”); do{ scanner(); switch(syn){ case 11: 输出“整型数的二元组”;break; case –1: 输出“错误”;break; default: 输出“其它单词的二元组”; } } while(syn); } void scanner(void){ for(m=0,n=0;n8;n++) token[n]=NULL; ch=读取下一个字符; while(ch==’ ’) ch=读取下一个字符; if(ch是字符){ while(ch是字符或数字符号){ ch拼到token; ch=读取下一个字符; } token[m++]=’\0’;回退一个输入字符;syn=10; for(n=0;n6;n++) if(strcmp(token,rwtab[n])==0){syn=n;break;} }else if(ch是字符){ while(ch是数字符号){ sum=sum*10+ch;’0’; ch=读取下一个字符; } 回退一个输入字符;syn=11; }else switch(ch){ case ‘’: m=0;token[m++]=ch; ch=读取下一个字符; if(ch==’’){ syn=21; token[m++]=ch; }else if(ch==’=’){

文档评论(0)

seunk + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档