版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上编译技术课程设计班 级 学 号 姓 名 指导老师 2015年 6月目录一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、题目题目1 表达式的小型编译器三、要求1.词法分析产生语言的单词序列 2.语法分析能识别由加+ 乘* 括号()操作数(变量或常数)所组成的算术表达式,其文法如下:EE+T|TTT*F|FF(E
2、)|i 使用的分析方法可以是:递归下降分析法或LR分析法。 3.代码生成 产生上述算术表达式的中间代码4.错误处理给出错误信息输入:算术表达式输出:符号表,常数表。 归下降分析法:递归调用过程/ LR分析法:语义栈和符号栈四元式序列四、实验环境1.开发环境: Visual Studio 20132.程序语言: C+五、系统实现1.词法分析(1)单词符号表(2)状态转换图 (3)数据结构 (4)函数说明void getonechar() /*从输入的算数表达式中读取一个字符*/void concatenation()/*将token中的字符串与character中的字符并作为token中新的字符
3、串*/bool letter() /*判断character中的字符是否为字母的布尔函数,是则返回true,否侧返回false*/bool digit()/*判断character中的字符是否为数字的布尔函数,是则返回true,否侧返回false */void retract()/*扫描指针回退一个字符,同时将character置为空白*/int reserve() /*将token中的字符查找保留字数组,若是保留字就返回它的种别编码,否则返回0*/void buildlist1()/*将标识符登录到符号表中(value2)*/void buildlist2()/*将常数登录到常数表中(val
4、ue1)*/void resolve()/*词法分析的主要函数,每次识别一个单词,将种别编码放入cf中,填入对应的value1和value*/void cffx()/*词法分析,读入输入的算数表达式,循环执行resolve(),直到所有单词识别完毕*/2.语法分析(1)分析方法说明 本程序采用LR分析法,存在4种动作:移进:使(s,a)的下一个状态s= ACTIONs,a和输入符号a进栈,下一输入符号变成现行输入符号.规约: 指用某一产生式A进行规约,假若的长度为,则规约动作是去掉栈顶的个栈,即是状态Sm-变成栈顶状态,然后使(Sm-,A)的下一状态s=GOTOSm-,A和文法符号A进栈.规约
5、的动作不改变现行输入符号,执行规约的动作意味着呈现于栈顶的符号串Xm-+1Xm是一个相对于A的句柄.接受: 宣布分析成功,停止分析器工作.报错: 报告发现源程序含有错误,调用错误处理程序.(2)文法(3)数据结构#include<stack> /*引入c+标准库*/stack<int> status;/*状态栈*/stack<char> sign; /*符号栈*/(4)函数说明Void initYffx() /*语法分析初始化,状态栈放0,符号栈放#,语义栈放_*/Void showLR()/*遍历状态栈,符号栈,语义栈,并显示出来*/Void yffxSo
6、lve() /*查action二维数组,进行移进,规约处理*/Void yyfx()/*循环执行yffxSolve(),直到分析成功或出现错误*/Void showBlm()/*显示变量名表*/Void showCsb()/*显示常数表*/3.中间代码(1)属性文法 移进时: 如果输入的是终结符,语义栈就移进”_”,如果是非终结符,则语义栈移进对应的常数或变量名.规约时: 如果规约对应的文法是(4)Ei时语义栈不变,对应其他文法时,先pop出栈顶3个元素,再如果是(3)E(E)文法时,语义栈push刚才出栈的第二个元素,如果是(1)EE+E文法时,判断刚才出栈的第一个和第三个元素是否是常数,是
7、则push两个常数的和,否则push临时变量Tn;如果是(1)EE*E文法时,判断刚才出栈的第一个和第三个元素是否是常数,是则push两个常数的积,否则push临时变量Tn;(2)数据结构#include<stack> /*引入c+标准库*/stack<int> yuyi;/*语义栈*/string v1,v2,v3,v4;/*分别表示四元式的参数1,参数2,参数3,参数4*/(3)函数说明语义栈和四元式的产生是在语法分析一起的,在yffxSolve().void yffxSolve()stack<string> tempYuyiPush;showLR();
8、int i = -1;if (cfm = 6 | cfm = 7)i = 0;if (cfm = 8)i = 1;if (cfm = 10)i = 2;if (cfm = 14)i = 3;if (cfm = 15)i = 4;if (cfm = 16)i = 5;if (i = -1) cout << "输入了错误的种别编码" << endl;m+;return;if (actionstatus.top()i > 0)if (actionstatus.top()i > 100)if (actionstatus.top()i = 1000
9、)cout << "acc" << endl;system("pause");exit(0);/*规约*/cout << "gy" << endl;int s = actionstatus.top()i - 100;for (int j = 0; j < gyLens - 1; j+)if (s != 4)tempYuyiPush.push(yuyi.top();yuyi.pop();status.pop();sign.pop();status.push(actionstatus.
10、top()6);sign.push('E');if (s = 4)else v2 = tempYuyiPush.top();tempYuyiPush.pop();string v2plus5 = tempYuyiPush.top();tempYuyiPush.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
11、(strToInt(v2) * strToInt(v3);yuyi.push(v4);else if (v2 = "_" && isdigit(v2plus5) && v2 = "_")v4 = v2plus5;yuyi.push(v4);else string tempNum = intToStr(yuyiNum);string tempS = "T" + tempNum;yuyiNum+;yuyi.push(tempS);v4 = tempS;if (s = 1)v1 = "+"
12、if (s = 2)v1 = "*"else/*移近*/cout << "yj" << endl;status.push(actionstatus.top()i);sign.push(inputSigni);if (cfm = 6 | cfm = 7)if (cfm = 6)yuyi.push(value2m);else string tempVal = intToStr(value1m);yuyi.push(tempVal);else yuyi.push("_");m+;elseint err = actio
13、nstatus.top()i;cout << "第" << m << "个单词后" << showErrerr + 12<<endl;system("pause");exit(0);lrNum+;(4)流程图4.错误处理(1)数据结构string showErr12 = "FOUND ERROR: +前缺少变量或常量" ,/*0,e1*/ "FOUND ERROR: *前缺少变量或常量" ,/*1,e2*/ "FOUND ER
14、ROR: )前缺少对应(" ,/*2,e3*/ "FOUND ERROR: 连续的变量或常量,缺少+/*" ,/*3,e4*/ "FOUND ERROR: (前缺少+/*" ,/*4,e5*/ "FOUND ERROR: (后缺少常量或变量" ,/*5,e6*/ "FOUND ERROR: ()内无表达式" ,/*6,e7*/ "FOUND ERROR: +后缺少变量或常量" ,/*7,e8*/ "FOUND ERROR: *后缺少变量或常量" ,/*8,e9*/
15、"FOUND ERROR: 算数表达式为空" ,/*9,e10*/ "FOUND ERROR: 缺少对应)" ,/*10,e11*/ "FOUND ERROR: 语法分析错误" /*11,e12*/; (2)函数说明yffxSolve()中,查action数组时,遇到e时输出错误位置和错误信息,跳过此单词,继续进行语法分析.六、程序运行结果1.连乘2.连加3.加乘混合4.带括号5.常数6.错误的算术表达式1)缺少操作符2)缺少操作数3)不完整的()七、总结通过课程设计更加深入地理解了LR分析法对算数表达式处理的过程,熟悉了编译的四个阶
16、段:词法分析,语法分析,语义分析和中间代码,以及错误处理.在运用c+编写程序时,也熟悉了c+标准库中stack的使用.程序是一段一段写下来的,整个程序没有整体的规划,定义的变量又多又乱,造成许多变量需要不断的修改,而且不利于程序的理解.在对栈处理的时候,发现标准库定义的stack的函数太少,只有pop,push,empty,top,size,没有遍历,需要自己写.程序需要不断修改才能完成.检查时发现:显示错误处理时没有给出错误位置;当出现多个错误时,只能显示第一个错误.完整代码:#include <iostream>#include <string>#include &
17、lt;stack>#include <iomanip>#include <sstream>using namespace std;string str;/*源程序*/char character;/*源程序当前字符*/int p = -1;/*源程序游标*/string token = ""string blz5 = "while", "if", "else", "switch", "case" ;int c; /*标示符种类编码*/int le
18、ngth;/*输入源程序的长度*/int statue = 0;/*判断词法分析完成*/int cf50;/*词法分析后的种类编码数组*/int value150;/*cf对应常数*/string value250;/*cf对应变量名*/int q = 0;/*cf创建的游标*/int m = 0;/*cf语法分析的游标*/string blmb50;/*变量名表*/int a = 0;/*变量名表的游标*/string csb50;/*常数表*/int b = 0;/*常数表的游标*/static int action107 = 3, -12, -11, 2, -10, -3, 1 , -9
19、, 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, -9, 103, 103, -1 ;stack<int> status;stack<char
20、> sign;stack<string> yuyi;int lrNum = 0;/*分析表步骤号*/char inputSign7 = 'i', '+', '*', '(', ')', '#', 'E' ;/*进栈符号*/int gyLen4 = 3, 3, 3, 1 ;int yuyiNum = 1;/*语义临时变量序号*/string v1, v2, v3, v4;string showErr12 = "发现错误: +前缺少变量或常量" ,/
21、*0,e12*/ "发现错误: *前缺少变量或常量" ,/*1,e11*/ "发现错误: )前缺少对应(" ,/*2,e10*/ "发现错误: 连续的变量或常量,缺少+/*" ,/*3,e9*/ "发现错误: (前缺少+/*" ,/*4,e8*/ "发现错误: (后缺少常量或变量" ,/*5,e7*/ "发现错误: ()内无表达式" ,/*6,e6*/ "发现错误: +后缺少变量或常量" ,/*7,e5*/ "发现错误: *后缺少变量或常量&qu
22、ot; ,/*8,e4*/ "发现错误: 算数表达式为空" ,/*9,e3*/ "发现错误: 缺少对应)" ,/*10,e2*/ "发现错误: 语法分析错误" /*11,e1*/;void getonechar()/*if (p >= length)system("pause");exit(0);*/p+;while (strp = ' '&& strp + 1 = ' ')p+;character = (char)strp;void concatenation
23、()token += character;bool letter()if (character >= 'a' && character <= 'z') | (character >= 'A' && character <= 'Z')return true;elsereturn false;bool digit()if (character >= '0' && character <= '9')return true;
24、elsereturn false;int reserve()for (int i = 0; i < 5; i+)if (token = blzi)return i + 1;return 0;void retract()p-;/*变量名表*/void buildlist1(string token)int i;for (i = 0; i < a; i+)if (token = blmbi)break;if (i = a)blmba = token;a+;value2q = token;/*常数表*/void buildlist2(string token)int i;for (i =
25、 0; i < b; i+)if (token = csbi)break;if (i = b)csbb = token;b+;stringstream ss;ss << token;int num;ss >> num;value1q = num;void resolve()token = ""getonechar();switch (character)case 'a':case 'b':case 'c':case 'd':case 'e':case 'f&
26、#39;:case 'g':case 'h':case 'i':case 'j':case 'k':case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':case 's':case 't':case 'u':case 'v':case 'w':case &
27、#39;x':case 'y':case 'z':while (letter() | digit()concatenation();getonechar();retract();c = reserve();if (c = 0)buildlist1(token);cout << "(6, " << token << ")" << endl;cfq = 6;q+;elsecout << "(" << c << &qu
28、ot;, " << blzc - 1 << ")" << endl;cfq = c;q+;break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':while (digit()concatenation();getonechar();ret
29、ract();buildlist2(token);cfq = 7;q+;cout << "(7, " << token << ")" << endl;break;case '+':cfq = 8;q+;cout << "(8, +)" << endl;break;case '-':cfq = 9;q+;cout << "(9, -)" << endl;break;case '(
30、39;:cfq = 14;q+;cout << "(14, ()" << endl;break;case ')':cfq = 15;q+;cout << "(15, )" << endl;break;case '*':cfq = 10;q+;cout << "(10, *)" << endl;break;case '<':getonechar();if (character = '=')cfq
31、= 11;q+;cout << "(11, LE)" << endl;elseretract();cfq = 11;q+;cout << "(11, LT)" << endl;break;case '=':getonechar();if (character = '=')cfq = 11;q+;cout << "(11, EQ)" << endl;elseretract();cfq = 12;q+;cout << &qu
32、ot;(12, =)" << endl;break;case '':cfq = 12;q+;cout << "(13, ;)" << endl;break;case '#':cfq = 16;statue = 1;break;case '0':statue = 1;break;case ' ':break;default:cfq = 16;q+;cout << "词法分析 FOUND ERROR" << endl;brea
33、k;void cffx()cout << "请输入源程序:" << endl;statue = 0;getline(cin, str);cout << "*词法分析结果*" << endl;while (true)if (statue = 1)break;resolve();void initYffx()sign.push('#');status.push(0);yuyi.push("_");void showLR()/*栈遍历 先pop再push*/string tem
34、pSign;string tempStatus;string tempYuyi;string tempFour;stack<char> tempSi;stack<int> tempSt;stack<string> tempYu;int tempLen1 = sign.size();int tempLen2 = status.size();int tempLen3 = yuyi.size();for (int i = 0; i < tempLen1; i+)tempSign = tempSign + sign.top();tempSi.push(sign
35、.top();sign.pop();for (int i = 0; i < tempLen2; i+)tempStatus = tempStatus + (char)(status.top()+48);tempSt.push(status.top();status.pop();for (int i = 0; i < tempLen3; i+)tempYuyi = tempYuyi + yuyi.top();tempYu.push(yuyi.top();yuyi.pop();if (v1 = "")tempFour = ""else tempF
36、our = "(" + v1 + "," + v2 + "," + v3 + "," + v4 + ")"cout << setw(2) << lrNum << setw(15) << tempSign << setw(15) << tempStatus << setw(15) << tempYuyi << " " << setw(15) <<
37、tempFour << endl;for (int i = 0; i < tempLen1; i+)sign.push(tempSi.top();tempSi.pop();for (int i = 0; i < tempLen2; i+)status.push(tempSt.top();tempSt.pop();for (int i = 0; i < tempLen3; i+)yuyi.push(tempYu.top();tempYu.pop();v1 = ""bool isdigit(string str)for (int i = 0; i
38、< str.size(); i+)if (str.at(i) > '9') | (str.at(i) < '0')return false;return true;int strToInt(string str)stringstream s;s << str;int tempInt;s >> tempInt;return tempInt;string intToStr(int inter)stringstream s;s << inter;string tempStr;s >> tempStr;r
39、eturn tempStr;void yffxSolve()stack<string> tempYuyiPush;showLR();int i = -1;if (cfm = 6 | cfm = 7)i = 0;if (cfm = 8)i = 1;if (cfm = 10)i = 2;if (cfm = 14)i = 3;if (cfm = 15)i = 4;if (cfm = 16)i = 5;if (i = -1) cout << "输入了错误的种别编码" << endl;m+;return;if (actionstatus.top()
40、i > 0)if (actionstatus.top()i > 100)if (actionstatus.top()i = 1000)cout << "acc" << endl;system("pause");exit(0);/*规约*/cout << "gy" << endl;int s = actionstatus.top()i - 100;for (int j = 0; j < gyLens - 1; j+)if (s != 4)tempYuyiPush.push
41、(yuyi.top();yuyi.pop();status.pop();sign.pop();status.push(actionstatus.top()6);sign.push('E');if (s = 4)else v2 = tempYuyiPush.top();tempYuyiPush.pop();string v2plus5 = tempYuyiPush.top();tempYuyiPush.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 = "_&q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 队长工作计划模板5篇
- 废旧轮胎低温真空裂解无害化及资源化节能与环保示范项目可行性研究报告
- 产5万吨弹簧扁钢技改项目可行性研究报告
- 销售经理个人工作计划范文7篇
- 取水趸船建造合同范本
- 软件服务合同培训条款
- 散养牛场请人看管双方协议范文
- 高中数学教师学年度总结5篇
- 商务合同条款案例
- 大三学生学习计划范文(9篇)
- 三年级下册口算天天100题(A4打印版)
- 三基选择题(东南大学出版社)
- 2021年大唐集团招聘笔试试题及答案
- DBJ53/T-39-2020 云南省民用建筑节能设计标准
- 2022版义务教育数学课程标准解读课件PPT模板
- 实验五 PCR扩增课件
- 马拉松运动医疗支援培训课件
- 中医药宣传手册
- 不良资产处置尽职指引
- 人教部编版七年级历史上册第19课 北魏政治和北方民族大交融课件(23张PPT)
- 机械设备定期检查维修保养使用台账
评论
0/150
提交评论