




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学编译原理课程设计目录1 问题域描述.32 文法及属性文法的描述.32.1 WHILE循环语句的文法.32.2 WHILE循环语句的属性文法.43 语法分析方法及中间代码形式的描述.43.1语法分析方法.43.2中间代码形式描述.64 编译系统的概要设计.74.1词法分析.74.2语法制导翻译.85 详细的算法描述.85.1 文法设计.85.2 算法描述.85.3 源程序代码.96 软件的调试过程和结果测试.196.1调试过程.196.2结果测试.197 使用说明.208 课设总结.209 参考文献.22WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)1 问题域描述 while循环语句的翻译程序设计(简单优先法,输出单地址表示),要求完成:(1) 用C+语言正确编写程序,完成WHILE循环语句的翻译程序设计。(2) 求能正确进行词法分析,语法分析,并能正确的输出预期结果。(3) 根据指定的文法,判定程序的正确性。本次课程设计中要求设计一个WHILE循环语句的词法语法及语义分析程序,语法分析选择简单优先法,采用语法制导翻译输出中间代码三元式。通过设计、编制、调试一个 WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现功能。while循环语句的格式为:while(P)do A,其中A为循环体,可为一个或多个赋值语句;P为循环控制条件。while循环语句首先根据循环控制条件P进行判断,若满足条件则执行循环体A,否则执行下面的程序段;本次课程设计中系统首先要进行词法分析,即从左到右把源文件的字符序列逐个进行扫描,产生一个个的单词序列,作为语法分析的输入从而继续编译过程。该程序的语法分析读入词法分析的结果,并判断输入语句是否满足while循环语句的文法所描述的形式。通过简单优先法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。在语法分析的同时进行语义分析,最后输出三元式的代码。2 文法及属性文法的描述2.1WHILE循环语句的文法定义一个文法,文法G(S)如下:S- while(P)A; A-id=E; E-TE E-+TE | -TE | e T-FT T-*FT | /FT | e F-(E) | id P-E rop idrop- | = | Y 表示X的优先性比Y的优先性大 X ( b c ) # */* S */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 1 ,/* w/ N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* h*/ N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* i/ N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, -1, N, N ,/* l/ N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* e */ N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N , /* E*/ N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* d*/ N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* o*/ N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N ,/* A/ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N ,/*/ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N ,/* a */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, 0, N, N, N, N, N ,/* = */ N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N ,/* + */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N ,/* 1 */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N ,/* ; */ N, N, N, N, N, 1, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N ,/* ( */ N, N, N, N, N, N, N, N, N, N, N, 0, -1, N, N, N, N, N, N, N, N, N, N ,/* b */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 1, N ,/* c */ N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N ,/* ) */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 1 ,/* # */ -1, -1, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0 ;其中N表示的是没有优先关系, -1表示优先级小于,0表示优先级相同,1表示优先级大于3.2中间代码形式描述3.2.1三元式三元式是一种普遍采用的中间代码形式。它由三个部分组成:算符op,第一和第二运算对象ARG1和ARG2。运算对象有时候指用户自己定义的变量。3.2.2赋值语句的四元式对c=a+1翻译结果如下 1)(+,a,1)2),(=, c, (1))3.2.3 while(ab)语句翻译为方便和直观,将while语句翻译为if a b goto do.addr4 编译系统的概要设计本程序开始,需先对输入字符串进行词法分析,将其识别为一个个独立的单词序列,得到的字符单词要和关键字比较,看是否是关键字,根据比较结果进行返回相应的单词类型。单词类型主要包括标识符,关键字,常量,运算符和分界符。在语法分析程序中,根据词法分析得到的结果,进行判断是否是当前需要的单词类型,如果不是就说明输入字符串不能由该文法推导出来;如果是当前需要的类型,就相应得做该单词类型分支程序。根据简单优先法分析的字符串,看是否能得到接受状态。此外,在进行语法分析的同时进行语义分析,审查程序有无语义错误,每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。在进行了上述的语法分析和语义分析阶段的工作之后,将源文件变成三元式表示。 源程序目录下建立“input.txt”文本文档,在文档中输入while(P)A格式的WHILE语句,再通过调用程序中的get_word(string word)函数进行对文本文档中语句的读取操作。4.1词法分析词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个单词序列,用于语法分析。编程中,建立操作数栈和运算符栈,设定运算符优先级。对于读取的字符进行判定,若是运算符,就与栈顶符号比较优先级,高则入栈,否则栈内运算符出栈;若是非运算符,则送入操作数栈。4.2语法制导翻译在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。5 详细的算法描述5.1 文法设计为顺利完成本次课程设计,实现要求的功能,设计测试文法G(S)如下:S- while(P) A; A-id=E; E-TE E-+TE | -TE | e T-FT T-*FT | /FT | e F-(E) | id P-E rop idrop- | = | | = | (E) | idvoid extend_T(word_node *&p) /T-*FT | /FT | evoid T(word_node *&p) /T-FTvoid extend_E(word_node *&p) /E-+TE | -TE | evoid E(word_node *&p) /E-TEvoid P(word_node *&p) /P-E rop bvoid A(word_node *&p) /A-id=E;bool S(word_node *&p) / while(p) doA; 5.3 源程序如下 #includeStack.h /定义栈,便于归约时运用。#include#include /文件输入#include using namespace std;#define norw 13 /关键字的个数#define nmax 14 /数字的最大位数#define al 10 /符号的最大长度#define N -10 #define getchdo if(getch()=-1)return -1#define getsymdo if(getsym()=-1)return -1ifstream *fin;SeqStack Sym,Opt,Opr;char *p,ch;char str20; char inputstr100; /保存从文件读入的所有字符char buf520;int count1=0,count2=0;int ip=0,row,line;enum symbol sym; /当前的符号int num; /当前numberchar aal+1; /临时符号char idal+1; /当前identchar wordnorwal; /保留字enum symbol wsymnorw; /关键字的符号值enum symbol ssym256; /单字符的符号值 enum symbol nul,ident,number,plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, lbrace, rbrace, comma, semicolon, period, becomes, beginsym, endsym, ifsym, elsesym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym ,greater, less; void ThreeAddr();void init()/设置单字符符号for(int i=0;i =greater; ssym while(E) do B/0; B-d=C;0,C-A+A0, C-A-A0,C-A*A0,C-A/A0,C-A0, E-AA0, E-AA=A0,E-A0,A-d0,; /文法int getch()if(fin-get(ch)if(ch!= & ch!=9 & ch!=10)inputstrip=ch; ip+; cout=a&ch=z)k=0;doif(k=a&ch=0&ch=9);ak=0;strcpy(id,a);i=0;j=norw-1;do /搜索当前符号是否为保留字k=(i+j)/2;if(strcmp(id,wordk)=0)i=k+1;while(ij)sym=wsymk;elsesym=ident; /搜索失败,则是名字或数字elseif(ch=0&ch=0&chnmax)couterror:too large number!endl;else if(ch=) /检测赋值符号sym=becomes;getchdo;elseif(ch=) /检测大于或大于等于符号getchdo;if(ch=)sym=geq;getchdo;elsesym=gtr;elsesym=ssymch;if(sym!=period)getchdo;return 0;/优先关系模块/定义优先关系int PreTable2323 =/* S w h i l e E d o B a = + 1 ; ( b c ) # */* S */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 1 ,/* w/ N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* h*/ N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* i/ N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, -1, N, N ,/* l/ N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* e */ N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N , /* E*/ N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* d*/ N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* o*/ N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N, N, N ,/* A/ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N ,/*/ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N ,/* a */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, 0, N, N, N, N, N ,/* = */ N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N, N ,/* + */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N ,/* 1 */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N ,/* ; */ N, N, N, N, N, 1, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N ,/* */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N ,/* ( */ N, N, N, N, N, N, N, N, N, N, N, 0, -1, N, N, N, N, N, N, N, N, N, N ,/* b */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 1, N ,/* c */ N, N, N, N, N, N, N, N, N, N, N, N, N, 0, N, N, N, N, N, N, N, N, N ,/* ) */ N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 1 ,/* # */ -1, -1, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, 0 ;int Compare(char m,char n)/定义矩阵switch (m)case S: row=0;break;case w: row=1;break;case h: row=2;break; case i row=3;break;case l: row=4;break;case e: row=5;break;case E: row=6;break;case d: row=7;break;case o row=8;break;case : row=9;break;case A: row=10;break;case : row=11;break;case a: row=12;break;case =: row=13;break;case +: row=14;break; case 1: row=15;break; case ;: row=16;break; case : row=17;break;case (: row=18;break;case b: row=19;break;case c: row=20;break;case ): row=21;break;case #: row=22;break;default: return -100;break;switch (n)case S: line=0;break;case w: line=1;break;case h: line=2;break; case i line=3;break;case l: line=4;break;case e: line=5;break;case E: line=6;break;case d: line=7;break;case o: line=8;break;case : line=9;break;case A: line=10;break;case : line=11;break;case a: line=12;break;case =: line=13;break;case +: line=14;break; case 1: line=15;break;case ;: line=16;break; case : line=17;break;case (: line=18;break;case b: line=19;break;case c: line=20;break;case ): line=21;break;case #: line=22;break;default: return -100;break; return PreTablerowline;void Error()/规约不成功 cout归约失败,语法有错误!endl;void Succeed()/规约成功 cout归约成功,语法正确.endl;char Reduce(char c) /将终极符或非终极符规约为非终极符 if (c = d) return S; else if (c = c ) return B; else if (c = a) return E; else return NULL;void Parse()/简单优先语法分析 char c; /保存栈顶元素 char t1; /规约时判断是否规约的栈顶元素char t2; /规约时判断是否规约的次栈顶元素cout归约过程如下:endl;Sym.Push(#); while (*p!=0) c=Sym.TopValue(); if (c=S)/如果栈顶为S或#,规约成功 Succeed(); cout语法分析完成!nendl; cout三地址码如下所示:endl; ThreeAddr(); coutendl; return; else switch (Compare(c, *p) /如果优先符是小于或等于则压栈,否则进栈 case -1: case 0: Sym.Push(*p);/压栈 Sym.PrintStack(); p+; break; case 1: do t1 = Sym.TopValue();bufcount10=0;bufcount1count2=t1;count2+; t2 = Sym.NextTop(); Sym.Pop(c);/栈顶出栈 while(Compare(t2, t1) != -1); count1+; t1 = Reduce(t1); Sym.Push(t1); Sym.PrintStack(); break; default: Error(); cout语法分析完成!n; coutendl; return; void ThreeAddr() /产生并输出三地址码int m=0,nextstat=100;char op1,op2,opt,c;for(int i=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年江西中考数学试卷真题答案解读及备考指导
- 高中化学课程中校园植物化学成分分析与应用研究论文
- 小学生网络互动游戏对认知发展影响分析论文
- 高中语文课程思政教育中的历史教育价值挖掘与传承论文
- 中国医药级酮咯酸氨丁三醇行业市场前景预测及投资价值评估分析报告
- 节电方案与管理制度
- 英文版公司管理制度
- 电工学试题集和试题集及答案
- 小学语文《夜色》课件
- 财务管理学自考历年真题
- 反对自由主义-全文-原文
- 胃十二指肠溃疡瘢痕性幽门梗阻病因介绍
- 元宇宙期刊产业政策-洞察分析
- 【MOOC】中国艺术歌曲演唱与赏析-江西财经大学 中国大学慕课MOOC答案
- 【MOOC】运输包装-暨南大学 中国大学慕课MOOC答案
- 2024ESC心房颤动管理指南解读
- 行政伦理学-终结性考核-国开(SC)-参考资料
- 清算结算效率提升
- 医院安保服务实施方案
- 广东省广州市海珠区2023-2024学年六年级下学期期末考试英语试卷
- 国家专项资金管理办法
评论
0/150
提交评论