《编译原理课程设计报告》(共13页).doc

上传人:飞****2 文档编号:14017776 上传时间:2022-05-02 格式:DOC 页数:12 大小:77.50KB
返回 下载 相关 举报
《编译原理课程设计报告》(共13页).doc_第1页
第1页 / 共12页
《编译原理课程设计报告》(共13页).doc_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《《编译原理课程设计报告》(共13页).doc》由会员分享,可在线阅读,更多相关《《编译原理课程设计报告》(共13页).doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上目 录一、课程设计的目的2二、课程设计的要求2三、课程设计报告内容2四、实验运行环境2五、实验设计步骤2六、变化后的正规文法2七、状态图3八、基本测试数据4九词法分析程序的数据结构与算法 4十、实验结果截图12十一、设计结果及体会12十二、参考文献12一、课程设计的目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。二、课程设计要求1根据以下的正规式,编制正规文法,画出状态图;标识符 (|)*十进制数 (0 | 1|2|3|4|5|6|7|8|9)(0|1|2

2、|3|4|5|6|7|8|9)*(|.)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*八进制数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* (|.)(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* (|.)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符 + -

3、 * / = ( ) ;关键字 if then else while do 2根据状态图,设计词法分析函数int scan( ),完成以下功能:1)从键盘读入数据,分析出一个单词。2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。3编写测试程序,反复调用函数scan( ),输出单词种别和属性。三、 课程设计报告内容编制一个能够分析三种数、标识符、主要运算符和主要关键字的词法分析程序。四、 实验运行环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、 实验设计步骤1.根据状态图,设计词法分

4、析算法2.采用C语言,设计函数scan( ),实现该算法3.编制测试程序(主函数main)。4.调试程序:输入一组单词,检查输出结果。六、变化后的正规文法:-(|)*- 0 - 0x -+| - |* |/ | |= |( | ) |;-if| then| else |while |do-a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z-(0|1|2|3|4|5|6|7|8|9)|- (|.)-(0|1|2|3|4|5|6|7)|- (0|1

5、|2|3|4|5|6|7|8|9|a|b|c|d|e|f) |七、状态图图-1-013810155713469111416121718192 空白 0-9/a-z/A-ZA-Z/a-z其它 0-91-9 其它 0-9 非数字 0-7 0 0-7 非0-7且 0 0-7 x/X 非0-7 1-9/A-F/a-f 非(1-9/A-F/a-f) +1-110 0-9/A-F/a-f If/ while/ 非(1-9/A-F/a-f) then/ else/do八、 基本测试数据输入数据例: 0 58+data 0x2f 00 then; 正确结果:这些单词的单词种别及其属性 INT10 0 INT1

6、0 58 + _IDN data _INT16 47 INT8 0 Then -; -九、词法分析程序的数据结构与算法词法分析的算法思想主要是根据状态图来实现,由前面的状态图来进行结构的设计,具体细节请参见“图1”的图示。主要的数据结构如下所示:union chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储char kind7; /类型即种别int id; /所属的具体类型即种别号union chars pro; /属性值;种别与种别号的对应关系如下表所示:种 别

7、 种 别 号INT10 1INT8 2INT16 3标识符 4分隔符 5关键字 6出 错 7REAL10 8REAL8 9REAL16 10完整代码如下:#include#includeunion chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值char kind7;int id;union chars pro;int scan(char *a); /对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类voi

8、d Prints(char a15,int id,int a_long);/将分析后的每个token输出void save(char *a,int id,int x);/将分析后的结果保存到一个结构数组中char nowChar15; /临时的存储单元,用来存储被空格打断以后单元char kinds118= ,INT10,INT8,INT16,IDN, , , ,REAL10,REAL8,REAL16;/单词的不同种别struct data link100; /用来存放词法分析以后的结果的结构数组int link_long=0; /全局变量int scan(char *a)int id;int

9、 a_long=0;int doc=0;while(*a!=NULL)nowChar0=0;a_long=0;doc=0;/对数值的判断及处理if(0=*a&*a=9) /如果第一个字符为数值nowChara_long=*a;*a+;a_long+;/对十六进制的判断及处理if(nowChar0=0&(*a=x|*a=X) /如果第一个字符为0且第二个字符为x,则为十六进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=9)|(a=*a&*a=f)|(A=*a&*a=F)|*a=.)nowChara_long=*a; /一直将此十六进

10、制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0; /判断输入的十六进制数是否合法if(a_long=2) /输入的只有0x,则输入错误Prints(nowChar,7,a_long);return 0;if(doc) /输入的十六进制数是浮点型的Prints(nowChar,10,a_long); /则将其具体的类型属性定为10else /输入的十六进制数是整型的Prints(nowChar,3,a_long); /则将其具体的类型属性定义为3continue;/对八进制的判断及处理if(nowChar0=0&0=*a&

11、*a=7) /如果第一个字符为0且第二个字符为07,则为八进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=7)|*a=.)nowChara_long=*a; /一直将此八进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0;if(doc) /输入的八进制数是浮点型的Prints(nowChar,9,a_long); /则将其具体的类型属性定为9else /输入的十六进制数是整型的Prints(nowChar,2,a_long); /则将其具体的类型属性定义为2c

12、ontinue;/对十进制数的判断及处理elsewhile(*a!=NULL&(0=*a&*a=9)|*a=.)nowChara_long=*a; /一直将此十进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0;if(doc) /输入的十进制数是浮点型的Prints(nowChar,8,a_long); /则将其具体的类型属性定为8else /输入的十进制数是整型的Prints(nowChar,1,a_long); /则将其具体的类型属性定义为1continue; /完成了对数值的判断及处理/对字符的判断及处理elseno

13、wChara_long=*a;*a+;a_long+;/判断输入的字符是否为运算符或其他的分隔符switch(nowChar0)case+:case-:case*:case/:case:case(:case):case=:case;:nowChara_long=0;Prints(nowChar,5,a_long); /将其具体的类型属性定义为5continue;default:break;/判断输入的第一个字符是否为字母if(a=nowChar0&nowChar0=z)|(A=nowChar0&nowChar0=Z)while(*a!=NULL&(a=*a&*a=z)|(A=*a&*a=Z)|

14、(0=*a&*a=9)|(*a=.)|(*a=_) /一直将此字符串完全读入nowChara_long=*a;*a+;a_long+;nowChara_long=0;/判断输入的字符串是否为特殊的标识符,若是,则将其具体类型值定义为6/判断输入的字符串是否为特殊的字符串ifif(a_long=2&strcmp(nowChar,if)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串thenif(a_long=4&strcmp(nowChar,then)=0)Prints(nowChar,6,a_long);continue;/判断输入

15、的字符串是否为特殊的字符串elseif(a_long=4&strcmp(nowChar,else)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串whileif(a_long=5&strcmp(nowChar,while)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串doif(a_long=2&strcmp(nowChar,do)=0)Prints(nowChar,6,a_long);continue;/若输入的字符串不符合以上几种情况,则输入的为变量/若输入的字符串为

16、变量,则将其具体属性值定义为4Prints(nowChar,4,a_long);continue;/如果输入的既不是数值也不是字符串,则输入错误,将其具体类型之定义为7elsePrints(nowChar,7,a_long);return 0;return 1;main()char buf100; /用来存储从键盘上输入一串字符 char *tokenPtr; /用来存储用空格打断后的单元int id=1; /用来存储具体的类型号link_long=0;while(id)link_long=0;gets(buf); /从键盘上输入一串字符tokenPtr=strtok(buf, ); /用空格

17、将字符串打断while(id&*tokenPtr!=NULL) /分割出来的单元不为空 id=scan(tokenPtr); /将此单元进行继续分析,并返回其具体的类型值 tokenPtr=strtok(NULL, ); /将字符串继续用空格进行分割printf(nn);getchar();return 0;/将所分解后的单元存入结构数组中void save(char *a,int id,int x,float y)int i;if(link_long=5)if(id=8)/id=8,9,10/若为浮点型的数值,则将浮点型的y值(转换后的)存入其属性当中且存入单词的种别for(i=0;i9&k

18、indsidi!=0;i+)linklink_long.kindi=kindsidi;linklink_long.pro.real=y;/id=5,6,7else/若为标识符,则将单词种别定为自身,属性值定为空for(i=0;i15&ai!=0;i+)linklink_long.kindi=ai;linklink_long.pro.pro_char0=-;linklink_long.pro.pro_char1=0;link_long+;/id=1,2,3,4elsefor(i=0;i8&kindsidi!=0;i+)linklink_long.kindi=kindsidi; /若分解后的tok

19、en为变量或者整型数值,则将其单词种别直接输出if(id=4) /若token为变量,则将其属性值设为自身for(i=0;i15&ai!=0;i+)linklink_long.pro.pro_chari=ai;linklink_long.pro.pro_chari=0;else /若token为整型数值,则将其相应的十进制数值赋给其属性值linklink_long.pro.pro_number=x;link_long+; /继续存入下一个tokenelseprintf(Full 100n); /结构数组已经存满return;/将词法分析器分解后的结果输出出来void Prints(char a

20、15,int id,int a_long)int i;int x=0;float y=0;/int float1;/char *c;if(id=1) /若为十进制整数for(i=1;ia_long&ai!=0;i+)x=x*10+(ai-48);printf(INT10t%sn,a);save(a,id,x,y); /存入结构数组return;if(id=2) /若为八进制整数for(i=1;ia_long&ai!=0;i+)x=x*8+(ai-48); /换算为十进制数printf(INT8t%dn,x);save(a,id,x,y); /存入结构数组return;if(id=3) /若为十

21、六进制整数for(i=2;ia_long&ai!=0;i+)if(0=ai&ai9)x=x*16+(ai-48); /换算为十进制数elseif(a=ai&ai=f)x=x*16+(ai-87);elsex=x*16+(ai-55);printf(INT16t%dn,x);save(a,id,x,y); /存入结构数组return;if(id=4) /若为变量printf(IDNt%sn,a);save(a,id,x,y); /存入结构数组return;if(id=5|id=6) /若为标识符(+,-,*,/,+以及if,else,while,then,do)printf(%st-n,a);s

22、ave(a,id,x,y); /存入结构数组return;if(id=8) /若为十进制浮点型for(i=0;i=0&ai!=.;i-)y=(y+(ai-48)/10;y=y+x; /整数部分与小数部分换算后相加printf(REAL10t%fn,y);save(a,id,x,y); /存入结构数组return;if(id=9) /若为八进制浮点型for(i=1;i=0&ai!=.;i-)y=(y+(ai-48)/8;y=y+x; /整数部分与小数部分换算后相加printf(REAL8t%fn,y);save(a,id,x,y); /存入结构数组return;if(id=10) /若为十六进制

23、浮点型for(i=2;i=0&ai!=.;i-)y=(y+(ai-48)/16;y=y+x; /整数部分与小数部分换算后相加printf(REAL16t%fn,y); /存入结构数组save(a,id,x,y);return;printf(Wrong Enter); /所得的具体类型值为7,则输入有错误return ;十、实验结果截图图-2-十一、设计结果及体会通过这次编译原理课程设计,我们发现学习时应注意理论联系实际,都做练习,多多实践,同时学好基础知识是理论付诸实践的前提。这次设计也很好地把这学期所学的理论知识和实践联系起来,我们从中受益匪浅。在这一段努力学习的过程中,我们对编译程序设计这一门课程也有了更进一步的认识。虽然说以前非常不懂编译原理,觉得它很难,现在真正的明白了一些代码的应用,只要努力去学习,就能灵活的去应用它。十二、参考文献1 陈火旺,刘春林.程序设计语言编译原理 M.北京:国防工业出版社,2000.2 Alfred VAno,Ravi Sethi,Jeffrey DUllman,编译原理M.机械工业出 版社,2003.3 张素琴,吕映芝,蒋维杜,等.编译原理M.北京:清华大学出版社,2005.专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁