第七章语义分析和中间代码生成 本章内容 介绍几种常用的中间表示:后缀表示、图 形表示和三地址代码 用语法制导定义和翻译方案的方法来说明 程序设计语言的结构怎样被翻译成中间形式
第七章 语义分析和中间代码生成 本章内容 –介绍几种常用的中间表示:后缀表示、图 形表示和三地址代码 –用语法制导定义和翻译方案的方法来说明 程序设计语言的结构怎样被翻译成中间形式
71中间语言 71.1后缀式 表达式E的后缀式可以如下递归定义 ·如果碮变量或常数,那么E的后缀式就是E 本身
7.1 中 间 语 言 7.1.1 后缀式 表达式E的后缀式可以如下递归定义 • 如果E是变量或常数,那么E的后缀式就是E 本身
71中间语言 71.1后缀表示 表达式E的后缀表示可以如下递归定义 如果碮变量或常数,那么E的后缀表示就是 E本身。 如果E是形式为E1pE2的表达式,那么E的后 缀式是E1E2o,其中E1和E2分别是E1和E2 的后缀式
7.1 中 间 语 言 7.1.1 后缀表示 表达式E的后缀表示可以如下递归定义 • 如果E是变量或常数,那么E的后缀表示就是 E本身。 • 如果E是形式为E1 opE2的表达式,那么E的后 缀式是E1 E2 op,其中E1 和E2 分别是E1和E2 的后缀式
71中间语言 71.1后缀式 表达式E的后缀式可以如下递归定义 ·如果碮变量或常数,那么E的后缀式就是E 本身。 如果E是形式为E1pE2的表达式,那么E的后 缀式是E1E2o,其中E1和E2分别是E1和E2 的后缀式。 如果E是形式为(E1)的表达式,那么E的后缀 表示也是E的后缀式
7.1 中 间 语 言 7.1.1 后缀式 表达式E的后缀式可以如下递归定义 • 如果E是变量或常数,那么E的后缀式就是E 本身。 • 如果E是形式为E1 opE2的表达式,那么E的后 缀式是E1 E2 op,其中E1 和E2 分别是E1和E2 的后缀式。 • 如果E是形式为(E1 )的表达式,那么E1的后缀 表示也是E的后缀式
71中间语言 后缀式表示法是波兰逻辑学家卢卡西维奇( Lukasiewicz)发明的一种表示表达式的方法 因此又称逆波兰表示法。这种表示法是把运 算量(操作数)写在前面把算符写在后面( 后缀)
7.1 中 间 语 言 • 后缀式表示法是波兰逻辑学家卢卡西维奇( Lukasiewicz)发明的一种表示表达式的方法 因此又称逆波兰表示法。这种表示法是把运 算量(操作数)写在前面把算符写在后面( 后缀)
71中间语言 把表达式翻译为后缀式的语义规则描述 产生式 语义规则 E→→E10pE2E.code:=E1 code e2, code op E(EE. code:=E code E→id E. code =id
7.1 中 间 语 言 把表达式翻译为后缀式的语义规则描述 产 生 式 语 义 规 则 E→E1 op E2 E.code :=E1 .code || E2 .code || op E→(E1) E.code := E1 .code E→id E.code :=id
71中间语言 后缀式不需要括号 (8-4)+2的后缀表示是84-2+ 后缀式的最大优点是便于计算机处理表达式 后缀式很容易拓广到含一元算符的表达式 后缀式也可以拓广到其它语言成分 演示Tab1e71
7.1 中 间 语 言 后缀式不需要括号 (8 − 4) + 2 的后缀表示是8 4 −2 + • 后缀式的最大优点是便于计算机处理表达式 • 后缀式很容易拓广到含一元算符的表达式 • 后缀式也可以拓广到其它语言成分 演示Table7_1
71中间语言 712图表示法 图表示法包括DAG与抽象语法树 抽象语法树 assign a ulmus d d b (a)语法树 a:=(-b+c*d)+c*d抽象语法树
7.1 中 间 语 言 7.1.2 图表示法 图表示法包括DAG与抽象语法树 • 抽象语法树 assign a + + b c d uminus c d (a) 语法树 a := (−b + cd ) + cd抽象语法树
71中间语言 712图表示法 有向无环图也是一种中间表示 assign assign a ulmus d umnus d d b b (a)语法树 (bDAG a:=(-b+c*d)+c*d的图形表示
7.1 中 间 语 言 7.1.2 图表示法 • 有向无环图也是一种中间表示 assign a + + b c d uminus c d assign a + + b c d uminus (a) 语法树 (b)DAG a := (−b + cd ) + cd的图形表示
71中间语言 构造赋值语句抽象语法树的属性文法 演示 Table72 立生式 语义规则 S→id:=E|S.np:= mknodecassign”, maleat(id, identry), E.nptr) E→E1+E2E.mp:= mknode(+’,E1-npt,E2ptm) E,El*E2Enptr:=mknode(*, Er nptr, E, nptr) E,-E1 Enptr:= mkunode(, Ernptr) E→(E1)E.mp:=E,npt E→id E nptr: = mkleaf (id, identry)
7.1 中 间 语 言 构造赋值语句抽象语法树的属性文法 演示Table7_2 产 生 式 语 义 规 则 S → id :=E S.nptr := mknode(‘assign’, mkleaf (id, id.entry), E.nptr) E → E1 +E2 E.nptr := mknode( ‘+’, E1 .nptr, E2 .nptr) E → E1 E2 E.nptr := mknode( ‘’, E1 .nptr, E2 .nptr) E → −E1 E.nptr := mkunode( ‘uminus’, E1 .nptr) E → (E1 ) E.nptr := E1 .nptr E→ id E.nptr := mkleaf (id, id.entry)