第6章 自底向上语法分析

合集下载

自底向上分析

自底向上分析
于是: 4+8-6/2*3 运算过程和结果唯一。 13
例: G[E] E→E+E | E*E | (E) | i
Vt={+, *, (, ), i} 这是一个二义文法,要用算符优先法分析有该文法所确定的 语言句子。 如:i+i*i
(1) 先确定终结符之间的优先关系
优先关系的定义:
设 a, b 为可能相邻的终结符
23
例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i
1、求每个非终结符号的FIRSTVT及LASTVT
FIRSTVT
LASTVT
E {+,*,(,i}
{+.*,),i}
T {*,(,i }
{*,),i}
F {(,i}
{),i}
2、求=关系:(=)
3、求<关系:+<FIRSTVT(T),*<FITSTVT(F),(<FIRSTVT(E) 4、求>关系: LASTVT(E)>+,LASTVT(T)>*,LASTVT(E)>)
i*i# *i# *i#
i# # # # #
优先关系 动作
#<i 移进
i>+ 规约
#<+ 移进
+<i 移进
i>* 规约
+<* 移进 *<i 移进 i># 规约 *># 规约
+># 规约 接受 16
6.3.2 算符优先文法的定义
(1)算符优先文法(OPG) (2)构造优先关系矩阵 (3)算符优先分析算法的设计
构造优先关系表:
b(右栈外) +

第6章+自底向上的LR分析法

第6章+自底向上的LR分析法

36
goto(I,X)函数


如果LR(0) 项目集规范族中的每个项目集看做 DFA一个状态,则项目集规范族的goto函数把 这些项目集连接成一个DFA。 定义:设I是一个项目集,X是任一文法符,则 goto(I,X)定义为: goto(I,X)=CLOSURE(J), 其中J={任何具有[A → αX.β]的项目| [A → α.Xβ] ∈ I }

对空产生式A→ε仅有项目 A→· 。
27
直观地,一个项目指明了在分析过程 的某一时刻,已经看到的一个产生式的多 少。 即在LR(0)项目中,“·”左部符号串 表示已被识别出来的句柄符号。 “·”右部 符号串表示待识别的符部分。 可以由文法的所有LR(0)项目,构造识 别文法所有活前缀的DFA。
28
35
项目集闭包的例子

文法: 0. E ’ → E 1. E → E+T 2. E → T 3. T → T*F 4. T → F 5. F →(E) 6. F → i
若I={E ’ →.E} CLOSURE(I)为:
E ’ →.E E→.E+T E→.T T→.T*F T→.F F→.i F→.(E)
11
LR分析法的每一步工作都是由栈顶 状态和当前输入符号所唯一确定的。 一个LR分析器实质上是一个带先进 后出栈的确定的有限自动机。
12
§ 6.2
LR分析器 的逻辑结构
13
LR分析法的实现
LR分析法也是一种表驱动的分析方法, 有一个分析栈、一个总控程序和一个分析 表。
特殊性 栈 = 状态栈 + 文法符号栈 分析表 = 动作表(ACTION) + 状态转移表(GOTO)

34

编译原理第6章-自底向上语法分析

编译原理第6章-自底向上语法分析
移进 移进 归约(P→b) 移进 归约(P→Pb) 移进 移进 归约(Q→d) 移进 归约 接受
a b bcd e
S aP编c译Q原e理
aPcde
aPbcde 2022年3月22日
abbcd6e
基本思想
从输入符号串开始,通过重复查找当前句型的 “可归约串”并利用有关规则进行规约
若能规约为文法的识别符号,则表示分析成功,输 入符号串是文法的合法句子,否则有语法错误.
更关
1. 要求明确语法分析在编译过程所处的阶段和作用。 2. 明确语法分析的基本分析方法。 3. 掌握算符优先分析的方法。 4. 掌握构造算符优先分析表的方法,会使用算符优先分
析表分析句子。
编译原理
2022年3月22日
2
教学内容
6.1 自底向上分析法 6.2 算符优先分析法
编译原理
2022年3月22日
编译原理
2022年3月22日
21
• 性质1:在OG中任何句型都不含有两个相邻 的非终结符;
• 性质2:若Ab(bA)出现在OG的句型γ中, 其中A ∈ VN,b ∈ VT,则γ中任何含此b的 短语都必含有A。
编译原理
2022年3月22日
22
优先关系的定义
设G是一个算符文法,A、B、C是非终结符,a、b是终结符, 则算符优先关系定义为:
的顾客心 理特征 ,把握 他们的 消费需 求,在 美容院 为顾客 做服务 的时候 有针对 性
的沟通, 是做好 销售和 服务的 保障, 下面美 文网网 就跟大 家一起 分析一 下不同 年
龄段应该用什么样的话术和他们沟通 。
第一年龄段:18~25周岁的顾客

是一个年 轻的消 费群体 ,她们 多为冲 动型消 费,品 牌观念 很强。 只要他 们认定 了

第6章 自底向上分析思想

第6章 自底向上分析思想

算符优先关系表
+ + * / ^ ( ) i # > > > > < > > > > < > > > > < > > > > < < > > > < < < < > =. > > < > > > > > >. >. * / ^ ( ) >. i < < < < < < >. >. =. # >. >. >. >. >.
6.3 算符优先分析法
算符优先分析法只考虑算符(广义为终 结符)之间的优先关系,例如: (1)E → E+E (2) E → E-E (3) E → I 对输入串i1+i2*i3的归约过程可表示如下:
表6.3 对输入串i1+i2*i3的归约过程
步骤 1 2 3 4 5 6 7 8 9 10 11 # #i1 #E #E+ #E+i2 #E+E #E+E* #E+E*i3 #E+E*E #E+E #E 栈S
算符优先文法的定义
定义3: 设G是一个不含ε产生式的算符文法,如 果对任意两个终结符对a,b之间,至多 只有=.、<.、.>三种关系的一种成立, 则称G是一个算符优先文法。(Operator
Precedence Grammar)即OPG文法。
6.3.3 算符优先关系表的构造
(1)由定义直接构造(通过算法实现) (2)由关系图法构造(手工构造)

自底向上的语法分析解读

自底向上的语法分析解读

程序4-4 简单优先分析驱动程序
int parser(void){ int i=0,k=0,r;stack[0]='#'; r=a[k++]; do{ int j,LeftSide; while(!IsHigherThan(stack[i],r)) {stack[++i]=r;r=a[k++];} j=i; while(! IsLowerThan (stack[j-1], stack[j])) j--; LeftSide= RightSideOfAProduction (stack[j],stack[i],i-j+1); if(LeftSide){ /*LeftSide!=0 means the production exists */ i=j;stack[i]=LeftSide; }else /* There is no production which matches the right side */ if(i==2 && r=='#' && stack[i] == STARTSYSBOL) return SUCCESS; else return ERROR; } while (1); } /* end of parser */
与的句柄之间的关系必有下述情况之一: A A
A
… … s t ... … … s t … ... … … s t … ... 1. s在句柄中, 3. s不在句柄中,而t 2. s与t均在句 而t不在句柄中 在句柄中 柄中 对于上述情况,我们规定, 情况1: s>t; 情况2: s=t; 情况3: s<t 另外,还有一种情况,就是s和t均不在句柄中,那么一定存在某句 型使得它们进入上述三种情况之一.

第六章 自底向上优先分析法

第六章 自底向上优先分析法

练习:若有句型#abAbEcaEc#,则以下哪些可能是句柄() ab abA bAb bAbE ca caE aEc
定义6.2 设G是一个算符文法,a和b是任意两个终结符,A、 B、C是非终结符,算符优先关系=、<、>定义如下: · · · (1)a=b 当且仅当G中含有形如 A … ab …或 A … aBb … · 的产生式。 · (2)a<b 当且仅当G中含有形如 A …aB …的产生式,且 B + b… 或B + Cb… (3)a>b 当且仅当G中含有形如 A …Bb …和产生式,且 · B + …a 或B + …aC A A A …B b… … a B… …a δ b… P P δ b … … a δ
优先分析方法 简单优先分析方法 算符优分析方法 1、简单优先分析方法:对一个文法按一定原则求出该文 法所有符号即终结符和非终结符之间的优先关系,按 照这种关系确定归约过程中的句柄,它的归约过程实 际上是一种规范归约。 2、算符优先分析方法:只规定算符之间的优先关系,也 就是只考虑终结符之间的优先关系,由于算答优先分 析不考虑非终结符之间的优先关系,在归约过程中只 要找到句柄就归约,并不考虑归约到哪个非终结符名, 因而算符优先归约不是规范归约。
第六章 自底向上优先分析法
• 实现思想:对输入符号串自左向右进行扫描,并将输 入符逐个移入一个后进先出栈中,边移入边分析,一 旦栈顶符号串形成某个句型的句柄时,(该句柄对应 某产生式的右部),就用该产生式的左部非终结符代 替相应右部的文法符号串,这称为一步归约。重复这 一过程直到归约到栈中只剩文法的开始符号时则为分 析成功。 • 自底向上分析的移进—归约过程是自顶向下最右推导 的逆过程,也称为规范归约。

算符优先分析法

算符优先分析法

G[E]: E→E+E|E-E|E*E|E/E|EE|(E)|-E|id


由于该文法是一个二义文法,它的句子往往有不同的规范推导和 归约,实际运算会得到不同结果,但按传统的习惯规定优先级和 结合律进行归约,优先级从高到低为:乘幂运算符,乘、除运算符, 加、减运算符;同级运算符服从左结合原则;有括号时,先括号 内后括号外。 则文法的句子id+id-id*(id+id)的归约过程为:

N1…Ni-1<· Ni …… Nj · >Nj+1…Nn
2.
句型中Ni„„Nj是句柄,语法分析程序可以通过寻找 Ni-1<· Ni和Nj· >Nj+1这两个关系来确定句柄的头尾,从 而确定句柄进行归约。
帮助理解 abce # 控制程序 # ce # b a #
G[S]: S→aBe B→bc bce # 控制程序 e #
知识点



算符优先分析法的算法简单、直观、易于理解,所以通常作为学 习其它自下而上语法分析的基础。 需复习有关语法分析的知识有:什么是语言、文法、句子、句型、 短语、简单短语、句柄、最右推导、规范归约基本概念。 本章重难点 算符文法的形式。 对一个给定的算符文法能构造算符优先关系分析表,并能判别所 给文法是否为 算符优先文法。 分清规范句型的句柄和最左素短语的区别,进而分清算符优先归 约和规范归约的区别。(在分析过程中如何寻找可归约串) 对一个给定的输入串能应用算符优先关系分析表给出分析(归约) 步骤,并最终判断所给输入串是否为该文法的句子。
输出带
2
2,3
2,3,4
2,3,4,1
S
a
A A b b
c
B e d

在自底向上的语法

在自底向上的语法

在自底向上的语法一、什么是自底向上的语法自底向上的语法(Bottom-Up Parsing)是一种常用的语法分析方法,用于将一个字符串根据给定语法规则转化为语法分析树。

与之相对的是自顶向下的语法分析方法,自顶向下的语法分析从根节点开始,逐步将输入的字符串分解为非终结符和终结符,直到得到语法分析树。

而自底向上的语法分析则相反,它从叶子节点开始,逐步合并成非终结符,直到得到语法分析树。

自底向上的语法分析方法通常采用的是操作符优先分析法(Operator Precedence Parsing),也称为算符优先文法。

这种分析方法可以通过构造一个算符优先关系表来进行分析,从而判断字符串是否符合给定的语法规则。

自底向上的语法分析方法适用于各种类型的语言和文法,包括正则文法、上下文无关文法等。

这种方法具有较高的灵活性和适应性,并且能够处理大型复杂的文法和语言。

二、自底向上的语法分析步骤自底向上的语法分析过程可以分为以下步骤:1. 词法分析首先,将输入的字符串进行词法分析,将其划分为一个个单词或记号(Token)。

每个单词或记号都具有一个特定的含义,表示了输入字符串中的一个基本语义单元。

2. 初始化构建一个栈(Stack)用于保存已识别的单词或记号,并初始化一个语法分析表(Parsing Table)用于记录语法规则和操作符的优先级关系。

3. 移入操作从输入的字符串中读取一个未处理的单词或记号,并将其压入栈中。

4. 归约操作不断检查栈中的记号序列是否满足某一语法规则,如果满足,则将该记号序列替换为相应的非终结符,并执行相应的语义动作。

重复这个过程,直到不能再进行归约操作。

5. 接受或错误处理如果最终栈中只剩下一个元素,且该元素为起始符号,则语法分析成功,接受输入的字符串。

如果栈中无法进行归约操作,或者最终栈中还有多余的元素,或者无法匹配到输入字符串的所有部分,则语法分析失败,进行错误处理。

三、算符优先文法算符优先文法是自底向上分析方法的代表,它以操作符的优先级和关联性为基础,构造一个优先关系表来进行分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

E∷=E+E|E-E|E*E|(E)|i
句子i+i−i*(i+i)的归约过程为:
(1)i+i−i*(i+i) (2)E+i−i*(i+i) (3)E+E−i*(i+i) (4)E−i*(i+i) (5)E−E*(i+i) (6)E−E*(E+i) (7)E−E*(E+E) (8)E−E*(E) (9)E−E*E (10)E−E (11)E
21
×
编译原理
2012年7月5日
• 性质1:在OG中任何句型都不含有两个相邻 的非终结符; • 性质2:若Ab(bA)出现在OG的句型γ 中, 其中A ∈ VN,b ∈ VT,则γ 中任何含此b的 短语都必含有A。
编译原理
2012年7月5日
22
优先关系的定义 设G是一个算符文法,A、B、C是非终结符,a、b是终结符,则 算符优先关系定义为: . 1)a= b . 2)a<b 3)a. b > if文法中有形如 A→ ·ab ·或A→ · aBb · · · · · · · · · + + if文法中有形如 A→ · aB · ,其中B b ·或B Cb · · · · · · · · · +· if文法中有形如 A→ · Bb ·, 其中B · a或B+·aC · · · · · · ·
S.P 词法分析程序 符 号 表 管 理
语法分析程序
语义分析、生成中间代码 代码优化
错 误 处 理
生成目标程序 O.P
编译原理
2012年7月5日
1
第6章
自底向上语法分析
教学目标
1. 2. 3. 4. 要求明确语法分析在编译过程所处的阶段和作用。 明确语法分析的基本分析方法。 掌握算符优先分析的方法。 掌握构造算符优先分析表的方法,会使用算符优先分 析表分析句子。
编译原理
31
2012年7月5日
注意:出现在aj左端和a i右端的非终结符号一定属于 这个素短语,因为我们的运算是中缀形式给出 的(OPG文法的特点)NaNaNaN NaWaN 例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i
分析文法的句型T+T*F+i
编译原理
2012年7月5日
编译原理
2012年7月5日
10
2. 句柄
任一句型的最左简单短语称为该句型的句柄。 给定句型找句柄的步骤: 短语 简单短语 句柄
注意:短语、简单短语是相对于句型而言,一个句型
可能有多个短语、简单短语,句柄只能有一个。
编译原理
2012年7月5日
11
求句型T+T+i的句柄
E 短语:T+T+i, T+T, T, i 简单短语:T, i 句柄:T E T E + T +
编译原理
2012年7月5日
7
关键:找出当前句型的“可归约串x”
最左素短语 算符优先分析法
句柄
LR分析法
编译原理
2012年7月5日
8
1.短语和简单短语
给定文法G[S], δ为该文法的句型, + * 若 S==>Aδ,且A==>, 则是句型δ相对于A的短语; * 若 S==> Aδ, 且A==> , 则是句型δ相对于A的简单短语。 直观理解:短语就是某句型中的子串,这个子串是由某个非 终结符通过至少一步推导得到的子串,而简单短语就是由某 个非终结符通过一步推导得到的子串。 从语法树找句型的短语和简单短语 设A是句型αβδ的某一子树的根,其中β是形成此子树的末端 结点的符号串,则β是短语。若这个子树只有一层分支(称 简单子树),则β简单短语。
步骤 符号栈
1) 2) 3) 4) 5) 6) 7) # #a #ab #aP #aPb #aP #aPc
输入符号串
abbcde# bbcde# bcde# bcde# cde# cde# de#
动作
移进 移进 归约(P→b) 移进 归约(P→Pb) 移进 移进
S P Q
8)
# aPcd
e#
e# # #
=. <
. >
编译原理
2012年7月5日
18
E∷=E+E|E*E|(E)|i 6.2.1 优先关系表(算法的核心)
+
*
i
(
)
#
+
* i ( )
>
> > < >
<
> > < >
<
< <
<
< <
>
> > = >
>
> > >
#
<
编译原理
<
<
<
空白处表示这两个终结符不能相邻,故没优先关系
2012年7月5日 19
归约(Q→d)
移进 归约 接受
9) #aPcQ 10) #aPcQe 11) #S
P
a b b c d e
6 S aPcQe理 aPcde aPbcde abbcde 编译原 2012年7月5日
基本思想
从输入符号串开始,通过重复查找当前句型的 “可归约串”并利用有关规则进行规约 若能规约为文法的识别符号,则表示分析成功,输 入符号串是文法的合法句子,否则有语法错误.
构造优先分析表
编译原理
2012年7月5日
28
. • ①求 = 关系;
• ②求firstvt集和lastvt集; . • ③求 < 关系:列出所有产生式中终结符在前,非
终结符在后的所有相邻符号对;
• ④求 .>关系:列出所有非终结符在前,终结符在
后的所有符号对;
• ⑤根据所求,画出优先关系表。
编译原理
编译原理
2012年7月5日
25
【例6.4】试构造FIRSTVT集和LASTVT集
E'→#E# E→E+T E→T T→T*F T→F F→(E) F→i
方法:根据定义
FIRSTVT(E')={#} FIRSTVT(E)={+,*,i,(} FIRSTVT(T)={*,i,(} FIRSTVT(F)={i,(} LASTVT(E')={#} LASTVT(E)={+,*,i,)} LASTVT(T)={*,i,}} LASTVT(F)={i,)}
2012年7月5日
29
【例6.5】试构造例6.4中文法G[E']的优先关系表。
可根据优先关系表判断该文法是否为算符优先文法 如果表中元素不存在冲突,即文法的任何终结符至 多只存在一种优先关系,则该文法是一个算符优先 文法
表6.5
编译原理
2012年7月5日
30
6.2.4 算符优先分析法如何确定当前句型的最左素短语?
<数字串>
<数字串> <数字>
==> <数字> 0
1
编译原理
2012年7月5日 4
【例6.1】G[S]: S a P c Q e P b PPb Qd 分析句子abbcde#
编译原理
2012年7月5日
5
文法G[S]: (1) S → aPcQe (2) P → b (3) P → Pb (4) Q → d
2012年7月5日
6.2.3 算符优先关系表的构造 . •求 “ =” 检查每一条规则,若有A→ …ab…或 A→…aBb…, . 则 a =b . < ”、“ .> ”,复杂一些,需定义两个集合 •求“
+ + FIRSTVT( B )={b|Bb…或BCb…,b∈VT, C∈VN}
+ + LASTVT( B )={b|B…b或B…bC,b∈VT, C∈VN}
32
例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i 步骤 1 2 句型 #T+T*F+i# #T+T+i# 关系 #<+<*>+<i># #<+>+<i># 最左子串 规约符号 T*F T+T T E
3 4
#E+i# #E+F##<+<i# #<+>#
i E+F
F E
设有OPG文法句型为: #N1a1N2a2…NnanNn+1# 其中Ni为非终结符(可以为空), ai为终结符
定理:一个OPG句型的最左素短语是描述下列条件的最左子串: aj-1Njaj…NiaiNi+1 aj-1<aj aj=aj+1, aj+1= aj+2 ,…, ai-2= ai-1,ai-1= ai ai> ai+1
T
编译原理
2012年7月5日
13
课堂练习:分别求句型E+i、E+F的短语、 简单短语、句柄、素短语、最左素短语
E E + T F i 短语:E+i, i 简单短语: i 句柄:i 素短语:i 最左素短语:i
编译原理
E E + T F
例: 文法G[E] E→E+T|T T→T*F|F F→(E)|i
编译原理
2012年7月5日
33
算符优先分析算法描述 k=1,s[k]=‘#’ ;//s为符号栈,‘#’压入栈,s[k]为栈顶项 do{ a=getsym( );//读入下一个符号给a if(s[k] ∈VT ) j=k; else j=k-1; while(s[j] > a){ do{//在栈中寻找满足的s[j] < s[j+1]=…= s[k] > a 的s[j+1] , 即最左素短语的头 Q= s[j] ; if(s[j-1] ∈VT ) j=j-1; else j=j-2; }while(s[j] =Q) s[j+1]… s[k] N; //归约最左素短语 k=j+1; s[k]=N;}//end of while if(s[j] < a|| s[j] = a){k=k+1;s[k]=a;} //移进 else error }while(a!=‘#’ || 符号栈中不是#S) 34
相关文档
最新文档