编译原理第二次上机实验报告软工李U2014172xx.docx

上传人:叶*** 文档编号:35234821 上传时间:2022-08-20 格式:DOCX 页数:14 大小:25.87KB
返回 下载 相关 举报
编译原理第二次上机实验报告软工李U2014172xx.docx_第1页
第1页 / 共14页
编译原理第二次上机实验报告软工李U2014172xx.docx_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《编译原理第二次上机实验报告软工李U2014172xx.docx》由会员分享,可在线阅读,更多相关《编译原理第二次上机实验报告软工李U2014172xx.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、编译原理第二次上机实验报告姓名:李x 班级:软工140x班 学号:U2014172xx实验二设计实现简单语言的语法分析器1、实验目的通过该实验,熟练应用编译原理关于语法分析的基本理论和方法;学会用C/C+高级程序设计语言设计一个语法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。2、实验条件计算机上安装C/C+编译处理软件。3、实验内容及要求对下述单词表与语法定义的语言设计编制一个语法分析器。单词符号及种别表、语法及语法分析器功能、基本要求如下:(1)单词符号及种别表单词符号种别编码单词值main1int 2float3double4char5if 6else 7do8

2、while9l(l|d)*10内部字符串 ( +|-| ) dd*(.dd* | )( e ( +|-| ) dd*|) 20二进制数值表示=21+22- 23* 24/ 25(26)272829,30;3132=3334=35=36!=37#0(2)语法结构定义 := +|- := *|/ :=ID|num|()num:= ( +|-| ) 数字数字*(.数字数字* | )( e ( +|-| ) 数字数字*|)ID:=字母(字母|数字)*字母:=a|b|c|z|A|B|C|Z数字:=0|1|2|9(3)语法分析器功能及基本要求 处理用户提交的符合上述文法的源代码序列,进行语法分析,并给出语

3、法是否正确的结论。(1) 总体设计思想利用自上而下的分析方法;本实验所采用的是LL(1)分析法即预测分析法;每次通过词法分析模块读入一个完整的单词,在语法分析中判断正确性,最终将结果输出。(2) 详细算法设计语法分析 := +|- := *|/ :=ID|num|()num:= ( +|-| ) 数字数字*(.数字数字* | )( e ( +|-| ) 数字数字*|)ID:=字母(字母|数字)*字母:=a|b|c|z|A|B|C|Z数字:=0|1|2|9用字母替代后写成如下:E T+T | -TT F*F | /FFi| n | (E)将该扩充文法还原EE+T | E-T | TTT*F |

4、T/F | FF (E) | i | n消除非终结符E、T的直接左递归后,文法变为E TEE+TE| -TE |T FTT*FT| /FT|F (E) | i | n此文法是LL(1)文法求出该文法的预测分析表in+-*/()$EETEETEETEE(e)E+TEETEEETTFTTFTTFT(t)TTT*FTT/FTTTFFiFnF(E)根据预测分析表、分析栈和一个总控程序来判断一个语句是否正确;(3) 流程框图(4) 函数相关说明char input300;/存放输入的字符串char token20;/存放符合C语言词法规则的单词char ch;/单个字符char previous;/ch

5、的前一个字符char latter;/ch的后一个字符char ch1, ch2;/当处理注释的时候使用int typenum;/表示单词的种别码int p, m, n, cx;double decimal;/记录小数double sum;/存放数字int index;/存放指数int isNum;/是否是数字int isDecimal;/记录是否为小数int isExp;/记录是否为指数int isNegative;/是否带负号(对于指数)int isNegative1;/是否为负数char X,a;char stack200;void scanner();char *rwtab11 = m

6、ain, int, float, double, char, if, else, while, do, end ;/记录预测分析表,0表示没有产生式,其他数字表示产生式的序号int List59 = 1, 2, 0, 0, 0, 0, 3, 0, 0 , 0, 0, 4, 5, 0, 0, 0, 6, 7 , 8, 9, 0, 0, 0, 0, 10, 0, 0 , 0, 0, 11, 12, 13, 14, 0, 15, 16 , 17, 18, 0, 0, 0, 0, 19, 0, 0 char returnResult()函数返回n、i、e、+、-、*、/、(、);void scanne

7、r() 扫描函数判断种别码bool isVT(char x) 判断是否为终结符bool checkList(int x, int y) 查询是否在分析表中int getX()、int getY() 获取要查询数组MX,a元素的下标void makeTop() 把栈顶放入X中void push(int xy) 将y1y2.yn逆序放入S栈中int main() 主函数(5) 输入与输出(包括出错处理)输入以$结束回车即可运行程序输出success!或者unsuccess!或者error! unsuccess!出错分为两种情况1. 词法错误:error! unsuccess!2. 词法正确但语法错

8、误:unsuccess!(6) 程序运行结果(屏幕截图)(7) 词法分析器使用说明打开编译器VS或者VC+;文件新建项目;将代码复制粘贴,编译运行,按照提示输入即可使用;(8) 心得与体会加强了自己对于LL(1)分析法的理解与记忆;第二次试验难度要大于第一次;主要难在求预测分析表;开始由于预测分析表求错误导致程序运行一直出错也不知道到底bug出在哪里,后来才发现自己预测分析表求错了;对于词法分析实验一已经给出,预测分析总控制程序算法书本上已经给出;所以最大的难点就是求预测分析表;这需要足够的耐心和细心才能保证FIRSE集和FOLLOW集不多一个,也不漏掉其中一个;后期需要加强练习;(9) 源程

9、序清单/ 语法编译器01.cpp : 定义控制台应用程序的入口点。#include stdafx.h#include#include#includechar input300;/存放输入的字符串char token20;/存放符合C语言词法规则的单词char ch;/单个字符char previous;/ch的前一个字符char latter;/ch的后一个字符char ch1, ch2;/当处理注释的时候使用int typenum;/表示单词的种别码int p, m, n, cx;double decimal;/记录小数double sum;/存放数字int index;/存放指数int i

10、sNum;/是否是数字int isDecimal;/记录是否为小数int isExp;/记录是否为指数int isNegative;/是否带负号(对于指数)int isNegative1;/是否为负数char X,a;char stack200;void scanner();char *rwtab11 = main, int, float, double, char, if, else, while, do, end ;/记录预测分析表,0表示没有产生式,其他数字表示产生式的序号int List59 = 1, 2, 0, 0, 0, 0, 3, 0, 0 , 0, 0, 4, 5, 0, 0,

11、 0, 6, 7 , 8, 9, 0, 0, 0, 0, 10, 0, 0 , 0, 0, 11, 12, 13, 14, 0, 15, 16 , 17, 18, 0, 0, 0, 0, 19, 0, 0 char returnResult()scanner();switch (typenum)case 20:return n;/表示返回一个数字numbercase 10:return i;/表示返回idcase 22:return +;case 23:return -;case 24:return *;case 25:return /;case 26:return (;case 27:ret

12、urn );case 0:return $;default:return e;/表示error!void scanner()cx = 0;/用来记录小数点后面的位数m = 0;sum = 0;decimal = 0;index = 0;isDecimal = 0;isNegative = 0;isNegative1 = 0;isExp = 0;for (n = 0; n= a) & (ch = A) & (ch = a) & (ch = A) & (ch = 0) & (ch = 9)tokenm+ = ch;ch = inputp+;tokenm+ = 0;typenum = 10;/10表

13、示l(l|d)*p = p - 1;/回退一步for (n = 0; n = 0) & (ch = 0) & (ch = 0 & ch = 9)cx = cx + 1;decimal = decimal * 10 + (ch - 0);ch = inputp+;if (ch = )typenum = -1;return;for (int a = 0; a = 0) & (ch = 9)index = index * 10 + (ch - 0);ch = inputp+;if (isNegative = 1)/如果指数为负数for (int k = 0; k index; k+)sum = su

14、m*0.1;elsefor (int k = 0; k = 0) & (latter = 0) & (latter = a) & (latter = A) & (latter = a) & (previous = A) & (previous = 0) & (previous = 0) | (latter = 0) & (latter = 0) & (latter = a) & (latter = A) & (latter = a) & (previous = A) & (previous = 0) & (previous = 0) | (latter :tokenm+ = ch;ch = i

15、nputp+;if (ch = =)typenum = 33;tokenm+ = ch;elsetypenum = 32;p-;break;case:tokenm+ = ch;ch = inputp+;if (ch = =)typenum = 35;tokenm+ = ch;elsetypenum = 34;p-;break;case(:typenum = 26;tokenm+ = ch;break;case):typenum = 27;tokenm+ = ch;break;case:typenum = 28;tokenm+ = ch;break;case:typenum = 29;token

16、m+ = ch;break;case:typenum = 30;tokenm+ = ch;break;case;:typenum = 31;tokenm+ = ch;break;case=:typenum = 36;tokenm+ = ch;break;case!:tokenm+ = ch;ch = inputp+;if (ch = =)typenum = 37;tokenm+ = ch;elsep-;typenum = -1;break; case $:typenum = 0;tokenm+ = ch;break;default:typenum = -1;/判断是否为终结符bool isVT

17、(char x)if (x = e | x = E | x = T | X = t | x = F | x = f | x = $)return false;elsereturn true;/查询是否在分析表中bool checkList(int x, int y)if (Listxy = 0)return false;elsereturn true;/获取要查询数组元素的下标int getX()int x;switch (X)case E:x = 0; break;case e:x = 1; break;case T:x = 2; break;case t:x = 3; break;case

18、 F:x = 4; break;default:break;return x;int getY()int y;switch (a)case i:y = 0; break;case n:y = 1; break;case +:y = 2; break;case -:y = 3; break;case *:y = 4; break;case /:y = 5; break;case (:y = 6; break;case ):y = 7; break;case $:y = 8; break;default:break;return y;/把栈顶放到X中void makeTop()int top =

19、0;int i = 0;while (stacki != 0)i+;top = i - 1;X = stacktop;stacktop = 0;/放符号串到栈顶void push(int xy)switch (xy)/每个编号对应一个产生式case 1:strcat_s(stack, eT); break;case 2:strcat_s(stack, eT); break;case 3:strcat_s(stack, eT); break;case 4:strcat_s(stack, eT+); break;case 5:strcat_s(stack, eT-); break;case 6:b

20、reak;case 7:break;case 8:strcat_s(stack, tF); break;case 9:strcat_s(stack, tF); break;case 10:strcat_s(stack, tF); break;case 11:break;case 12:break;case 13:strcat_s(stack, tF*); break;case 14:strcat_s(stack, tF/); break;case 15:break;case 16:break;case 17:strcat_s(stack, i); break;case 18:strcat_s(

21、stack, n); break;case 19:strcat_s(stack, )E(); break;int main()printf(请输入词法:(以$结束);p = 0;doch = getchar();inputp+ = ch; while (ch != $);stack0 = $;stack1 = E; p = 0;a = returnResult();int flag = 1;if (a = e)printf(error!n);printf(unsuccess!);flag=0;while (flag=1)/栈顶放入到X中makeTop();/判断是否为终结符if (isVT(X

22、)if (X = a)a = returnResult();if (a = e)printf(error!n);printf(unsuccess!);flag = 0;else flag = 1;elseprintf(unsuccess!);flag = 0;elseif (X = $)if (X = a)flag = 0;printf(success!);elseprintf(unsuccess!);flag = 0;elseif (checkList(getX(), getY()push(ListgetX()getY();flag = 1;elseprintf(unsuccess!);flag = 0;getchar();getchar();return 0;

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

当前位置:首页 > 教育专区 > 高中资料

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

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