translation(2).ppt - 5.4 ~ 5.5 1 5.4(Syntax Directed...

Info icon This preview shows pages 1–13. Sign up to view the full content.

View Full Document Right Arrow Icon
1 第五章 语法制导翻译 5.4 ~ 5.5
Image of page 1

Info icon This preview has intentionally blurred sections. Sign up to view the full version.

View Full Document Right Arrow Icon
2 5.4 语法制导的翻译方案 (Syntax Directed Translation Scheme) 语法制导翻译方案( SDT )是拓广的 CFG , 在文法中嵌入 语义动作 ,语义动作写在花括号 “{} 里。 后缀表达式: expr expr 1 + term { print (‘+’)} term 0 { print (‘0’)} 前缀表达式: expr { print (‘+’)} expr 1 + term 而语法制导定义 line E ‘\n’ print(E.str) E E 1 + T E.str= E 1 .str || T.str || “+” 语法制导定义可以转化成语法制导翻译方案。 || :字符串连接符
Image of page 2
SDT 的语义动作放在产生式后面 3 为了进行句法分析,我们把每个内嵌的语义动作替换为一个 独有的 标记非终结符号 (marker nonterminal) 例如 expr { print (‘+’)} expr 1 + term 改写成 expr M 1 expr 1 + term M 1 { print (‘+’)} M 1 是一个 标记非终结符号 ,在所有产生式的右部中 一般 仅出现 一次。 所有动作都在产生式最右端的 SDT 称为 后缀翻译方案
Image of page 3

Info icon This preview has intentionally blurred sections. Sign up to view the full version.

View Full Document Right Arrow Icon
4 我们希望 SDT 能够在语法分析的同时进行,无需 构造好分析树。这里讨论两类: 1. 基本文法是 LR SDD S 属性的; 2. 基本文法是 LL SDD L 属性的。
Image of page 4
5 第一种情况:基本文法是 LR SDD S 性的; E E 1 + T { E . val := E 1 .val + T.val ;}
Image of page 5

Info icon This preview has intentionally blurred sections. Sign up to view the full version.

View Full Document Right Arrow Icon
6 5.4.2 后缀 SDT 的语法分析实现 A X Y Z X Y Z X.x Y.y Z.z top-1 top-2 状态栈 符号栈 剩余的输入 动作 0 2 7 10 T * F $ T->T*F 归约 top top
Image of page 6
Yacc 中的处理 expr.y 中, #define YYSTYPE double expr : expr '+' expr { $$ = $1 + $3;} y.tab.c 中, #define YYSTYPE double YYSTYPE * yyvsp; // 指向栈顶 yyval = yyvsp[-2] + yyvsp[0]; 假设一个 expr 有两个属性: type val ,我们 可以在 expr.y 中写如下代码: typedef struct { string type; int val; } attr; #define YYSTYPE attr $$.val = $1.val + $3.val 变为 yyval.val = yyvsp[-2].val + yyvsp[0].val; 状态栈 符号栈 剩余的输入 动作 0 2 7 10 T * F $ T->T*F 归约 top
Image of page 7

Info icon This preview has intentionally blurred sections. Sign up to view the full version.

View Full Document Right Arrow Icon
8 L E n { print ( E . val ); } E E 1 + T { E . val := E 1 .val + T.val ;} E T { E . val := T.val ;} T T 1 * F { T.val := T 1 . val F.val ;} T F { T.val := F.val ; } F ( E ) { F.val := E.val ; } F digit { F.va l := digit .lexval ; }
Image of page 8