东北大学编译原理实验3x_第1页
东北大学编译原理实验3x_第2页
东北大学编译原理实验3x_第3页
东北大学编译原理实验3x_第4页
东北大学编译原理实验3x_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理程序设计实验报告四元式生成班级:计算机1507 班姓名:罗艺博学号: 20154377一、实验目标:利用上次实验所编写的语法分析器,完成算术表达式四元式翻译器的设计。二、实验内容:1.概要设计:2.流程图.2主程序 Z子程序 E子程序 T子程序 F3.关键函数.2/ 主程序int ParserPlus()is = 0;/ 初始化flag = 0;qt = qToken.front();qreal = qTreal.front();/Next(w)SubE();if(qt=50&flag=0)cout 语法正确! endl;cout endl;cout 生成的四元式如下: endl;el

2、se if(flag != 0)return 1;elseflag = 1;cout 语法错误 (err 1) ! endl;return flag;/coutmyQT.size=myQT.size()endl;for(int k=0;kmyQT.size();k+)/ 输出四元式myQTk.printQT();return 0;/ 子程序int SubE()ESubT();while(qt=60|qt=61)if(qt = 60)/GEQ(+)Nextword();SubT();char c = +;GEQ(c);else if(qt = 61)/GEQ(-)Nextword();SubT(

3、);char c = -;GEQ(c);return 0;/ 子程序 T int SubT()SubF();while(qt=70|qt=71)if(qt = 70)/GEQ(*)Nextword();SubF();char c = *;GEQ(c);else if(qt = 71)/GEQ(/)Nextword();SubF();char c = /;GEQ(c);return 0;/ 子程序 Fint SubF()qtw = qt/10;if(qtw=1|qtw=2)/ 为 i 的情况下sem.push(qt);qsem.push(qreal);Nextword();.2else if(q

4、tw = 3)/ 为 (的情况下Nextword();/coutqreal1endl;SubE();qtw = qt/10;/ 若无qtw 仍为 3/coutqreal2endl;/coutqt#qtwendl;if(qtw = 4)/ 若为 )Nextword();elseflag = 3;cout 语法错误 (err 3) ! endl;return flag;elseflag = 2;cout 语法错误 (err 2) ! endl;return flag;return 0;/ 创建临时变量int Newtemp()int i = 0;for(i=0; i100; i+)if(usedi

5、 = 0)usedi = i+1;return i;/ 返回 t 编号 i/ 生成四元式void GEQ(char c)string el2 = qsem.top();qsem.pop();sem.pop();string el1 = qsem.top();qsem.pop();sem.pop();int tt = Newtemp();sem.push(10);string treal = t;treal += to_string(tt);qsem.push(treal);Send(c, el1, el2, treal);/ 将四元式作为类对象储存void Send(char s, strin

6、g e1, string e2,string t)myQT.push_back(QT(s,e1,e2,t);源程序代码:(加入注释)int ParserPlus()/ 主程序is = 0;/ 初始化flag = 0;qt = qToken.front();/Next(w)qreal = qTreal.front();SubE();if(qt=50&flag=0)cout 语法正确! endl;cout endl;cout 生成的四元式如下: endl;else if(flag != 0)return 1;elseflag = 1;cout 语法错误 (err 1) ! endl;return

7、flag;.2/coutmyQT.size=myQT.size()endl;for(int k=0;kmyQT.size();k+)/ 输出四元式myQTk.printQT();return 0;int SubE()/ 子程序ESubT();while(qt=60|qt=61)if(qt = 60)/GEQ(+)Nextword();SubT();char c = +;GEQ(c);else if(qt = 61)/GEQ(-)Nextword();SubT();char c = -;GEQ(c);return 0;int SubT()/ 子程序TSubF();while(qt=70|qt=7

8、1)if(qt = 70)/GEQ(*)Nextword();SubF();char c = *;GEQ(c);else if(qt = 71)/GEQ(/)Nextword();SubF();char c = /;GEQ(c);return 0;int SubF()/ 子程序 Fqtw = qt/10;if(qtw=1|qtw=2)/ 为 i 的情况下sem.push(qt);qsem.push(qreal);Nextword();else if(qtw = 3)/ 为 (的情况下Nextword();/coutqreal1endl;SubE();qtw = qt/10;/ 若无qtw 仍为

9、 3/coutqreal2endl;/coutqt#qtwendl;if(qtw = 4)/ 若为 )Nextword();elseflag = 3;cout 语法错误 (err 3) ! endl;return flag;elseflag = 2;cout 语法错误 (err 2) ! endl;.2return flag;return 0;void Nextword()/NEXT(w)qToken.pop();qt = qToken.front();qTreal.pop();/cout!qTreal.size()endl;qreal = qTreal.front();#include #i

10、nclude #include #include #include #include using namespace std;char ch;/ 当前字符int is;/ 处理到当前字符串第几个int it;/token串第几个char str100;/ 输入字符串char token5;/ 用于生成 tokenint state;/ 词法分析 此状态int statebefore;/ 词法分析 前状态int code;int code1;int code2;int qt;/ 语法分析 存放当前 token(word)string qreal;/ 四元式用int qtw;/ 判断 qt 属于哪

11、种字符int flag;/ 用于存放语法错误原因int lexer;/ 存放 Lexer 函数的返回值int parser;/ 存放 Parser 函数的返回值int used50 = 0;/ 存放临时变量char *PT02 = +, -;char *PT12 = *, /;char *PT21 = (;char *PT31 = );char *PT41 = #;queue qToken;queue qTreal;/ 四元式用存放真正的字符stack sem;/ 语义栈stack qsem;/ 四元式用存放真正的字符int IsAlpha(char c);/ 判断是否为字母int IsNum

12、(char c);/ 判断是否为数字int IsPT0(char c);/ 判断是否为+ ,-int IsPT1(char c);/ 判断是否为*,/int state_change(int sta, char c);int state_to_code(int stabe, char* tok);void Nextword();/NEXT(w)void GEQ(char c);/ 生成四元式void Send(char s, string e1, string e2,string t);/ 存四元式int SubE();/ 子程序 Eint SubT();/ 子程序 Tint SubF();/

13、 子程序 Fint Lexer();/ 词法分析器int ParserPlus();/ 语法分析器改进版class QTpublic :QT(chars,stringe1,stringe2,stringt):symbol(s),element1(e1),element2(e2),ttemporary(t)/ 设置四元式QT()void printQT()/ 打印四元式cout(symbolelement1element2ttemporary )endl;private:char symbol;/ 符号变量 1 变量 2 临时变量string element1;string element2;s

14、tring ttemporary;vector myQT;/ 将类对象放入向量,便于储存和最后的输出int main().2cout 请输入算术表达式,以 # 号结束。 str;lexer = Lexer();/cout!strendl;/coutqToken.size()endl;/cout lexer endl;if(lexer = 0)cout endl;cout 语法分析如下: endl;parser = ParserPlus();return 0;/ 词法分析部分int Lexer()is = 0;it = 0;state = 1;cout endl;cout 词法分析如下: end

15、l;doch = stris;statebefore = state;state = state_change(state, ch);if(state = -1)cout 词法错误,请检查! endl;memset(token,0,5);it = 0;state = 1;return 1;else if(state != 0)tokenit+ = ch;elseif(statebefore != 1)string s = token;qTreal.push(s);state_to_code(statebefore, token);memset(token,0,5);it = 0;state =

16、 1;/is+;while(ch != #);qTreal.push(#);qToken.push(50);/加入#return0;int state_change(int sta, char c)if(c = ) | (c = t) | (c = n)is+;return 0;if(IsNum(ch) = 1)if(sta = 1)is+;return 2;else if(sta = 2)is+;return 2;else if(sta = 3)is+;return 3;else if(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;else.2

17、is+;return -1;else if(IsAlpha(c) = 1)if(sta = 1)is+;return 4;else if(sta = 4)is+;return 4;else if(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c=+|c=-)if(sta = 1)is+;return 5;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;

18、else if(c=*|c=/)if(sta = 1)is+;return 6;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = ()if(sta = 1)is+;return 7;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = )if(sta = 1)is+;

19、return 8;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = #)if(sta = 1).2is+;return 9;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = .)if(sta = 2)is+;return 3;elseis+;return -1;e

20、lseis+;return -1;int state_to_code(int stabe, char* tok)int j;code = 0;/ 循环用code1 = 0;code2 = 0;switch(stabe)case 2:code1 = 2;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 3:code1 = 2;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 4:code1 = 1;code = c

21、ode1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 5:code1 = 6;for(j=0; j2; j+)if(strcmp(tok,PT0j)=0)code2 = j;break;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 6:code1 = 7;for(j=0; j2; j+)if(strcmp(tok,PT1j)=0)code2 = j;break;code = code1*10+code2;coutcode1 co

22、de2endl;qToken.push(code);break;case 7:code1 = 3;.2code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 8:code1 = 4;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 9:code1 = 5;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;default:cout 没有你输

23、入的字符!=a)&(c=A)&(c=0&c=9)return 1;elsereturn 0;int IsPT0(char *c)int n;for(n=0; n2; n+)if(strcmp(c, PT0n) = 0)return 1;return 0;int IsPT1(char *c)int n;for(n=0; n2; n+)if(strcmp(c, PT1n) = 0)return 1;return 0;/ 语法分析部分 (递归下降子程序 )int ParserPlus()/ 主程序is = 0;/ 初始化flag = 0;qt = qToken.front();/Next(w)qre

24、al = qTreal.front();SubE();if(qt=50&flag=0)cout 语法正确! endl;cout endl;cout 生成的四元式如下: endl;else if(flag != 0)return 1;elseflag = 1;cout 语法错误 (err 1) ! endl;return flag;.2/coutmyQT.size=myQT.size()endl;for(int k=0;kmyQT.size();k+)/ 输出四元式myQTk.printQT();return 0;int SubE()/ 子程序ESubT();while(qt=60|qt=61)

25、if(qt = 60)/GEQ(+)Nextword();SubT();char c = +;GEQ(c);else if(qt = 61)/GEQ(-)Nextword();SubT();char c = -;GEQ(c);return 0;int SubT()/ 子程序TSubF();while(qt=70|qt=71)if(qt = 70)/GEQ(*)Nextword();SubF();char c = *;GEQ(c);else if(qt = 71)/GEQ(/)Nextword();SubF();char c = /;GEQ(c);return 0;int SubF()/ 子程序 Fqtw = qt/10;if(qtw=1|qtw=2)/ 为 i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论