编译原理的第一次实验内容及要求.doc
编译原理的第一次实验内容及要求实验一 词法分析器的设计一、实验目的和要求加深对状态转换图的实现及词法分析器的理解。熟悉词法分析器的主要算法及实现过程。要求学生掌握词法分析器的设计过程,并实现词法分析。二、实验基本内容给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,能从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)词法规则如下:单词符号种别码内码单词符号种别码内码auto101long121break102new122case103operator123char104private124class105protected125const106public126continue107register127default108return128delete109short129do110sizeof130double111static131else112struct132enum113switch133extern114template134float115this135for116typedef136friend117union137if118virtual138inline119void139int120while140单词符号种别码内码单词符号种别码内码201,234202235*203·236/204237%205238206(239207)240208:241209242210243211#244212;245!213标识符300&&214常数400二进制形式|215!216217218219|220221&222223224225*226227%228229230&231232|233三、实验时间:上机三次。第一次按照自己的思路设计一个程序。第二、三次在理论课学习后修改程序,使得程序结构更加合理。四、实验过程和指导:(一)准备:1.阅读课本有关章节(c/c+,数据结构),花一周时间明确语言的语法,写出基本算法以及采用的数据结构和要测试的程序例。2.初步编制好程序。3.准备好多组测试数据。(二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。(300,”main”)(239,”(“)(240,”)“)(242,”“(120,”int”)(300,”a”)(234,”,”)(300,”b”)(245,”;”)(300,”a”)(223,”=”)(400,”1010”)(245,”;”)(300,”b”)(223,”=”)(300,”a”)(201,”+”)(400,”10100”)(245,”;”)(243,”“)(三)程序要求:程序输入/输出示例:输入如下一段:main()/* 一个简单的c+程序*/int a,b; /定义变量a = 10; b = a + 20;要求输出如右图。要求:(1) 剔除注解符(2) 常数为无符号整数(可增加实型数,字符型数等)(四)练习该实验的目的和思路:程序开始变得复杂起来,可能是大家以前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。因此要认真把握这个过渡期的练习。程序规模大概为200行及以上。通过练习,掌握对字符进行灵活处理的方法。(五)为了能设计好程序,注意以下事情:1.模块设计:将程序分成合理的多个模块(函数/类),每个模块(类)做具体的同一事情。2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。4程序设计语言不限,建议使用面向对象技术及可视化编程语言,如C+,VC,JAVA,VJ+等。四、上交:1.程序源代码及可执行文件(当堂检查/通过网络提交);2.已经测试通过的测试数据3组(全部存在一个文本文件中,以“第一组输入/输出/第二组输入/输出/第三组输入/输出”的顺序存放);3.实验报告按照提供的模板填写:(1) 功能描述:该程序具有什么功能?(2) 算法描述:所采用的数据结构,基本实现算法及某些特殊过程的实现算法(如在处理某个问题时,你所采取的好的处理方法等)注意此处不要简单的将源程序抄上来。(源程序将打印出来作为附录)(3) 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;另外可以附加函数之间的调用关系图、程序总体执行流程图及类的层次图。(4) 实验总结:你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你对你的程序的评价?你的收获有哪些?(5) 写出上机调试时发现的问题,以及解决的过程;(6) 附上源程序(打印的)五、问题描述及基本算法提示1 状态转换图的实现让每个结点对应一小段程序。 需引进一组全局变量和过程 (1)ch 字符变量,存放最新读进的源程序字符。(2)strToken 字符数组,存放构成单词符号的字符串。 (3)GetChar 子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置。 (4)GetBC 子程序过程,检查ch中字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符。(5)Concat 子程序过程,将ch中的字符连接到strToken之后。例如, 假定strToken 原来的值为“AB”,而ch中存放着C,经调用Concat后,strToken的值就变为”ABC”。(6)IsLetter和IsDigit 布尔函数过程,它们分别判断ch中的字符是否为字母和数字。(7)Reserve 整型函数过程,对strToken中的字符找保留字表,若它是一个保留字,则返回它的编码,否则返回0值。(8)Retract 子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。(9)InsertId 整型函数过程,将strToken中的标识符插入符号表,返回符号表指针。(10)InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针。2词法分析器构造基本算法int code,value;strToken:=“”; 置strToken为空串GetChar();GetBC();if (IsLetter()begin while (IsLetter() or IsDigit() begin Concat();GetChar(); end Retract(); code : = Reserve(); if(code = 0) begin value : = InsertId(strToken); return($ID,value); end else return(code,-);endelse if (IsDigit()begin while(IsDigit() begin Concat();GetChar(); end Retract(); value : = InsertConst(strToken); returnr($INT,value);endelse if (ch = = ) retutn($ASSIGN,-);else if (ch = +) return ($PLUS,-);else if (ch =*)begin GetChar(); If (ch = *) return ($POWER,-); Retract() ; return ($STAR,-);endelse if (ch = ;) return ($SEMICOLON,-);else if (ch = () return ($LPAR,-);else if (ch = ) return ($RPAR,-);else if (ch = ) return ($LBRACE,-);else if (ch = ) rerurn ($RBRACE,);else ProcError(); /错误处理/