版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编 译原理实验专业:计算机科学与技术学号:2013211707姓名:袁指导老师:完成时间:2015 年 6 月 14 日实验一 词法分析设计一、 实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整和清楚的理解,并且能够正确和熟练地运用。二、 实验环境Windows 8.1Visual Studio 013三、 实验原理1、 实验数据结构keyt序号string内容row列line行lexstring instring输入源程序的单词缓存lengthToken输出缓存的长度ley outToken100输出缓存数
2、组string k7关键字数组char s6分界符数组char optr6操作符数组lengthKey关键字数组长度lengthS分界符数组长度lengthOptr关键字数组长度lex()构造函数lex()析构函数bool isKey(string str)判断是否为关键字bool isLetter(char c)判断是否为字母bool isDigit(char c)判断是否为数字bool isOptr(char c)判断是否为运算符bool isSeparator(char c)判断是否为分界符2、 实验算法描述四、 实验结果void push_back(t,line,row,string
3、st)输出缓冲区bool isSpace(char c)判断是否为空白void la()词法分析函数五、 实验总结1、 本次实验实现了简单的词法分析,但是由于比较简单,很多方面都没有考虑到,用途较为局限2、 由于以前写MFC 程序比较少,所以这次需要花很大的工夫学习MFC。实验二 LL(1)分析法一、 实验目的通过完成分析法的语法分析程序,了解分析法和递归子程序的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力二、 实验环境Windows 8.1Visual Studio 0
4、13三、 实验原理1、 实验数据结构#define arrayLength 20数组长度#define stackLength 20栈的长度Tokenstep步数string stackString栈中字符串string leftString剩余字符串string production所用产生式string movement动作stackcount栈中元素个数char datastacklength栈中元素stack()构造函数stack()析构函数bool isEmpty()判断是否为空bool isFull()判断是否慢bool getTop(char & c)取栈顶元素bool push
5、(char c)存入栈bool pop()出栈string out()返回栈中元素vector vt存放输出缓存string strToken存放规约表达式2、 程序流程图Cllchar Vn5非终结符char Vt5终结符char ch当前字符char X获取栈顶元素string E8分析表string G8string T8string S8string F8Cll()构造函数Cll()析构函数bool isVt(char c)判断是否为终结符bool pr(poer)打印剩余字符串void saveToToken( step, string stackString, string lef
6、tString, string production,string movement)保存至输出缓存void run()LL(1)分析函数四、 实验结果五、 实验总结1、 本次实验实现了 LL(1)分析法,并对 i+i*i#进行了分析。2、 本实验窗口部分和实验一相同,所以这次实验在窗口部分花费了较少的时间。实验三 LR(1)分析法一、 实验目的构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号穿是否为该文法识别的句子,了解 LR(1)分析文法是严格的从左向右扫描,和自底向上的语法分析方法二、 实验环境Windows 8.1Visual Studio 2013三、 实验原理1、实验数
7、据结构2、程序流程图#define MaxLen 20栈的长度#define Length 20数组长度tokenstep步骤string susStack状态栈string symbolStack符号栈string inputString输入串string movement动作说明stackstack()构造函数stack()析构函数bool empty()判断是否为空bool full()判断是否满bool get_top(char& c)取栈顶元素bool push(char c)入栈bool pop()出栈string out()输出栈中元素string out1()输出符号栈char
8、 dataMaxLen栈中元素count栈中元素个数四、 实验结果五、 实验总结本次实验实现了 LR(1)分析程序,并利用它进行了语法分析。附:源代码实验一:#include stdafx.h#include lex.hlex:lex()k0 = do;k1 = while;k2 = end;k3 = for;k4 = prf;k5 = scanf;k6 = then;s0 = ,;s1 = ;s2 = ;s3 = ;s4 = (;s5 = );optr0 = +;optr1 = -;optr2 =*;optr3 = /;lengthKey = 7;lengthS = 6;lengthOptr
9、 = 4;lengthToken = 0;lex:lex()bool lex:isKey(string str)i;for (i = 0; i = a) & (c = A) & (c = 0&c = 9)return true;return false;bool lex:isOptr(char c)i;for (i = 0; i lengthOptr; i+)if (c = optri)return true;return false;bool lex:isSeparator(char c)i;for (i = 0; i lengthS; i+)if (c = si)return true;r
10、eturn false;void lex:push_back(t,line,row,string st)key keyTemp;keyTemp.t = t;keyTemp.line = line;keyTemp.row = row;keyTemp.str = st;outTokenlengthToken = keyTemp;lengthToken+;bool lex:isSpace(char c)if (c = t | c = |c=n)return true;return false;void lex:la()lengthToken = 0;string st = ;line = 1, ro
11、w = 0, c = 0,rowTemp=0;while (c instring.length()st = ;if (instringc = ) | (instringc = t) /空格或者水平制表c+;row+;else if (instringc = r) /换行c=c+2;line+;row = 0;else if (isOptr(instringc)/运算符st = instringc;c+;row+;if (isSpace(instringc) & c = instring.length()push_back(3, line, row, st);elsewhile (c instr
12、ing.length() & !isSpace(instringc)/错误& !isSeparator(instringc)st += instringc;c+;rowTemp+;push_back(7, line, row, st);row = row + rowTemp;rowTemp = 0;else if (isSeparator(instringc)/ 分隔符st = instringc;row+;push_back(2, line, row, st);c+;else if (isLetter(instringc) /识别字母st = instringc;c+;row+;while
13、(isLetter(instringc) | isDigit(instringc) /标识符st += instringc;c+;rowTemp+;/判断是否为关键字if (isKey(st)push_back(1, line, row, st);/标识符elsepush_back(6, line, row, st);row = row + rowTemp;rowTemp = 0;else if (isDigit(instringc)st = instringc;c+;row+;while (isDigit(instringc)st += instringc;c+;rowTemp+;if (i
14、sSpace(instringc) | isOptr(c) | isSeparator(c) & c /数字instring.length()push_back(5, line, row, st);elsewhile (c instring.length() & !isSpace(instringc)/错误& !isSeparator(instringc)st += instringc;c+;rowTemp+;push_back(7, line, row, st);row = row + rowTemp;rowTemp = 0;else if (instringc = =)st = instr
15、ingc;row+;push_back(4, line, row, st);c+;else if (instringc = )row+;st = instringc;c+;if (instringc = =)st += instringc;push_back(4, line, row, st);row+;c+;else push_back(4, line, row, st);elserow+;while (c instring.length() & !isSpace(instringc)/错误& !isSeparator(instringc)st += instringc;c+;rowTemp
16、+;push_back(7, line, row, st);row = row + rowTemp-1;rowTemp = 0;实验二#include stdafx.h#include Cll.h#includestack:stack()count = -1;stack:stack()bool stack:isEmpty()if (count = -1)return true;return false;bool stack:isFull()if (count = stackLength - 1)return true;return false;bool stack:getTop(char& c
17、)if (isEmpty()return false;c = dount;return true;bool stack:push(char c)if (isFull()return false;count+;dount = c;return true;bool stack:pop()if (isEmpty()return false;count-;return true;string stack:out()string str = ;for (i = 0; i = count; i+)str+=datai;return str;Cll:Cll()Vn0 = E;Vn1 = G;Vn2 = T;
18、Vn3 = S;Vn4 = F;Vt0 = i;Vt1 = (;Vt2 = );Vt3 = +;Vt4 = -;Vt5 = *;Vt6 = /;Vt7 = #;E0 = TG;E1 = TG;E2 = ERROR;E3 = ERROR;E4 = ERROR;E5 = ERROR;E6 = ERROR;E7 = ERROR;G0 = ERROR;G1 = ERROR;G2 = NULL;G3 = +TG;G4 = -TG;G5 = ERROR;G6 = ERROR;G7 = NULL;T0 = FS;T1 = FS;T2 = ERROR;T3 = ERROR;T4 = ERROR;T5 = ER
19、ROR;T6 = ERROR;T7 = ERROR;S0 = ERROR;S1 = ERROR;S2 = NULL;S3 = NULL;S4 = NULL;S5 = *FS;S6 = /FS;S7 = NULL;F0 = i;F1 = (E);F2 = ERROR;F3 = ERROR;F4 = ERROR;F5 = ERROR;F6 = ERROR;F7 = ERROR;Cll:Cll()bool Cll:isVt(char c)for (i = 0; i 8; i+)if (c = Vti)return true;return false;string Cll:pr(poer)string
20、 str = ;for (i = poer - 1; i strToken.length(); i+)str+=strTokeni;return str;void Cll:saveToToken(step, string stackString, string leftString, string production,string movement)Token t;t.step = step;t.stackString = stackString;t.leftString = leftString;duction = production;t.movement = movement
21、;vt.push_back(t);void Cll:run()std:stringstream ss;bool flag = true;step = 0, poer = 0; /步骤,指针len;string st;ch = strTokenpoer+;stack s;s.push(#);s.push(E);s.getTop(X);saveToToken(step, s.out(), pr(poer), ,初始化);step+;while (flag)if (isVt(X)/规约结束if (X = #)ss #, 结束);step+;s.pop();flag = false;else if (
22、X = ch) /终结符识别,进行下一字符规约s.pop();s.getTop(X);ch = strTokenpoer+;saveToToken(step, s.out(), pr(poer), , GENTNEXT(I);step+;elseflag = false;else if (X = Vn0) /Efor (i = 0; i X1X2 的产生式进行入栈操作s.pop();len = Ei.length() - 1;for (j = len; j = 0; j-)s.push(Eij);st += POP,PUSH(;for (j = len; j = 0; j-)st += Eij
23、;st += );ss +Ei, st);step+;s.getTop(X);st = ;else if (X = Vn1)/同上,处理Gfor (i = 0; i 8; i+)if (ch = Vti)if (Gi = NULL)s.pop();ss ,POP);step+;s.getTop(X);else if (Gi = ERROR)flag = false;elses.pop();len = Gi.length() - 1;for (j = len; j = 0; j-)s.push(Gij);st += POP,PUSH(;for (j = len; j = 0; j-)st+= G
24、ij;st += );ss +Gi, st);step+;s.getTop(X);st = ;else if (X = Vn2) /同上 处理 Tfor (i = 0; i = 0; j-)s.push(Tij);st += POP,PUSH(;for (j = len; j = 0; j-)st+= Tij;st+= ) ;ss +Ti, st);step+;s.getTop(X);st = ;else if (X = Vn3)/同上 处理 Sfor (i = 0; i8; i+)if (ch = Vti)if (Si = NULL)s.pop();ss ,POP);step+;s.getT
25、op(X);else if (Si = ERROR)flag = false;elses.pop();len = Si.length() - 1;for (j = len; j = 0; j-)s.push(Sij);st += POP,PUSH(;for (j = len; j = 0; j-)st+= Sij;st += );ss +Si, st);step+;s.getTop(X);st = ;else if (X = Vn4)/同上 处理 Ffor (i = 0; i= 0; j-)s.push(Fij);st += POP,PUSH(;for (j = len; j = 0; j-)
26、st+= Fij;st+=);ss +Fi, st);step+;s.getTop(X);st = ;else /出错处理flag = false;实验三#include stdafx.h#include Clr.h#include stack:stack() count = 0;bool stack:empty() const if (count = 0)return true;return false;bool stack:full() const if (count = MaxLen)return true;return false;bool stack:get_top(char &c)
27、const if (empty()return false;elsec = dount - 1;return true;bool stack:push(const char c) if (full()return false;dount+ = c;return true;bool stack:pop() if (empty()return false;count-;return true;string stack:out() string st = ;for (i = 0; icount; i+)st+=datai;return st;string stack:out1()string st
28、= ;stringstream ss;for (i = 0; i count; i+)ss ()datai;st += ss.str();ss.str();return st;Clr:Clr()Clr:Clr()void Clr:saveToToken(step, string susStack, string symbolStack, string inputString,string movement)token t;t.step = step;t.susStack = susStack;t.symbolStack = symbolStack;t.inputString = inputSt
29、ring;t.movement = movement;vt.push_back(t);string Clr:pr(i)string st = ;for (j = i; jstrToken.length(); j+)st+=strTokenj;return st;string Clr:GOTO(i, char c)if (i = 0)if (c = E)r.push(1);return ,GOTO(0,E)=1 入栈;else if (c = T)r.push(2);return ,GOTO(0,T)=2 入栈;else if (c = F)r.push(3);return ,GOTO(0,F)
30、=3 入栈;elseflag = false;else if (i = 4)if (c = E)r.push(8);return ,GOTO(4,E)=8 入栈;else if (c = T)r.push(2);return ,GOTO(4,T)=2 入栈;else if (c = F)r.push(3);return ,GOTO(4,F)=3 入栈;elseflag = false;return ;else if (i = 6)if (c = T)r.push(9);return ,GOTO(6,T)=9 入栈;else if (c = F)r.push(3);return ,GOTO(6,
31、F)=3 入栈;elseflag = false;return ;else if (i = 7)if (c = F)r.push(10);return ,GOTO(7,F)=10 入栈;elseflag = false;return ;elseflag = false;return ;void Clr:Action0()if (ch = i)/下一个操作符为 i ,移进(po- 1), ACTION0,i=S5,状态 5 入saveToToken(step, r.out1(), l.out(), pr栈);step+;r.push(5);l.push(ch);ch = strTokenpo+;
32、else if (ch = ()/下一个操作符为( ,移进(po- 1), ACTION0,(=S4,状态 4 入saveToToken(step, r.out1(), l.out(), pr栈);step+;r.push(4);l.push(ch);ch = strTokenpo+;elseflag = false;void Clr:Action1()if (ch = +)/下一个操作符为 i ,移进(po- 1), ACTION1,+=S6,状态 6saveToToken(step, r.out1(), l.out(), pr入栈);step+;r.push(6);l.push(ch);c
33、h = strTokenpo+;else if (ch = #)/分析成功flag = false;(po- 1), Acc:分析成功);saveToToken(step, r.out1(), l.out(), prstep+;elseflag = false;void Clr:Action2()if (ch = *)/下一个操作符为* ,移进saveToToken(step, r.out1(), l.out(), pr(po- 1), ACTION2,*=S7,状态 7入栈);step+;r.push(7);l.push(ch);ch = strTokenpo+;else if (ch =
34、+) | (ch = ) | (ch = #)/下一个操作符为+,),#规约saveToToken(step, r.out1(), l.out(), pr(po- 1), r2: ET 归约);step+;l.pop();l.push(E);r.pop();r.get_top(Y);vtvt.size() - 1.movement+=GOTO(Y), E);elseflag = false;void Clr:Action3()if (ch = +) | (ch = *) | (ch = ) | (ch = #)/下一个操作符为+,*,),#规约saveToToken(step, r.out1(
35、), l.out(), pr(po- 1), r4: TF 归约);step+;l.pop();l.push(T);r.pop();r.get_top(Y);vtvt.size() - 1.movement += GOTO(Y), T);elseflag = false;void Clr:Action4_6_7(x)if (ch = i)/下一个操作符为 i ,移进string str;stringstream ss;str=ACTION;ss x;str += ss.str();ss.str();str+=,i=S5,状态 5 入栈;saveToToken(step, r.out1(), l
36、.out(), pr(po- 1), str);step+;r.push(5);l.push(ch);ch = strTokenpo+;else if (ch = ()/下一个操作符为( ,移进string str;stringstream ss;str = ACTION;ss x;str += ss.str();ss.str();str += ,i=S4,状态 4 入栈;saveToToken(step, r.out1(), l.out(), pr(po- 1), str);step+;r.push(4);l.push(ch);ch = strTokenpo+;elseflag = fals
37、e;void Clr:Action5()if (ch = +) | (ch = *) | (ch = ) | (ch = #)/下一个操作符为+,*,),#规约saveToToken(step, r.out1(), l.out(), pr(po- 1), r6: Fi 归约);step+;l.pop();l.push(F);r.pop();r.get_top(Y);vtvt.size() - 1.movement += GOTO(Y), F);elseflag = false;void Clr:Action8()if (ch = +)/下一个操作符为+ ,移进- 1), ACTI N8,+=S
38、6,状态 6saveToToken(step, r.out1(), l.out(), pr(po入栈);step+;r.push(6);l.push(ch);ch = strTokenpo+;else if (ch = )/下一个操作符为) ,移进- 1), ACTION8,)=S11,状态 11saveToToken(step, r.out1(), l.out(), pr(po入栈);step+;r.push(11);l.push(ch);ch = strTokenpo+;elseflag = false;void Clr:Action9()if (ch = *)/下一个操作符为* ,移进- 1), ACTION9,*=S7,状态 7saveToToken(step,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度国际文化交流项目志愿者聘用合同
- 2025版民宿民宿餐饮服务合同示范4篇
- 2025年度房地产公司股权转让与市场推广合同
- 2025年度个人车位租赁服务合同范本2篇
- 2025年度沐足行业员工劳动合同模板(含保密协议)4篇
- 林绵绵《韩娱离婚协议》2025年度网络剧改编权转让合同8篇
- 二零二五年度个人现金借款合同标准版2篇
- 二零二五年度农产品品牌授权使用合同8篇
- 二零二五年度农家乐乡村旅游扶贫项目合作合同4篇
- 二零二五年度文化旅游产业投资借款合同大全4篇
- 2022年中国电信维护岗位认证动力专业考试题库大全-上(单选、多选题)
- 纪委办案安全培训课件
- 超市连锁行业招商策划
- 医药高等数学智慧树知到课后章节答案2023年下浙江中医药大学
- 城市道路智慧路灯项目 投标方案(技术标)
- 初中英语-Unit2 My dream job(writing)教学设计学情分析教材分析课后反思
- 【公司利润质量研究国内外文献综述3400字】
- 工行全国地区码
- 新疆2022年中考物理试卷及答案
- 地暖工程监理实施细则
- 顶部板式吊耳计算HGT-20574-2018
评论
0/150
提交评论