
实验报告涵盖了编译原理的语法分析、语义分析和词法分析,并包含详细的源程序。
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
附录C 编译程序实验:实验目的在于利用C语言编制一个遍扫描的编译程序,用于对一个简单的编程语言的子集进行处理,旨在加深对编译原理的理解,并掌握编译程序的实现方法和相关技术。语法分析 C2.1 实验目的是设计并实现一个递归下降分析程序,该程序能够对词法分析程序所提供的单词序列进行语法检查和结构化分析。C2.2 实验要求采用C语言编写递归下降分析程序,并对其进行简单语言的语法分析。C2.2.1 实验目的是通过实际操作,进一步强化对语法驱动翻译原理的理解,以及将语法分析识别出的语法成分转换成中间代码的语义翻译方法。实验要求采用递归下降语法驱动翻译法,并对算术表达式和赋值语句进行语义分析,最终生成四元式序列。实验输入为语法分析器提供的正确单词串,而输出则是以三地址指令形式呈现的三元式序列。例如:对于语句“begin a:=2+3*4;x:=(a+b)/c end”,其对应的三地址指令如下:(1)t1 = 3 * 4;(2)t2 = 2 + t1;(3)a = t2;(4)t3 = a + b;(5)t4 = t3 / c;(6)x = t4。算法思想:1. 定义语义过程 (emit)。该函数负责生成三地址语句并将其添加到四元式表中。四元式表的结构定义如下:struct {char result[8];char ag1[8];char op[8];char ag2[8];}quad[20]; 2. 定义临时变量生成函数 newtemp()。该函数负责生成新的临时变量名,并按照 T1, T2, ... 的顺序进行命名。主程序示意图如图 C.10所示。(2) 函数 lrparser 在原有语法分析的基础上添加相应的语义动作:将输入字符串转换为四元式序列。在本次实验中,我们主要针对表达式和赋值语句进行翻译。语义分析程序的 C 语言程序框架如下:int lrparser(){ int schain=0;kk=0;if(syn=1){读下一个单词符号;schain=yucu; /调用语句串分析函数进行解析/if(syn=6){读下一个单词符号;if(syn=0 && (kk==0))输出“success”;}else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;}else{输出’begin’错误;kk=1;}}return(schain);int yucu(){ int schain=0;schain=statement();/调用语句分析函数进行解析/while(syn=26){读下一个单词符号;schain=statement(); /调用语句分析函数进行解析/}return(schain);}int statement(){ char tt[8],eplace[8];int schain=0;{switch(syn){case 10:strcpy(tt,token);scanner();if(syn=18){读下一个单词符号;strcpy(eplace,expression());emit(tt,eplace,””,””);schain=0;}else {输出’缺少赋值号’的错误;kk=1;}return(schain);break;}}char *expression(void){char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);/分配空间/ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt =(char )malloc(12);strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/while(syn=13 or 14){ 操作符 tt= ‘+’或者‘—’;读下一个单词符号;strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/strcpy(eplace,tp);}return(eplace);}char *term(){/仿照函数expression编写/char *factor(){char *fplace;fplace=(char *)malloc(12);strcpy(fplace,,token);/将标识符token的值赋给fplace/读下一个单词符号;}else if (syn==...)}return fplace;}
全部评论 (0)


