文档详情

IF-ELSE条件语的翻译程序设计(LR方法、输出四元式).doc

发布:2016-11-23约1.48万字共22页下载文档
文本预览下载声明
目录 1 系统描述(问题域描述) 2 2 文法及属性文法的描述 2 2.1文法 2 2.2 属性文法 2 3 语法分析方法描述及语法分析表设计 3 3.1语法分析方法描述 3 3.1.1 LR方法的基本思想 3 3.1.2 LR分析器模型 4 3.2语法分析表设计 5 4中间代码形式的描述及中间代码序列的结构设计 6 4.1中间代码形式的描述 6 4.2中间代码序列的结构设计 6 5 编译系统的概要设计 6 6 详细的算法描述 7 6.1系统流程图 7 6.2算法描述 7 7 软件的测试方法和测试结果 18 7.1软件的测试方法 18 7.2测试结果 18 8设计的特点、不足、收获与体会 21 8.1特点与不足 21 8.2收获与体会 21 9 参考文献 21 10本科生课程设计成绩评定表……………………………………………………………………………………………….22 IF-ELSE条件语句的翻译程序设计 (LR方法、输出四元式) 1 系统描述(问题域描述) 对条件语句: if 〈布尔表达式〉then〈赋值语句〉 else 〈赋值语句〉, 进行词法,LR(1)语法分析,并根据语法制导翻译方法将条件语句翻译成四元式中间代码形式,最后输出翻译后的四元式代码。 2 文法及属性文法的描述 2.1文法 G[S]: S-CS S-TS S-A C-if E then T-CS else T-else 其中,E代表布尔表达式,可由界符()括起来,A代表赋值表达式。在这里E、A都代表终结符,具体的表达式在程序会判断其类型。 2.2 属性文法 S-C S {S.clain:=merge(C.clain,S.clain)} S-T S { S.clain:=merge(T.clain,S.clain)} S-A {S.clain:0/* 空链 */} C-if E then {backpatch(E.true,nextstat) C.clain:=E.false} T-C S else { q:=nextstat Emit(‘GOTO’ —) Backpatch(C.clain,nextstat) T.clain:=merge(S.clain,q)} 3 语法分析方法描述及语法分析表设计 3.1语法分析方法描述 3.1.1 LR方法的基本思想 一个LR分析器实质上是一个带先进后出存储器的确定有限状态自动机。我们将把“历史”和“展望”材料综合地抽象成某些“状态”。分析栈用来存放状态。栈里的每个状态概括了从分析开始直到某一归约阶段的全部“历史”和“展望”资料。任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。因此,在任何时候都可从栈顶状态得知所想了解的一切,而绝对没有必要从称底而上翻阅整个栈。LR分析器的每一步工作都是由栈顶 状态和现行输入符号所唯一决定的。为了有助于明确归约手续,我们把已归约出的文法符号串也同时放在栈里。于是,我们可以把栈的结构看成是: 栈的每一项内容包括状态S和文法符号X两部分。(S0,#)为分析开始前预先放到栈里的初始状态和句子括号。栈顶状态为SM,符号串X1X2….XM是至今已移进归约出的部分。 3.1.2 LR分析器模型 LR分析器模型如下图: LR分析器的核心部分是一张分析表。这张分析表包括两部分,一是“动作”(ACTION)表,另一个是“状态转换表”(GOTO)表。它们都是二维数组。ACTION[s,a]规定了当状态s面临输入符号a时应采取什么动作。GOTO[s,a]规定了状态s面对文法符号X(终结符或非终结符)时下一个状态是什么。显然GOTO[S,x]定义了一个以文法符号为字母表的DFA。 每一项ACTION[s,a]所规定的动作不外是下述四种可能之一: 1. 移进 把(S,A)的下一状态S=GOTO[S,A]和输入符号A推进栈,下一输入符号变成现行输入状态。 2. 规约 指用某一产生式A- 进行规约。假若 的长度为r,归约动作是A,去除栈顶的r个项,使状态Sm-r变成栈顶状态,然后把(Sm-r,A)的下一状态S1=GOTO[Sm-r,A]和文法符号A推进栈。归约动作不改变现行输入符号。执行归约动作意味着(=Xm-r+1….Xm)已呈现于栈顶而且是一个相对于A的句柄。 3. 接受 宣布分析成功,停止分析器的工作。 4. 报错 发现源程序含有错误,调用出错处理程序。 LR分析器的总控程序本身的工作是非常简单。它的任何一步只需要按栈顶状态和现行输入符号a执行ACTION[S,a]所规定的动作。不管什么分析表,总控程序都是一样地工作。 一个LR分析器的工作过程可看成是栈里的状态序列,已归约串和输入串所
显示全部
相似文档