IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
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分析器的工作过程可看成是栈里的状态序列,已归约串和输入串所构成的三元式的变化过程。分析地的初始三元式(S0,#,a1a2…an#)其中,S0为分析器的初态;#为句子的左括号;a1a2…an为输入串;其后的#为结束符。分析
过程每步的结果可表示为(s0s1…sm,# X1X2…,ai….an#)分析器的下一步动作是由栈顶状态Sm和现行输入符号ai所唯一决定。即,执行ACTION[Sm,ai]所规定的动作。经执行每种可能的动作之后,三元式的变化的情形是:
(1)若ACTION[Sm,ai]为移进,且S=GOTO[Sm,ai],则三元式变成:
(S0S1…Sm,#X1X2…Xmaian#)
(2)若ACTION[Sm,ai]={A-> },则按产生式A-> 进行归约。此时三元式变为
(S0S1…Sm-rS,#X1…Xm-rA,aiai+1…an#)
此处S =GOTO[Sm-r,A],r为的长度,=Xm-r+1…Xm。
(3)若ACTION[Sm,ai]为:接受,则三元式不再变化,变化过程终止,宣布分析成功。
(4)若ACTION[Sm,ai]为“报错”,则三元式的变化过程终止,报告错误。一个LR分析器的工作过程就是一步一步地变换三元式,直至执行“接受”或“报错”为止。
3.2语法分析表设计
(1)Sj 把下一状态j和现行输入符号移进栈;
(2)rj 按第j个产生式进行规约;
(3)acc 接受;
(4)空白格出错标志,报错;