北邮大三上-编译原理-语义分析实验报告

北邮大三上-编译原理-语义分析实验报告

ID:8924865

大小:472.00 KB

页数:14页

时间:2018-04-12

北邮大三上-编译原理-语义分析实验报告_第1页
北邮大三上-编译原理-语义分析实验报告_第2页
北邮大三上-编译原理-语义分析实验报告_第3页
北邮大三上-编译原理-语义分析实验报告_第4页
北邮大三上-编译原理-语义分析实验报告_第5页
资源描述:

《北邮大三上-编译原理-语义分析实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、编译原理第六章语义分析班级:09211311学号:姓名:schnee目录1.实验题目和要求32.实验分析和思考33.翻译方案44.LR实现自底向上分析(摘自语法分析实验)54.1.构造识别所有活前缀的DFA54.2.构造LR分析表65.S属性定义的自底向上实现75.1.扩充分析栈75.2.改造分析程序75.3.编程实现86.运行结果截图:141.实验题目和要求题目:语义分析程序的设计与实现。实验内容:编写语义分析程序,实现对算术表达式的类型检查和求值。要求所分析算术表达式由如下的文法产生。实验要求:用自底向上的语法制导翻译技术实现

2、对表达式的分析和翻译。(1)写出满足要求的语法制导定义或翻译方案。(2)编写分析程序,实现对表达式的类型进行检查和求值,并输出:①分析过程中所有产生式。②识别出的表达式的类型。③识别出的表达式的值。(3)实验方法:可以选用以下两种方法之一。①自己编写分析程序。②利用YACC自动生成工具。2.实验分析和思考由于要求进行类型检查和求值,所以可以定义两个综合属性,一个记录值一个记录类型,存放在结构中,一并传入传出。输出的产生式可以作为虚拟综合属性,在产生式的最后打印出来。id认为是定义的变量名,假设是26个小写字母,它们的值存于一个数组

3、里。将类型检查和求值归于一次扫描,当检查类型出错时则停止,否则继续。哈希实现输入的映射,模拟词法分析的记号流。输入格式为每个num和id对应两个输入字符,其他运算符仍对应一个字符。比如第4个num,输入为num4。由于只具有综合属性,故可以用S属性的自底向上翻译实现,利用LR分析程序来实现,只需扩充分析站和改造分析程序。PS:这次实验我只是简单模拟了最简单的显式严格匹配,即没有实现隐式类型转换。1.翻译方案1.LR实现自底向上分析(摘自语法分析实验)1.1.构造识别所有活前缀的DFA构造扩展文法FIRST和FOLLOW集如下ETF

4、FIRSTid,(,numid,(,numid,(,numFOLLOW$,),+,-$,),+,-,*,/$,),+,-,*,/构造识别所有活前缀的DFA如下1.1.构造LR分析表(1)(4)(7)(2)(5)(8)(3)(6)(9)状态actiongoto+-*/idnum()$ETF0s4S6S51231s7s8acc2r3r3s9s10r3r33r6r6r6r6r6r64r7r7r7r7r7r75s4s6s511236r9r9r9r9r9r97s4s6s51238s4s6s51339s4s6s51410s4s6s51511s

5、7s8s161612r1r1s9s10r1r113r2r2s9s10r2r214r4r4r4r4r4r415r5r5r5r5r5r516r8r8r8r8r8r81.S属性定义的自底向上实现1.1.扩充分析栈多定义一个结构栈数组,结构里有两个变量,一个为val,一个为type。实现时,val其实是定义了两个变量,一个表示int时的值,一个表示real时的值,因为无法公用一个类型的变量。定义type只有三种,一种为int,一种为real,一种为type_error。val由外部提供。可通过数组搜索。1.2.改造分析程序在归约时完成类型

6、检查和求值。之所以与归约联系,是因为每一次归约决定着所用的是哪一个产生式。acc时打印最终求值结果和表达式类型。1.3.编程实现#include#include#include#include#include#include#include#include#includeusingnamespacestd;constintS=1;//移进constintR=2;//归约const

7、intACC=3;//分析成功constintVt_num=9;//终结符和$数constintVn_num=3;//非终结符数constintState_num=17;//状态数constintformula_num=10;//扩展文法产生式数目constintMax_input=1024;//输入记号流长度constintmax_stack=2500;//栈的最大高度inttoken[Max_input];//记号流intlen;//记号流长度intpointer;//定义指向输入串的指针stringfm[formula_nu

8、m];//存放对应的产生式intf_vn[formula_num];//产生式对应的左部的非终结符intflen[formula_num];//产生式的长度stackst;//定义栈structaction{intrs;//初始化表项的动

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。