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