- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
语义分析器实验报告
编译原理语义分析实验报告 软工082班 兰洁 XX 一、实验内容 二、实验目的 三、实验要求 四、程序流程图 五、程序代码与主要过程说明 六、测试用例 七、输出结果 八、实验心得 一、实验内容 定义模拟的简单语言的语义成分,将语义分析程序编制成一个子程序,在实验2分析出个语法单位后,分析其含义,并将可执行语句或表达式翻译成四元式输出,并将错误信息输出。 二、实验目的 通过上机实验,加深对语义制导翻译原理的理解,掌握将语法分析所识别的语法成分变换成为中间代码的语义翻译方法。 三、实验要求 采用递归下降语法制导翻译方法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 例如:对于语句串 Function a=2+3*4; x=(a+b)/c; endfunc # 输出的三地址指令如下 ?t1=3*4 ?t2=2+t1 ?a=t2 ?t3=a+b ?t4=t3/c ?x=t4 四、程序流程图 由于语义分析的的方法就是在语法分析过程中,根据每个产生式所对应的语义子程序进行翻译,为每个产生式配上一个翻译子程序,并在语法分析的同时执行这些子程序。所有对应的流程图与语法分析流程图大同小异,关于各类函数的流程图我已经在词法分析报告与语法分析报告中详细画出,所以这里只说明程序主要流程。 五、程序代码与主要过程说明 /*语义分析源代码*/ #include #include #include #include #include structquad//四元式表 {charresult[12]; };charag1[12];charop[12];charag2[12]; structquadquad[30]; intcount=0; char*expression(void); charprog[200],token[9]; charch; intsyn,p,m,n,sum=0; intkk=0,k=0; char*rwtab[6]={function,if,then,while,do,endfunc};voidscaner() {m=0; for(n=0;n=ach=Ach=ach=Ach=0ch=0ch=0ch:m=0;token[m++]=ch;ch=prog[++p];if(ch===){syn=24;}else{syn=23;}break;ch=prog[--p];token[m++]=ch;case=:m=0,token[m++]=ch;ch=prog[++p];if(ch===){syn=25;}else{syn=18;}break;ch=prog[--p];token[m++]=ch;case!:m=0;token[m++]=ch;ch=prog[++p];if(ch===){syn=22; 实验三语法分析 XX科3李君林 一.实验目的: 通过使用、剖析和扩充TINY语言的语义分析程序,掌握编译器的语义分析程序的构造方法。 二.实验内容 (一)运行TINY的语义分析程序 (二)扩充TINY的语法分析程序 提示: 考虑作用域和数组时可能需要修改符号表。 三.实验步骤 1.先读懂TINY语义程序 buildSymtab(syntaxTree);//根据语法树建立符号表 通过递归调用traverse(syntaxTree,insertNode,nullProc); 进行staticvoidinsertNode(TreeNode*t),这样将遇到与ID有关的Node信息通过voidst_insert(char*name,intlineno,intloc,intlen)加入到hashTable[h]数据结构中。 接着调用typeCheck(syntaxTree);进行类型检测 通过递归调用traverse(syntaxTree,nullProc,checkNode);将语法树遍历,然后调用staticvoidcheckNode(TreeNode*t)对节点进行类型检测 2.扩充TINY的语法分析程序 本次实验我首先将源程序实现的功能改成符合C_MINUS的符号表与类型检测然后加入没申明调用与数组调用错误即数组没申明而调用数组类型。 四.实验结果 1.正确的测试程序 /**/ intgcd(intu,intv[]) { if(v==0) returnu; else returngcd(v,u); }
文档评论(0)