编译原理第二次上机实验报告软工李U2014172xx.docx
《编译原理第二次上机实验报告软工李U2014172xx.docx》由会员分享,可在线阅读,更多相关《编译原理第二次上机实验报告软工李U2014172xx.docx(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 第二次 上机 实验 报告 软工李 U2014172xx
限制150内