编译原理 Chapter 5
编译原理chapter5

若S+ …X,则X•>#。
第五章 优先分析法
第二节 简单优先分析方法
三、简单优先分析的基本思想
根据优先关系的定义,将简单优先文法中各 文法符号之间的这种关系用一个矩阵表示,称 作简单优先矩阵。PDA读入一个单词后,比较 栈顶符号和该单词的优先级,若栈顶符号优先 级低于该单词,继续读入;若栈顶符号优先级 高于或等于读入符号,则找句柄进行归约,找 不到句柄就继续读入。直到最后栈内只剩下开 始符号,输入串读到“#”为止。此时识别正 确。
1、自下而上归约
2、规定算符(更一般地说,指终结符)的优先级 及结合规则,以使得分析过程唯一
3、比较相邻两个算符而决定动作
注:1)这里的关键是对所有算符定义某种优先 关系
2)算符优先分析法是仿效四则运算的计算过 程而构造的一种语法分析方法
第五章 优先分析法 第三节 算符优先分析方法 一、基本思想
4、实例 表达式文法:
第五章 优先分析法 第二节 简单优先分析方法
四、简单优先矩阵
用于表示文法符号之间的简单优先关系的矩阵。
注:简单优先矩阵的构造可通过Warshall算法实 现。
第五章 优先分析法 第二节 简单优先分析方法
五、简单优先分析法的优缺点
优点:技术简单 缺点:适用范围小,分析表尺寸太大。
第五章 优先分析法 第三节 算符优先分析方法 一、基本思想
设A1A2…Ai-1AiAi+1…An是文法G的一个句型, 1)、若AiVN,则Ai-1、Ai+1 VT,即不许出现相继两个
非终结符;
第五章 优先分析法
第三节 算符优先分析方法 四、算符优先文法及优先表的构造 3、算符文法和算符优先文法定义的意义
编译原理课件CHAPTER 5(Semantic Analysis and Intermediate Code Generation-3)

2013-6-28
17
例 : A + B * ( C - D ) + E / ( C - D ) ↑N
求: 1.后缀式 2.四元式 3.三元式 4.间接三元式
2013-6-28 18
例 : A + B * ( C - D ) + E / ( C - D ) ↑N
后缀式 : A B C D - * + E C D – N ↑ / + 四元式 : (1) ( - C D T1 ) T2)
2013-6-28
34
5.4
中间代码生成
分析控制流语句的语法制导定义 P493 Fig.8.23
2013-6-28
35
5.4
中间代码生成
控制流语句中布尔表达式的翻译
产生布尔表达式三地址代码的语法制导定义
P494 Fig.8.24 or and not 关系表达式 是 L-属性定义,不能用自底向上的翻译,只能用深 度优先的分析方法 改写语法制导定义为翻译模式
id4
t1 := id2 + id3 t2 := t1 + id4 id1 := t2
id3
2013-6-28
25
5.4
中间代码生成
访问数组元素(Array Elements) 数组被存储在一片连续的空间中,见P482 Fig.8.17 访问数组元素,与以下几个量有关
Base(数组元素的起始地址)— 此值登记在符号表中 数组的维数(dimensional) — 说明时确定 每一维的下界(low)和上界(high),(取值个 数)— 说明时确定 存储方式 — 按行(row-major)还是按列(columnmajor) — 与编译器设计有关
编译原理课件CHAPTER5(SemanticAnalysisandIntermediateCodeGeneration-1)

2019/11/8
6
5.2 语法制导翻译
属性的类型(从分析过程中属性值的计算方法 来分类):
1、综合属性(Synthesized Attributes): 属性值是分析树中该结点的子结点的属性值的 函数
2、继承属性(Inherited Attributes):属 性值是分析树中该结点的父结点和/或兄弟结 点的属性值的函数
Chapter5 Semantic Analysis and Intermediate Code Generation
语义分析概述 语法制导翻译
(Syntax-Directed Translation) 类型确定与类型检查
(Type Checking) 中间代码生成
(Intermediate Code Generation)
31
5.2 语法制导翻译
** Fig.5.16 是 Fig.5.2 的一种具体实 现方法
2019/11/8
32
5.2 语法制导翻译
L -属性定义(L-attributed definitions):
是一种语法制导定义 对于产生式 A→X1X2…Xn 右部 Xj 的继承属性,
它依赖于: 1、 X1,X2,…,Xj-1 ( Xj左边的文法符号)的 属性 2、A 的继承属性
(5.1)是一个适合以深度优先顺序计算属性 的翻译模式
E
T 9 {print(“9”)}
1
2019/11/8
R
-
T
3
{print(“-”)}
R
5 {print(“5”)} + T {print(“+”)} R
2
5
2 {print(“2”)}
编译原理第五章

第五章2.对下面的文法G:E→TE/E/→+E|εT→FT/T/→T|εF→PF/F/→*F/|εP→(E)|a|b|^(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
(2)证明这个方法是LL(1)的。
(3)构造它的预测分析表。
(4)构造它的递归下降分析程序。
解:(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
FIRST集合有:FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};FIRST(E/)={+,ε}FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};FIRST(T/)=FIRST(T)∪{ε}={(,a,b,^,ε};FIRST(F)=FIRST(P)={(,a,b,^};FIRST(F/)=FIRST(P)={*,ε};FIRST(P)={(,a,b,^};FOLLOW集合有:FOLLOW(E)={),#};FOLLOW(E/)=FOLLOW(E)={),#};FOLLOW(T)=FIRST(E/)∪FOLLOW(E)={+,),#};//不包含εFOLLOW(T/)=FOLLOW(T)=FIRST(E/)∪FOLLOW(E)={+,),#};FOLLOW(F)=FIRST(T/)∪FOLLOW(T)={(,a,b,^,+,),#};//不包含εFOLLOW(F/)=FOLLOW(F)=FIRST(T/)∪FOLLOW(T)={(,a,b,^,+,),#};FOLLOW(P)=FIRST(F/)∪FOLLOW(F)={*,(,a,b,^,+,),#};//不包含ε(2)证明这个方法是LL(1)的。
各产生式的SELECT集合有:SELECT(E→TE/)=FIRST(T)={(,a,b,^};SELECT(E/→+E)={+};SELECT(E/→ε)=FOLLOW(E/)={),#}SELECT(T→FT/)=FIRST(F)={(,a,b,^};SELECT(T/→T)=FIRST(T)={(,a,b,^};SELECT(T/→ε)=FOLLOW(T/)={+,),#};SELECT(F→PF/)=FIRST(P)={(,a,b,^};SELECT(F/→*F/)={*};SELECT(F/→ε)=FOLLOW(F/)={(,a,b,^,+,),#};SELECT(P→(E))={(}SELECT(P→a)={a}SELECT(P→b)={b}SELECT(P→^)={^}可见,相同左部产生式的SELECT集的交集均为空,所以文法G[E]是LL(1)文法。
编译原理chapter 5 part 1

Handle (cont)
E’ => E => E + n => n + n Viable prefix Parsing Stack 1 2 3 4 5 6 7 $ $n $E $E + $E + n $E $E’ Right sentential form Input n + n$ + n$ + n$ n$ $ $ $ shift reduce E -> n shift shift reduce E -> E + n reduce E’-> E accept Handle Action
Derivation: E’ => E => E + n => n + n
The sequence of symbols on the parsing stack is called a viable prefix of the right sentential from. The n+ is not a viable prefix of n + n. (why ?)
X
A-> α X . η
X is a Token
A-> α . X η
X
A-> α X . η
If X is a token, then this transition corresponds to a shift of X from the input to the top of the stack.
Example 5.1
S’ -> S S -> ( S ) S | ε Parsing Stack 1 2 3 4 5 6 7 $ $( $( S $(S) $(S)S $S $ S’ String: ( ) Derivation: S’=> S => (S) S=> (S) => ( ) Input ( )$ )$ )$ $ $ $ $ shift reduce S -> ε shift reduce S -> ε reduce S -> ( S ) S reduce S’ -> S accept Action
编译原理第5章

二.算符优先分析法的基本思路
是仿照算术表达式的四则运算过程而设计的一 种语法分析方法。
终结符号 运算符 非终结符号 运算对象 算符优先分析法的关键在于用合适的方法去定义 任何两个可能相继出现的结符号a和b(它们之间 可能插有一个非终结符号)之间的优先级。然后利 用这种关系比较相邻运算符之间的优先级来确定 可归约串并进行归约。
bcde#
归约Ab
4
#aA
bcde#
移进
5
#aAb
cde#
归约AAb
6
#aA
cde#
移进
7
#aAc
de#
移进
8
#aAcd
e#
归约Bd
9
#aAcB
e#
移进
10
#aAcBe
# 归约SaAcBe
11
#S
#
接受
5.2算符优先分析法 概述 一. 算符文法的定义 二. 算符优先分析法的基本思想
算符优先分析法概述
第五章 自底向上分析
P94
概论
▪ 思想
• 自下而上的语法分析过程是最右推导的逆过
程(最左归约);即从输入串开始,朝着文 法开始符号进行归约,直至到达文法开始符 号为止的过程。
▪ 核心
• 寻找句型中的“句柄”进行归约,用不同的
方法寻找句柄,就可获得不同的分析方法
5.1 自底向上分析
一、规范归约
•归约 G=(VT,VN,S,P),α, β ∈(VT∪VN)*,A→β∈P,
规范句型的特点:
生式如下:
①S→aAcBe
②A→b
句柄后不会出现非终结符号。
③A→Ab
④B→d
对输入串abbcde#进行分析
编译原理第5章

四元式
四元式:带有四个域的记录结构,算符OP, 第一和第二运算量ARG1和ARG2,运算结果 RESULT。
与三元式相比,四元式更容易优化。 例: A:=-B*(C+D) 表示为:
(1) (2) (3) (4)
OP @ + * :=
ARG1 B C T1 T3
ARG2 D T2 -
RESULT T1 T2 T3 A
语义动作 {print E.VAL}
{E.VAL:= E(1).VAL+E(2).VAL}
{E.VAL:= E(1).VAL*E(2).VAL} {E.VAL:= E(1).VAL} {E.VAL:= LEXVAL}
其中LEXVAL表示由词法分析器送来的n的内部值
湖南农业大学信息科学技术学院 王 奕
湖南农业大学信息科学技术学院 王 奕
5.3.1 逆波兰式
后缀式表示法:波兰逻辑学家Lukasiewicz发明的 一种表示表达式的方法,又称逆波兰表示法。
一个表达式E的后缀形式可以如下定义:
1. 如果E是一个变量或常量,则E的后缀式是E自身。 2. 如果E是E1 op E2形式的表达式,其中op是任何二 元操作符,则E的后缀式为E1 E2 op,其中E1 和 E2 分别为E1 和E2的后缀式。 3. 如果E是(E1)形式的表达式,则E1 的后缀式就是E 的后缀式。
后缀式的计算
用一个栈实现。 一般的计算过程是:自左至右扫描后缀式,每碰到 运算量就把它推进栈。每碰到k目运算符就把它作 用于栈顶的k个项,并用运算结果代替这k个项。
湖南农业大学信息科学技术学院 王 奕
语法制导生成后缀式
产生式 E→E(1)op E(2) E→ (E(1)) E→id
编译原理第5章

语法分析-自下而上分析 语法分析-
E E T | E+T T F | T*F F i | (E) E + T 短语有:i, T * F, E+T * F, E + T * F + i 直接短语有: i, T * F 句柄是:T * F
第7页
E + T F
T *
F
i
编译原理
语法分析-自下而上分析 语法分析-
接短语
*
位于一个句型最左边的直接短语称为句柄. 句型最左边的直接短语称为 位于 句型---> 短语 ---> 直接短语 --->句柄 句型 句柄
注: 每次归约的部分必须是称之为句柄 句柄的字符串(最右 句柄 推导)。 关键的问题是如何识别句柄 如何识别句柄
第6页
编译原理
例:下述文法的另一个句型: 下述文法的另一个句型: E+T * F + i 其短语、直接短语、句柄分别是? 其短语、直接短语、句柄分别是?
第17页
T *
F
i
编译原理 算符优先分析法小结
优点 简单、效率高 能够处理部分二义性文法 缺点 文法书写限制大 占用内存空间大 不规范、存在查不到的语法错误
语法分析-自下而上分析 语法分析-
第18页
编译原理
语法分析-自下而上分析 语法分析-
LR分析法 LR分析法
L表示从左到右扫描输入串,R表示构造一个 表示从左到右扫描输入串, 表示构造一个 表示从左到右扫描输入串 最右推导的逆过程。 最右推导的逆过程。 大多数用上下文无关文法描述的程序语言都 可用LR分析器予以识别 分析器予以识别。 可用 分析器予以识别。 能用I.R分析器分析的文法类 包含能用LL(1) 分析器分析的文法类, 能用 分析器分析的文法类,包含能用 分析器分析的全部文法类, 分析法在自左 分析器分析的全部文法类,LR分析法在自左 至右扫描输入串时就能发现其中的任何错 并能准确地指出出错地点。 误.并能准确地指出出错地点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
zhangjing@
17
We can see that there are several phrases from Fig.5.3 T (For nonterminal E) T*F (For nonterminal T) T+T*F (For nonterminal E) i (For nontermina F) T + T * F + i (For nonterminal E)
zhangjing@
15
E E / E + E E E
E E + E E E / E
Fig. 5.2 Two syntax tree of string E+E/E 图5.2句型E+E/E的两棵语法树
zhangjing@
16
5.1.4 Leftmost Phrase
zhangjing@
5
1. a b , means there are rules U∷=…ab… or U∷=…aVb… 2. a < b, means there are rules U∷=…aR…,R+b…or R+Vb . 3. a > b, means there are rules U∷=…Rb…,R+…a or R+…aV
Chapter 5 Bottom-Up Parsing
Zhang Jing, Wang HaiLing College of Computer Science & Technology Harbin Engineering University
Shift-reduce parsing attempts to construct a parse tree for an input string beginning at the leaves which can be considered as bottom and working up towards the root, know as top. We can think of this process as one of reducing which reduce a string to the start symbol. At each reduction step, a particular substring matches the right side of production and is replaced by the symbol on the left of the production. An easy-to-implement form of shift-reduce parsing is operator-precedence parsing. A much more general method of shift-reduce parsing is LR(0) and SLR(1) parsing. The position of bottom-up syntax analyzer in compiler is shown by Fig.5.1.
Note: The precedence relations between a and b are different with arithmetic relations "less than", "equal to " and "greater than", that is, . a < b does not equal to b >a ,a b does not equal to b a
E∷=E+E | E*E | E/E | i
operator grammar
zhangjing@
14
Operator grammar also can be called OG. There are three types disjoint precedence relation between pair of terminals, the three types disjoint precedence are , and , But if a pair of terminals only has one certain type precedence relation, this kind of OG is operator precedence grammar, namely, OPG. For example, grammar E∷=E+E|E*E|E/E|i is not operator-precedence grammar. Because from Fig5.2, we know there are two grammar tree for(+,/), in addition there are two precedence relations between them, namely, . + > / and + < /
The syntax tree for sentence #T+T*F+i# in grammar G[E] of example 5.1 is shown by Fig.5.3.
E E E T + T T * + T F F i
Fig.5.3 syntax tree of #T+T*F+i# 图5.3 句型语法树
zhangjing@ 4
5.1.1 Relation between pairs of operator precedence
There are three relations between pairs of operator precedence, "a" and "b" belongs to VT , U, V and R belong to VN , then their operator precedence are
zhangjing@ 6
Example 5.1
grammar G〔E〕: E∷=E+T|T T∷=T*F|F F∷=(E)|i From rule F∷=(E),we can obtain the precedence relation between "(" and ")" ( ) From rule E∷=E+T,we know after "+" there is TT*…, so the precedence relation between "+" and "*": < + * From rule F∷=(E),and E+…+T,we can obtain the . > precedence relation between "+" and " ) " : + )
zhangjing@
7
5.1.2 Constructing Operatorprecedence Relation
This section, we will give a general method of constructing operator precedence, firstly, we will define two new sets: FIRSTTERM(U) and LASTTERM(U). b∈FIRSTTERM(U) when there is rule: U∷=+b… or U∷=+Vb… b∈LASTTERM(U) when there is rule: U∷=+…b or U∷=+…bV while b∈VT , V∈VN.
zhangjing@
2
zhangjing@
3
5.1 Operator-precedence Parsing
If a grammar has the property that has two adjacent nonterminals, we can easily construct efficient shift-reduce parsers by hand, the easy-toimplement parsing technique called operatorprecedence parsing. The technique is described as a manipulation on tokens without any reference to any grammar. Once we finish building an operator-precedence parser from a grammar, we may efficiently ignore the grammar, using the nonterminals on the stack only as placeholders for attributes associated with the nonterminals.
zhangjing@ 8
The algorithm of constructing operator precedence is Step1 constructing set of FIRSTTERM and set of LASTTERM for each nonterminal. a, b∈VT and U, R∈VN. Step2 If there is grammar G like U∷=…ab… or U∷=…aVb… a b If there is grammar G like U∷=…aR…, and, b∈FIRSTTERM(R) a < b If there is grammar G like U∷=…Rb…, and, . a∈LASTTERM(R) a > b