计算机13-3班实验报告袁清高_第1页
计算机13-3班实验报告袁清高_第2页
计算机13-3班实验报告袁清高_第3页
计算机13-3班实验报告袁清高_第4页
计算机13-3班实验报告袁清高_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论