编译原理_网工0801_向前龙

上传人:飞*** 文档编号:6405376 上传时间:2017-09-10 格式:DOC 页数:15 大小:92.42KB
返回 下载 相关 举报
编译原理_网工0801_向前龙_第1页
第1页 / 共15页
编译原理_网工0801_向前龙_第2页
第2页 / 共15页
编译原理_网工0801_向前龙_第3页
第3页 / 共15页
编译原理_网工0801_向前龙_第4页
第4页 / 共15页
编译原理_网工0801_向前龙_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《编译原理_网工0801_向前龙》由会员分享,可在线阅读,更多相关《编译原理_网工0801_向前龙(15页珍藏版)》请在金锄头文库上搜索。

1、黄 冈 师 范 学 院提高型实验报告实验课题 编译器的实现(实验类型:综合性 设计性 应用性)实验课程 编译原理实验时间 2010 年 12 月 19 日学生姓名 向钱龙专业班级 网络 200801学 号 200826340121 目录一、 课设要求 .2二、 总体设计思想 .3三、 详细算法设计 .3四、 流程框图 .4五、 函数相关说明 .81. 所有函数一览 .82. void emit(char *res,char *num1,char *op,char *num2) .83. char *newTemp() .94. int merge(int p1,int p2) .95. voi

2、d backpatch(int p,int t) .106. void fuzhi().107. void tiaojian(int *nChain) .118. void xunhuan() .12六、 编译器使用说明 .14七、 心得与体会 .14一、 课设要求用 C 语言对下述文法和单词表定义的语言设计编制一个编译器。(1)单词符号及种别表单词符号 种别编码 单词值main 1 int 2 float 3 double 4 char 5 if 6 else 7 do 8 while 9 l(l|d)* 10 内部字符串 ( +|-| ) d*(.dd* | )( e ( +|-| ) d

3、d*|) 20 二进制数值表示= 21 + 22- 23 * 24 / 25 ( 26 ) 27 28 29 , 30 ; 31 32 = 33 := main() := /程序用括号括起来:=;:=|:=ID= /赋值语句用”=”号:=if /条件怎么没有括号,囧(自己加 1 个):=do while := /没有布尔运算,还算简单:= +|-:= *|/:=ID|num|()num:= ( +|-| ) 数字 *(.数字数字 * | )( e ( +|-| ) 数字数字 *|)ID:=字母 (字母|d 数字) *字母:=a|b|c|z|A|B|C|Z数字:=0|1|2|9:= |=|=|!

4、=二、 总体设计思想采用递归下降(自上而下)的语法制导翻译法。三、 详细算法设计在前两次试验的基础上改进。词法分析程序 语法分析程序 语义分析程序 编译器。不断完善,不断改进。渐变的过程。四、 流程框图图 I 主函数示意图是否为 main?调用 scanner是否为(?调用 scanner是否为)?调用 scanner调用语句块分析函数 staBlock 出错处理否否否是否为 ?调用 scanner调用语句串分析函数 staString调用 scanner是否为 ? 出错处理否否图 II 递归下降分析程序示意图图 III 语句块分析示意图调用语句分析函数 sta回溯,调用 backpatch是

5、否为 ; ?调用 scanner调用语句分析函数 sta否出错处理图 IV 语句串分析示意图调用赋值语句分析函数 fuzhi是否为 字符串?是否为 if ?调用条件语句分析函数 tiaojian是否为 do ?调用循环语句分析函数 xunhuan图 V 语句分析示意图五、 函数相关说明1. 所有函数一览void scanner(); /扫描void lrparser(); void staBlock(int *nChain); /语句块void staString(int *nChain); /语句串void sta(int *nChain); /语句void fuzhi(); /赋值语句vo

6、id tiaojian(int *nChain); /条件语句void xunhuan(); /循环语句char* E(); /Expresiion 表达式char* T(); /Term 项char* F(); /Factor 因子char *newTemp(); /自动生成临时变量void backpatch(int p,int t); /回填int merge(int p1,int p2); /合并 p1 和 p2void emit(char *res,char *num1,char *op,char *num2); /生成四元式2. void emit(char *res,char *

7、num1,char *op,char *num2)该函数的功能是生成一个三地址语句送到四元式表中。void emit(char *res,char *num1,char *op,char *num2)strcpy(fourComq.result,res);strcpy(fourComq.arg1,num1);strcpy(fourComq.opera,op);strcpy(fourComq.arg2,num2);q+;四元式表中的结构如下:structchar result10; /字符串(字符数组)char arg110; /操作数 1char opera10; /运算符char arg21

8、0; /操作数 2fourCom20; /结构体数组3. char *newTemp()该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是 T1,T2,T3,.char *newTemp()char *p;char varTemp10;p=(char *)malloc(10);kk+;itoa(kk,varTemp,10); /整数转换为字符串strcpy(p+1,varTemp);p0=T; /字符串前加 T,便于识别return p;4. int merge(int p1,int p2)该函数的功能是将以 P1,P2 为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。in

9、t merge(int p1,int p2) /合并 p1 和 p2char circle,nResult;if(p2=0)nResult=p1;elsenResult=circle=p2;while(atoi(fourComcircle.result) /四元式第四个分量不为 0circle=atoi(fourComcircle.result); /strcpy(fourComcircle.result,p1);sprintf(fourComcircle.result,%s,p1);/目的是用 p1 的值覆盖 0return nResult; /p2 是头,p1 覆盖 0,接在 p2 后边5

10、. void backpatch(int p,int t)该函数的功能是把 P 所链接的每个四元式的第四区段(result 段)都回填 t。void backpatch(int p,int t) int w,circle=p;while(circle) /circle 不为 0 的时候w=atoi(fourComcircle.result); /四元式 circle 第四分量内容/strcpy(fourComcircle.result,t); /把 t 填进四元式 circle 的第四分量sprintf(fourComcircle.result,%d,t);circle=w; /w 记录的是链条上下一个四元式,移动!return;6. void fuzhi(

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号