




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译技术课程设计班 级 计算机1201 学 号 姓 名 指导老师 2015年 6 月目 录一、目的2二题目2三、要求2四、实验环境2五、系统实现3 1.词法分析32.语法分析73.中间代码84.错误处理13六、程序运行结果141.成功用例142.出错处理用例15七、总结18一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二题目 表达式的小
2、型编译器三、要求 表达式的小型编译器:1 词法分析 产生语言的单词序列2 语法分析 能识别由加+ 乘* 括号()操作数(变量或常数)所组成的算术表达式,其文法如下:EE+T|TTT*F|FF(E)|i 使用的分析方法可以是:递归下降分析法或LR分析法。 3 中间代码生成 产生上述算术表达式的中间代码4 错误处理 给出错误信息输入:算术表达式输出:符号表,常数表。 递归下降分析法:递归调用过程/ LR分析法:语义栈和符号栈四元式序列四、实验环境 操作系统:Win8.1 实验软件:Visual Studio 2013五、系统实现1.词法分析(1)单词符号表 单词符号种别编码助记符内码值while1
3、while-if2if-Else3else-switch4switch-case5case-标识符6idid在符号表中的位置常数7numnum在常数表中的位置+8+-9-*10*-< =11relopLE<11relopLT= =11relopEQ=12=-;13;-(14(-)15)-#16#-(2) 状态转换图(只画出算数表达式需要部分)(3) 数据结构 单词二元式:(单词种别,单词自身的值) 符号表:(表序号,符号表自身的值) 常数表:(表序号,常数表自身的值)(4) 函数说明/判断是否为字母bool letter()if ('a' <= charact
4、er) && (character <= 'z') | ('A' <= character) && (character <= 'Z')return true;elsereturn false;/判断是否为数字bool digit()if ('0' <= character) && (character <= '9')return true;elsereturn false;/将token中的字符串与character的字符连接void
5、concatenation()tokena = character;a+;p+;character = inp;/扫描指针回退一个字符void retract() p- -;/将token中的字符串与关键字比较int reserve() string To = token;for (int j = 0; j < 5; j+)if (To = keywordj)return j + 1;break;return 0;/变量表去重int varilist(string token)int i;for (i = 0; i < a1; i+)if (token = blmbi)break;
6、if (i = a1)blmba1 = token;a1+;return 0;/常数表去重int conslist()int i;for (i = 0; i < b; i+)if (token = csbi)break;if (i = b)csbb = token;b+;return 0;/显示变量名表void showVari()cout << endl;cout << "-变量名表-" << endl;for (int i = 0; i < a1; i+)cout << i << " &q
7、uot; << blmbi << endl;/显示常量名表void showCons()cout << endl;cout << "-常数表-" << endl;for (int i = 0; i < b; i+)cout << i << " " << csbi << endl;2.语法分析(1)分析方法说明 LR分析法指从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看K个输
8、入符号,就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成,从而也就可以确定当前所应采取的分析动作 (是移进还是按某一产生式进行归约等)。每一项ACTIONs, a所规定的动作是以下四种情况之一:(1) 移进:使(s, a)的下一状态s'=ACTIONs, a和输入符号a进栈(注:对终结符a来说,下一状态s'=GOTOs, a的值实际上是放在ACTIONs, a中的),下一输入符号变成现行输入符号。(2) 归约:指用某一产生式A进行归约。假若的长度为,则归约的动作是去掉栈顶的个项,即使状态sm-变成栈顶状态,然后使(sm-,A)的下一状态s'=GOTOsm-
9、,A 和文法符号(非终结符)A进栈。归约的动作不改变现行输入符号,执行归约的动作意味着呈现于栈顶的符号串Xm-+1Xm是一个相对于A的句柄。 (3) 接受:宣布分析成功,停止分析器的工作。(4) 报错:报告发现源程序含有错误,调用出错处理程序。 LR分析器的总控程序本身的工作十分简单,它的任何一步只需按分析栈的栈顶状态s和现行输入符号a执行ACTIONs,a所规定的动作即可。(2) 文法 LR分析表如下:状态ACTIONGOTOi+*()#E0S3S211S4S5acc2S3S263r4r4r4r44S3S275S3S286S4S5S97r1S5r1r18r2r2r2r29r3r3r3r3状态
10、转换图如下:(3)数据结构 stack<int> status; /状态栈 stack<char> sign; /符号栈(4) 函数说明 void showLR()/栈遍历3.中间代码(1)属性文法 产生式语义规则(1) SEprint (E.val)(2) EE(1)+TE.val=E(1).val+T.val(3) ETE.val=T.val(4) TT(1)*FT.val=T(1).val*F.val(5) TT(1)T.val=T(1).val(6) F(E)F.val=E.val(7) FiF.val=i.lexval(2) 数据结构 stack<str
11、ing> yuyi; /语义栈 yuyi.push(); /入栈 yuyi.pop(); /出栈 string v1, v2, v3, v4; /四元式 v1 = "+"/"*" /四元式第一位显示操作符 v2 = tempYuyiPush.top(); /四元式第二位显示操作数 v3 = tempYuyiPush.top(); /四元式第三位显示操作数 v4 = intToStr(strToInt(v2) + strToInt(v3); /四元式第四位显示结果(3) 函数说明 void yffxSolve() /规约和移进处理,以及四元式的输出s
12、tack<string> tempYuyiPush;showLR();int i = -1;if (cifam0 = "6" | cifam0 = "7")/标识符或数字i = 0;if (cifam0 = "8")/+i = 1;if (cifam0 = "10")/*i = 2;if (cifam0 = "14")/(i = 3;if (cifam0 = "15")/)i = 4;if (cifam0 = "16")/#i = 5;if (
13、i = -1) cout << "输入了错误的种别编码" << endl;m+;return;if (actionstatus.top() - 48i > 0)if (actionstatus.top() - 48i > 100)if (actionstatus.top() - 48i = 1000)cout << "acc" << endl;system("pause");exit(0);/规约int s = actionstatus.top() - 48i - 100;f
14、or (int j = 0; j < gyLens - 1; j+)if (s != 4)tempYuyiPush.push(yuyi.top();yuyi.pop();status.pop();sign.pop();int current = status.top();status.push(actioncurrent - 486 + 48);sign.push('E');if (s = 4)else v2 = tempYuyiPush.top();tempYuyiPush.pop();string v2plus5 = tempYuyiPush.top();tempYu
15、yiPush.pop();v3 = tempYuyiPush.top();tempYuyiPush.pop();if (isdigit(v2) && isdigit(v3)if (s = 1)v4 = intToStr(strToInt(v2) + strToInt(v3);if (s = 2)v4 = intToStr(strToInt(v2) * strToInt(v3);yuyi.push(v4);else if (v2 = "_" && isdigit(v2plus5) && v3 = "_")v4
16、 = v2plus5;yuyi.push(v4);else string tempNum = intToStr(yuyiNum);string tempS = "T" + tempNum;yuyiNum+;yuyi.push(tempS);v4 = tempS;if (s = 1)v1 = "+"if (s = 2)v1 = "*"else/移进status.push(actionstatus.top() - 48i + 48);sign.push(inputSigni);if (cifam0 = "6" | ci
17、fam0 = "7")if (cifam0 = "6")yuyi.push(cifam1);else stringstream s1;s1 << cifam1;string tempVal;s1 >> tempVal;yuyi.push(tempVal);else yuyi.push("_");m+;elseint err = actionstatus.top() - 48i;cout << "第"<<m+1<<"个单词错误:"<
18、<"t"<<showErrerr + 12 << endl;system("pause");m+;lrNum+;(4) 流程图4.错误处理(1)数据结构在分析表的空格中分别确定各种不同的错误类型string showErr12 =" +前缺少变量或常量"," *前缺少变量或常量"," )前缺少对应("," 连续的变量或常量,缺少+/*"," (前缺少+/*"," (后缺少常量或变量"," ()内无
19、表达式"," +后缺少变量或常量"," *后缺少变量或常量"," 算数表达式为空"," 缺少对应)"," 语法分析错误" ;(2)函数说明 static int action107 = /在分析表的数组中插入出错的序列 3, -12, -11, 2, -10, -3, 1 , -9, 4, 5, -8, -10, 1000, -1 , 3, -7, -7, 2, -6, -2, 6 , -9, 104, 104, -8, 104, 104, -1 , 3, -5, -5, 2, -10, -5, 7 , 3, -4, -4, 2, -10, -4, 8 , -9, 4, 5, -9, 9, -2, -1 , -9, 101, 5, -9, 101, 101, -1 , -9, 102, 102, -9, 102, 102, -1 , -9, 103, 103,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国鸡肉制品加工项目创业计划书
- 中国伞花蔷薇项目创业计划书
- 中国C2C项目创业计划书
- 中国计算机软件咨询项目创业计划书
- 中国观赏林项目创业计划书
- 中国尿液沉渣分析仪项目创业计划书
- 中国多煤体学习系统项目创业计划书
- 食品生产合作合同
- 多模态数据的深度神经记忆整合方法-洞察阐释
- 科大讯飞AI数字员工解决方案
- GB/T 45475.2-2025塑料聚苯醚(PPE)模塑和挤出材料第2部分:试样制备和性能测定
- 国家开放大学《园林树木学》形考任务1-4参考答案
- 三废管理培训课件
- 抖音来客合同协议
- 湖北省武汉市2025届高中毕业生四月调研考试数学试卷及答案(武汉四调)
- 演出经纪人员资格练习题有参考答案2025
- 4.2整式的加法与减法 课件 -2024-2025学年人教版数学七年级上册
- 蜜雪冰城加盟合同(2025年版)
- 接触传染病患者的注意事项
- 2025高中学业水平考试生物重点知识点归纳总结(复习必背)
- 区域业务拓展代理合同样本
评论
0/150
提交评论