北邮 编译原理 语义分析实验报告.docx
《北邮 编译原理 语义分析实验报告.docx》由会员分享,可在线阅读,更多相关《北邮 编译原理 语义分析实验报告.docx(16页珍藏版)》请在三一办公上搜索。
1、北邮 编译原理 语义分析实验报告编译原理 第六章 语义分析 目 录 1. 2. 3. 4. 实验题目和要求 . 2 实验分析和思考 . 3 翻译方案 . 4 LR实现 自底向上分析 . 5 4.1. 构造识别所有活前缀的DFA . 5 4.2. 构造LR分析表 . 6 5. S属性定义的自底向上实现 . 7 5.1. 扩充分析栈 . 7 5.2. 改造分析程序 . 7 5.3. 编程实现 . 7 6. 运行结果截图: . 13 1. 实验题目和要求 题目:语义分析程序的设计与实现。 实验内容:编写语义分析程序,实现对算术表达式的类型检查和求值。要求所分析算术表达式由如下的文法产生。 EE+T|
2、E-T|TTT*F|T/F|F Fid|(E)|num实验要求:用自底向上的语法制导翻译技术实现对表达式的分析和翻译。 (1) 写出满足要求的语法制导定义或翻译方案。 (2) 编写分析程序,实现对表达式的类型进行检查和求值,并输出: 分析过程中所有产生式。 识别出的表达式的类型。 识别出的表达式的值。 (3) 实验方法:可以选用以下两种方法之一。 自己编写分析程序。 利用YACC自动生成工具。 2. 实验分析和思考 由于要求进行类型检查和求值,所以可以定义两个综合属性,一个记录值一个记录类型,存放在结构中,一并传入传出。 输出的产生式可以作为虚拟综合属性,在产生式的最后打印出来。 id认为是定
3、义的变量名,假设是26个小写字母,它们的值存于一个数组里。 将类型检查和求值归于一次扫描,当检查类型出错时则停止,否则继续。 哈希实现输入的映射,模拟词法分析的记号流。 输入格式为每个num和id对应两个输入字符,其他运算符仍对应一个字符。比如第4个num,输入为num4。 由于只具有综合属性,故可以用S属性的自底向上翻译实现,利用LR分析程序来实现,只需扩充分析站和改造分析程序。 PS:这次实验我只是简单模拟了最简单的显式严格匹配,即没有实现隐式类型转换。 3. 翻译方案 EE1+TE.val=E1.val+T.val,print(EE+T)if(E1.type=T.type)E.type=
4、T.type;elseE.type=type_error;EE1-TE.val=E1.val-T.val,print(EE-T)if(E1.type=T.type)E.type=T.type;elseE.type=type_error;ETE.val=T.val,print(ET),E.type=T.typeTT1*FT.val=T1.val*F.val,print(TT*F)if(T1.type=F.type)T.type=F.type;elseT.type=type_error;TT1/FT.val=T1.val/F.val,print(TT/F)if(T1.type=F.type)T.t
5、ype=F.type;elseT.type=type_error;TFT.val=F.val,print(TF),T.type=F.typeFidF.val=id.val,print(Fid),F.type=id.typeF(E)F.val=E.val,print(F(E),F.type=E.typeFnumF.val=num.val,print(Fnum),F.type=num.type4. LR实现 自底向上分析 4.1. 构造识别所有活前缀的DFA 构造扩展文法 EE EE+T|E-T|TTT*F|T/F|F Fid|(E)|numFIRST和FOLLOW集如下 E id, (, num
6、 $, ), +, - T id, (, num $, ), +, -, *, / F id, (, num $, ), +, -, *, / FIRST FOLLOW 构造识别所有活前缀的DFA如下 4.2. 构造LR分析表 EE+T (1) TT*F (4) Fid (7) EE-T (2) TT/F (5) F(E) (8) ET (3) TF (6) Fnum (9) 状态 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 action + s7 r3 r6 r7 r9 s7 r1 r2 r4 r5 r8 goto num S6 s6 s6 s6 s6
7、s6 - s8 r3 r6 r7 r9 s8 r1 r2 r4 r5 r8 * s9 r6 r7 r9 s9 s9 r4 r5 r8 / s10 r6 r7 r9 s10 s10 r4 r5 r8 id s4 s4 s4 s4 s4 s4 ( S5 s5 s5 s5 s5 s5 ) r3 r6 r7 r9 s16 r1 r2 r4 r5 r8 $ acc r3 r6 r7 r9 r1 r2 r4 r5 r8 E 1 11 T 2 2 12 13 F 3 3 3 3 14 15 16 5. S属性定义的自底向上实现 5.1. 扩充分析栈 多定义一个结构栈数组,结构里有两个变量,一个为val, 一
8、个为type。实现时,val其实是定义了两个变量,一个表示int时的值,一个表示real时的值,因为无法公用一个类型的变量。 定义type只有三种,一种为int, 一种为real, 一种为type_error。 val由外部提供。可通过数组搜索。 5.2. 改造分析程序 在归约时完成类型检查和求值。 之所以与归约联系,是因为每一次归约决定着所用的是哪一个产生式。 acc时打印最终求值结果和表达式类型。 5.3. 编程实现 #include #include #include #include #include #include #include #include #include using
9、namespace std; const int S = 1; /移进 const int R = 2; /归约 const int ACC = 3; /分析成功 const int Vt_num = 9; /终结符和$数 const int Vn_num = 3; /非终结符数 const int State_num = 17; /状态数 const int formula_num = 10; /扩展文法产生式数目 const int Max_input = 1024; /输入记号流长度 const int max_stack = 2500; /栈的最大高度 int tokenMax_inp
10、ut; /记号流 int len; /记号流长度 int pointer; /定义指向输入串的指针 string fmformula_num; /存放对应的产生式 int f_vnformula_num; /产生式对应的左部的非终结符 int flenformula_num; /产生式的长度 stack st; /定义栈 struct action int rs; /初始化表项的动作为0即出错,R归约S移进ACC成功 int no; actState_numVt_num; /action表表项 int gtoState_numVn_num;/goto表表项 struct attri int t
11、ype; /int-1, real-2, type_error-0 int i_val; double r_val; valmax_stack; int v_top; void initial_table /初始化分析表 memset(act, 0, sizeof(act); memset(gto, -1, sizeof(gto); /动作表action act04 = S, 4; act05 = S, 6; act06 = S, 5; act10 = S, 7; act11 = S, 8; act18.rs = ACC; act54 = S, 4; act55 = S, 6; act56 =
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮 编译原理 语义分析实验报告 编译 原理 语义 分析 实验 报告
链接地址:https://www.31ppt.com/p-3339290.html