ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:239.37KB ,
资源ID:7553116      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7553116.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理课程设计ifelse条件语句翻译三地址简单优先法 1.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理课程设计ifelse条件语句翻译三地址简单优先法 1.docx

1、编译原理课程设计ifelse条件语句翻译三地址简单优先法 1课程设计任务书题目: IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。(2)完成题目要求的中间代码三地址表示的描述。(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

2、(5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试及测试。周5:撰写课程设计报告。设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。设计报告

3、书收取时间:设计周的次周星期一上午10点。指导教师签名: 2013年 月 日系主任(或责任教师)签名: 2013年 月 日 IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)1 系统描述 1.1题目IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)1.2目的通过设计、编制、调试一个条件语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。1.3设计内容及步骤对条件语句: IF 布尔表达式 THEN 赋值语句 ELSE 赋值语句(1) 按给定的题目写出符合语法分析方法要求的文法和属性文法描述。(2) 按给定的题目给

4、出语法分析方法的思想及分析表设计。(3) 按给定的题目给出中间代码序列的结构设计。(4) 完成相应的词法分析、语法分析和语义分析程序设计。(5) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。2 文法及属性文法的描述2.1文法文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序。IF-ELSE条件语句的文法GS如下所示:(1) S - CM(2) S - TM(3) M - begin L end(4) C - if B

5、 then(5) T - C M else其中非终结符B为布尔表达式,其文法GB如下:(1) B - B1 or B2(2) B - B1 and B2(3) B - not B1(4) B - ( B1 )(5) B - id1 rop id2(6) B - true(7) B - false而在文法GS中非终结符L表示赋值语句块,其文法GL如下:(1) L - L1 A ;(2) L - A;(3) A - id = M(4) M - E(5) E - E1 + E2(6) E - E1 * E2(7) E - -E1(8) E - ( E1 )(9) E - id 2.2属性文法属性文法

6、是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。 在一个属性文法中,对应于每个产生式Aa都有一套与之相关联的语义规则,每规则的形式为:b:=f(c1,c2,,ck)其中f是一个函数,而且或者b是A的一个综合属性并且c1,c2,,ck是产生式右边文法符号的属性或者非终结符既可有综合属性也可有继属性,文法开始符号的所有继承属性作为属性计算前的初始值1。2.2.1 语义变量和语义动作说明 对于文法GL,首先对id表示的单词定义一属性id.name,用做语义变量,用Lookup(id.name)语义函数审查id.name是否出现在符号表中,

7、如在,则返回一指向该登陆项的指针,否则返回nil。语义过程emit表示输出四元是到输出文件上。语义过程newtmp表示生产一临时变量,每调用一次,生成一新的临时变量。语义变量E.place,表示存放E值的变量名在符号表的登陆项或一整数码(若此变量时一个临时变量)2,2.2.1 给出了翻译赋值语句块到三地址的语义描述。 2.2.1 GS的属性文法为:(1) S - CM S.chain := merge(C.chain,M.chain) (2) S - TM S.chain := merge(T.chain,M.chain) (3) M - begin L end M.chain := L.ch

8、ain(4) C - if B then bakpatch(B.true,nextstat) C.chain := B.false(5) T - C M else q := nextstat emit(GOTO-) backpatch(C.chain,nextstat) T.chain := merge(M.chain,q)2.2.2 GB的属性文法为:(1) B - B1 or B2 backpatch(B1.false,B2.codebgin); B.codebegin := B1.codebegin; B.true := merge(B1.true,B2.true); B.false :

9、= B2.false(2) B - B1 and B2 backpatch(B1.true,B2.codebegin); B.codebegin := B1.codebegin; B.true := B2.true; B.false := merge(B1.false,B2.false);(3) B - not B1 B.true := B1.false; B.codebegin := B1.codebegin; B.false := B1.true;(4) B - ( B1 ) B.true := B1.true; B.codebegin := B1.codebegin; B.false :

10、= B1.false;(5) B - id1 rop id2 B.true := nextstat; B.codebegin := nextstat; B.false := nextstat+1; emit(ifid1.placeropid2.placegoto-); emit(goto-) (6) B - true B.true := nextstat; B.codebegin := nextstat; emit(goto-)(7) B - false B.false := nextstat; B.codebegin := nextstat; emit(goto-) 其中nextstat给出

11、在输出序列中下一三地址式子的序号。emit过程没调用一次,nextstat增加12.2.3 GL的属性文法为:(1) L - L1 A ; L.chain := A.chain(2) L - A; L.chain := A.chain(3) A - id := M p := lookup(id.name); if p nil then emit(p := E.place); else error(4) M - E (5) E - E1 + E2 E.place := newtemp; emit(E.place :=E1.place + E2.place)(6) E - E1 * E2 E.pl

12、ace := newtemp; emit(E.place := E1.place * E2.palce)(7) E - -E1 E.palce := newtemp; emit(E.place := minusE1.place)(8) E - ( E1 ) E.place := E1.place (9) E - id (6)A-num p := lookup(id.name); if p nil then E.palce := p else error3 语法分析方法描述及语法分析表设计3.1简单优先法的定义构造及优缺点3.1.1简单优先法定义构造一个文法G,若它不含产生式,也不含任何右部相同

13、的不同产生式,并且它的任何符号对(X,Y),或者没有关系,或者存在下述三种关系:=、之一,则称该文法是一个简单优先文法。 A)X=Y当且仅当G中含有形如PXY的产生式 B)XY当且仅当Y为G的终结符,G中含有形如PQR的产生式,其中Q,R为非终结符,且Q X,YFirst(R)D)对任何X,若文法开始符号SX,则#。33.1.2简单优先法的优缺点优点:准确、规范,技术简单。缺点:适用的范围小,构造的分析表太大,分析效率较低。3.2语法分析为实现简单优先算法,可以使用工作栈.用以寄存操作数或运算结果.算法的基本思想是: (1) 置初始状态:S(1):=#, i:=1, j:=1(2) 若 S(i

14、)与T(j)无任何关系,则出错停机(3) 若 S(i)= T(j)或S(i)T(j),则把T(j)送入S栈中,读下一符,转(2)。(4) 若S(i)T(j),则从S栈顶开始往前栈串Sj1 ,Sj1+1,Si其中 Sj1为第一个使 Sj1-1Sj1 ,然后用Sj1,Sj1+1,Si去查生产式表,若查到有相同右部的产生式即USj1,Sj1+1,Si,则从栈中退掉子串Sj1,Sj1+1,Si,并把U进栈;然后转(2)。若查不到转出错处理。(5) 若T(j)=#,并且S栈的内容为# Z(Z为文法开始符号)则正确停机。否则,出错停机。3.3语法分析表设计3.3.1 GS的优先关系表如表1:表 1 GS

15、的优先关系矩阵SCTM beginLendifB thenelse#SC=T=beginif=B=thenelse#orandnot()id=rop=truefalse#注:表中id代表标识符,rop代表关系运算符,下同。3.3.2 GL的优先关系表如表3:表 3 GL 的优先关系矩阵LA ; := ( ) id + - M E * # L = A = ; := = ( = + = - E = # b and c b goto 3002: goto -003: if c d goto 5004: goto -005: T1:= s + r006: T2:= T1 + q007: p:= T20

16、08: c:= w其中前面的数字表示三地址的序列号或者说是中间代码的地址,Ti为中间代码翻译过程中产生的临时变量,符号,表示在后续的翻译过程中待回填的goto语句转移地址。5 编译系统的概要设计5.1程序总体描述 本设计体现语法制导翻译的思想,采用单遍的翻译方法,在语法分析的过程中同时完成词法分析和中间代码的翻译。图1 程序总体概要设计5.2 数据结构设计5.2.1 用于“回填”和“拉链”的链表结构设计如下: struct Chain int label; / 三地址代码语句的序号 Chain* next; / 下一个节点指针;5.2.2 属性单词Token的数据结构如下:struct Tok

17、en char name20; /名字 Classify kind; / 类型 Chain* trueChain; / “真链” Chain* falseChain; / “假链” Chain* chain; / 待“回填”的链 int codeBegin; / 非终结符的第一个三地址语句序号 int weight; / 该变量用于计算归约用的的产生式序号 int pos; / 文法符号在优先关系表中的位置 int place; / 属性单词在符号表中的登陆项 double value; / 数值型单词的值,其他类型无定义 int lineNumber; / 单词所在源文件的行号 char o

18、rig20; / 如为非终结符,该变量用于保存被规约/ 成该非终结符的终结符,否则无定义 5.2.3 三地址码数据结构设计struct TripleCode CodeKind kind; / 三地址语句格式种类 char op; / 运算符 char result20; / 运算结果 char opn120; / 操作数1 char opn220; / 操作数2 int destination; / goto语句的转移地址 bool term0; / 结果变量是否是终结符 bool term1; / 操作数1是否是终结符 bool term2; / 操作数2是否是终结符 int serial0

19、; / 如结果为临时变量,用于保存该临时变量的序列号 int serial1; / 如果操作数1为临时变量,用于保存该临时变量的 /序列号 int serial2; / 如果操作数2为临时变量,用于保存该临时变量的 /序列号 ;根据产生式的序号和产生式右边文法符号的个数,给产生式右边每个文法符号赋予一定的weight值,在规约的时候,产生式右边各个文法符号的weight域相加的和为该产生式的序号,从而确定用哪条产生式规约。三地址代码的格式设计为5种,分别是“if-goto”型、“goto”型、赋值型、单目运算型和双目运算型5.3程序接口声明5.3.1.1 词法分析器类Lexical的类图 图2

20、 Lexical类 class Lexical Attributesprivate char chprivate int U_indeprivate int lineNumprivate int lenprivate int buffEndprivate double valueprivate ifstream finprivate ofstream foutprivate string outputFileprivate static int serialprivate static int nextstatprivate char line100private char word40pri

21、vate int bufferMAX_BUFFER_SIZEprivate Token tokensMAX_SYMBOL_SIZEprivate TripleCode codesMAX_CODE_NUMprivate char separatorsSEPARATOR_COUNTprivate char* keywordTableKEYWORD_COUNTprivate char* operatorsOPERATOR_COUNT Operationspublic Lexical()public Lexical() public Token* getNextToken()public Token*

22、 getNewToken()public int lookup()public void emit()public void genCode() public void printCode()public void backpatch()public void putBackToken()public void writeCodeToFile()public static inline int getNextStat()public static int getSerialNum() private int getChar()private void getWord()private void

23、 skipSlash()private void getLine()private int findKeyword()private int findSeparator()private void readOperator()private double string2Double()5.3.1.2 Lexical类主要接口说明public Token* getNextToken() / 返回源文件中的下一个属性单词的指针public Token* getNewToken() / 返回符号表中下一个可用新项目的指针public int lookup() / 语义函数,查找给定名字的单词是否在符号表中public void emit() / 语义函数,生成一条三地址代码并保存到三地址代 / 码数组中,emit过程每调用一次,nextstat增加1 public void genCode() / 语义函数,作用同emit,genCode每调用一次, / nextstat也增加1public void printCode() / 输出三地址码到屏幕public void backpatch() / 用于回填的函数public void putBackToken() / 将属性单词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1