第五章语法自底向上方法介绍

合集下载

第5章 语法分析(2)自下而上分析

第5章 语法分析(2)自下而上分析

则成功,达不到这种格局则输入串有错误。

栈中符号串+剩余输入串 = 规范句型。
26
规范归约分析算法
1. 在栈底放入# ,在输入串尾附上#; 2. 逐个移入输入符号,当栈顶形成句柄时,进行归约; 3. 重复2 直到输入串已全部进栈,仅剩#, 4. 若栈中归约为#S, 表示分析成功,输入串为合法的 句子,否则为非法句子.
2
5.1 自下而上分析的基本问题

自下而上分析法的基本思想:
从输入串出发,反复利用产生式逐步进行 ‚归约‛,如果最后能归约到文法的开始符 号,则输入串是句子,否则输入串有语法错 误。

各种不同自下而上分析法一个共同特点是:
边输入单词符号(移进栈),边归约;
3
5.1 自下而上分析的基本问题

自下而上分析的基本技术是采用归约栈,如下图所示: #

或者说从文法的开始符号产生句子。

自下而上分析采用的方法是归约,从叶子到根构造分析树。

或者说从句子开始归约出文法的开始符号。

语法树的一个子树:由该树的某个结连同它的所有子孙组成。 在自下而上分析过程中,每一步归约都可画出一棵子树。
例如,上例中的归约过程可描述为如下分析树:
9
例5.2:文法G[S], 其4条产生式如下: ① S→aABe ② A→b ③ A→Abc ④ B→d 对句子abbcde的分析 最右推导 SaABeaAdeaAbcdeabbcde 最左归约 abbcde,aAbcde ,aAde,aABe ,S S S aABe aAde aAbcde abbcde
S (2)每次归约用的句柄: , (a,(a)), , , , , , ( (L,(S)) (L,(L)) (L,S) (L) S (S,(a)) (L,(a)) L )

编译原理_05自底向上的语法分析方法

编译原理_05自底向上的语法分析方法
4
例1:文法:
SaAcBe
A b A Ab
B d 输入串abbcde#分析 最右推导:
SaAcBe aAcde aAbcde abbcde
规约分析过程如下:
5
步骤 1 2 3 4 5 6 7 8 9 10 11
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
11
步骤 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11)
符号栈 输入符号串 # i+i*i# #i +i*i# #E +i*i# #E+ i*i# #E+i *i# #E+E *i# #E+E* i# #E+E*i # #E+E*E # #E+E # #E #
12
优先关系 #<i #<i>+ #<+ +<i +<i>* +<* *<i *<i># +<*># #<+>#
教学总结
算符优先关系表是指用表格形式来表示各终结 符号的优先关系的表。 为分析算符之间的优先关系,引入两个概念: firstVT集合和lastVT集合:对于非终结符B,有 firstVT (B)={b|Bb… 或 BCb…} lastVT(B)={a|B…a 或 B…aC} 为解决在算符优先分析过程中如何寻找句柄,引 进最左素短语的概念。 算符优先分析法只适用于对表达式的分析,其特 点是分析速度快。
对输入符号串自左向右进行扫描并将输入符自底向上分析方法的基本思想4逐个移入一个后进先出栈中边移入边分析一旦栈顶符号串形成某个句型的句柄时就用该产生式的左部非终结符代替相应右部的文法符号串称为归约

5第五章 自底向上语法分析法1

5第五章 自底向上语法分析法1

• 总结: 采用图的遍历完成自底向上的分析。
分析过程中有个急需解决的问题:谁先规约?
解决方法:通过比较终结符号之间的优先关系来确定谁 先规约。 由于自底向上的分析过程就是一个图的遍历过程,因此 分析程序通常会使用一个分析栈来辅助分析。 自底向上的分析开始时栈是空的,在成功分析的末尾就 只有开始符号。
文法G[A]={A→(A) | a}分隔如下:
A→.(A)
表示正准备开始分析
A→(.A)
表示(已被吸收,准备吸收A
A→(A.)
表示(A已被吸收,准备吸收)
A→(A).
表示(A)已被吸收,可以归约了
A→.a
表示正准备开始分析
A→a.
表示a已被吸收,可以归约了
有两个开始的地方,到底从谁开始? 解决方法:引入新的开始符号,扩充文法。
• LR(0)文法(LR(0) grammar): LR(0) 项DFA图的 所有状态均不存在移进-归约冲突(shift-reduce conflict) 和归约-归约冲突(reduce-reduce conflict) 。
移进-归约冲突:即某个状态不能既包含一个“移 进的”项目A→.X (X是一个终结符),又包含 一个如B→.的归约项。
$V+V *n
$V+V* n
$V+V*n
$V+V*V
$V+V
$V
• 试分析文法G[A]={A→(A) | a}所对应的串((a))。
(1)构造终结符优先关系表 (2)分析过程
分析栈 $ $( $(( $((a $((A $((A) $(A $(A) $A
输入串 ((a)) (a)) a)) )) )) ) )
主要内容

第 5 讲 自底向上优先分析法

第 5 讲 自底向上优先分析法

最左素短语
只规定算符(终结符)之间的优先关系。找到句 只规定算符(终结符)之间的优先关系。找到句 就归约,并不考虑规约到哪个非终结符名, 柄就归约,并不考虑规约到哪个非终结符名,不 是规范归约。 是规范归约。
简单优先分析法
按照文法符号(包括终结符和非终结符) 按照文法符号(包括终结符和非终结符) 的优先关系确定句柄。 的优先关系确定句柄。
动作
#<i,移进 移进 #<i>+,规约 规约 #<+,移进 移进 +<i,移进 移进 +<i>*,规约 规约 +<*,移进 移进 *<i,移进 移进 *<i>#,规约 规约 +<*>#,规约 规约 #<+>#,规约 规约 接受
+ + > - > * > / > ↑ > ( < ) > i > # <
算符优先关系表
算符文法的定义
定义 如果不含空产生式的上下文无关文法 G 中没 VW…的产生式 则称G 有形如 U→…VW 的产生式,其中V,W∈VN则称G 为 VW 的产生式,其中V,W 算符文法(OG)。 算符文法(OG)。 性质1 性质1:在算符文法中任何句型都不包含两个相邻的非 终结符.(数学归纳法) .(数学归纳法 终结符.(数学归纳法) 性质2 性质2:如 Vx 或 xV 出现在算符文法的句型 α 中, 其中V 其中V∈VN,x∈VT, 则 α 中任何含 x 的短语必含有 V.(反证法) V.(反证法) 注:证明的具体步骤见书P100 证明的具体步骤见书P100
1.
2.
将输入符号串a 将输入符号串a1a2a3...an#依次逐个存入符 号栈S 直到遇到栈顶符号a 的优先性> 号栈S中,直到遇到栈顶符号ai的优先性> 下一个待输入符号a 时为止。 下一个待输入符号aj时为止。 栈顶当前符号a 为句柄尾, 栈顶当前符号ai为句柄尾,由此向左在栈 中找句柄的头符号a 即找到a 为止。 中找句柄的头符号ak,即找到ak-1<ak为止。

自底向上的语法分析解读

自底向上的语法分析解读

程序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均不在句柄中,那么一定存在某句 型使得它们进入上述三种情况之一.

编译原理-清华大学-第5章-自底向上优先分析法(2+1)

编译原理-清华大学-第5章-自底向上优先分析法(2+1)

第六章自底向上优先分析方法•教学要求:了解简单优先分折法,掌握算符优先分析法的关系表的构造以及分析过程。

•教学重点:算符优先表构造及算符优先分析法。

1自底向上分析法的基本思想•从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。

•工作方式:“移进-归约”方式。

2分析程序模型1)初态时栈内仅有栈底符“#”,读头指针在最左单词符号上。

2)语法分析程序执行的动作:a)移进读入一个单词并压入栈内,读头后移;b)归约检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号;c)识别成功移进-归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符;d)识别失败语法分析程序语法表a+b……#输出带#3例如:有文法如下(1)S→aAcBe(2)A→b(3)A→Ab(4)B→d问:语句abbcde是不是该文法的合法语句?4•例:设文法G(S):(1) S aAcBe(2) A b(3) A Ab(4) B d 试对abbcde进行“移进-归约”分析。

bbcde bbcde b cde de deabbcde eB cA a SB A a 5成功11接受2,3,4,1##S 10归约##aAcBe 9移进2,3,4e ##aAcB 8归约e ##aAc d 7移进de ##aAc 6移进2,3cde ##aA 5归约cde ##a Ab 4移进2bcde ##aA 3归约bcde ##a b 2移进bbcde ##a 1移进abbcde ##0动作输出带输入串栈步骤移进归约的分析过程G[S]:(1)S →aAcBe(2)A →b(3)A →Ab(4)B →d 6遇到的问题:(1)如何找出进行直接归约的简单短语?(2)找出的简单短语应直接归约到哪一个非终结符?关键:确定句柄.常用的分析方法:(1)优先分析法(2)LR分析法7b db ac eSA B A d b a c e S A B A d a c eSA B a c e A B S 没有语法树如何确定句柄?86.1 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。

第5章 语法分析——自底向上分析

第5章 语法分析——自底向上分析

(d) aAcBe归约为S
(e)
5.2自底向上分析方法的一般过程
自底向上分析方法,也称为移进归约法,其过程是: 设置一个寄存符号的先进后出栈,称为符号栈。在 分析进行时,把输入符号逐个按扫描顺序移进栈里, 当栈顶符号串形成句柄(即为某条规则的右部)时,就 归约,把栈顶构成句柄的那个符号串用相应规则左 部的非终结符号来代替。再检查栈顶是否又出现了 新的句柄,若有,继续归约;若没有形成新的句柄, 则再从输入符号串移进新的符号,如此继续直到整 个输入符号串处理完毕。最终如果栈里只有识别符 号,则所分析的输入符号串为合法的句子,报告成 功;否则,输入串是不合法的符号串,报告错误。
5.3.2 LR分析表的构成
分析表的动作有下列四种:
1. 移进(Sn):将输入符号aj移进符号栈,将状态n移进状态栈, 输入指针指向下一个输入符号。
2. 归约(R):当栈顶形成句柄时,按照相应的产生式U→W进 行归约。若产生式右部W的长度为n,则将符号栈栈顶n个 符号和状态栈栈顶n个状态出栈,然后将归约后的文法符号 U移入符号栈,并根据此时状态栈顶的状态Si及符号栈顶的 符号U,查GOTO标,将GOTO[Si,U]移入状态栈。
第5章 语法分析——自底向上分析
在自底向上的分析方法中,分析过程从输入符号串开始, 通过反复查找当前句型的句柄,并使用规则,将找到的 句柄归约成相应的非终结符号,直到归约到开始符号。
5.1 规范推导、规范句型和规范归约
规范推导就是最右推导,而通过规范推导能得到的句型 就是规范句型。规范归约也称为最左归约,是规范推导 的逆过程,即在分析的每一步,将当前句型的句柄归约 成相应的非终结符号。
5.3.2 LR分析表的构成
LR分析表是LR分析器的核心部分,它由两部分组成,一是动作部 分ACTION表,二是状态转换部分GOTO表。表中S1、S2、…、Sn 为分析器的各个状态;a1、a2、…、am为文法的全部终结符号及 右界符#;X1、X2、…、Xk为文法的非终结符号。

语法分析自下而上分析

语法分析自下而上分析
同理,可构造计算LASTVT的算法。 使用每个非终结符P的FIRSTVT(P)和
LASTVT(P),就能够构造文法G的优先 表。构造优先表的算法是:
.
FOR 每条产生式P→X1X2…Xn DO FOR i:=1 TO n-1 DO
BEGIN
IF Xi和Xi+1均为终结符 THEN 置Xi Xi+1
.
文法G(E) (1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
的优先函数如下表
+ *↑( ) i # F2440660 G1 3 5 5 0 5 0
.
有许多优先关系表不存在优先函数,如:
ab a b
不存在对应的优先函数f和g 假定存在f和g,则有
TN
LA ( P ) S { a |P T a , 或 V P T a ,a Q V T 而 Q V N }
.
有了这两个集合之后,就可以通过检查每
所有终结符对。
➢假定有个产生式的一个候选形为 …aP…
那么,对任何bFIRSTVT(P),有 a b。 ➢假定有个产生式的一个候选形为
…Pb… 那么,对任何aLASTVT(P),有 a b。
栈STACK,把所有初值为真的数组元素F[P, a]的符号对(P,a)全都放在STACK之中。
.
运算:
如果栈STACK不空,就将顶项逐出,记此 项为(Q,a)。对于每个形如 P→Q… 的产生式,若F[P,a]为假,则变其值为真 且将(P,a)推进STACK栈。
上述过程必须一直重复,直至栈STACK拆 空为止。
17
ELSE ERROR /*调用出错诊察程序*/

在自底向上的语法

在自底向上的语法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理 语法分析—自底向上分析技术

编译原理 语法分析—自底向上分析技术

1 2 3 4 5 6 7 8
i+(i+i)*i F+(i+i)*i F+(F+i)*i F+(F+F)*i F+(E)*i F+F*i F+F*F F+T
#< i >+ #< + < ( < i > + #< + < ( <+< i >) #< + < ( <+> ) #< + < ( = ) > * #< + <* < i > # #< + <* ># #< + >#
5.2.2 算符文法(OG) 1. 算符文法: 没有形如U∷=…V W…的规则的文法, 其中U、V、W∈VN。 即,任意两个非终结符号之间必有终结符号(算 符),不存在含两个相邻非终结符号的句型。 在算符文法的基础上才能应用算符优先分析技术。 例 G[E]: E::=E+T T::=T*F F::=(E)
5.1.2
讨论的前提
• 语法分析程序的输入是中间表示形式的符号串
• 讨论是以压缩了的上下文无关文法为基础
• 分析过程是从左到右逐个符号地进行规范分析
语法分析的基础文法是上下文无关文法 输入和输出 输入:词法分析程序的输出(属性字序列) 输出:识别出是句子时, 输出语法分析树或 其他内部中间表示; 出错时报错。
E+T*F*i+i中的短语和质短语? 句型分析中自动寻找质短语的思路: 先从左向右寻找质短语的尾终结符号, 再从右向左寻找质短语的头终结符号,
即,先找优先关系
(?) 再找优先关系
(?)
2.句型的识别 关于文法G[E],对输入符号串i+(i+i)*i句型分析

第五章语法自底向上方法

第五章语法自底向上方法
➢ 若有U…SiSj…: 则有Si Sj ; ➢ 若有U…SiW…:任SjFIRST(W),有Si ⊲ Sj ➢ 若有U…VW…:任SiLAST(V),
Sj(FIRST(W) {W})则有Si ⊳ Sj 输入流的开始和结束标志 ‘#’,文法的开始符为Z, ➢ SFIRST(Z),有# ⊲ S,; 且# ⊲ Z ➢ SLAST(Z),有S ⊳ #,; 且Z ⊳ #
符号栈 # #b #b( #b(a #b(M #b(Ma #b(Ma) #b(L #bM #bMb #Z
简单优先分析实例
关系
输入流

b(Hale Waihona Puke a)b#⊲(aa)b#

aa)b#

a)b#
a)b#
)b#

b#

b#
b#

#

#
5.3 LR类分析方法
•规范句型:用最右推导导出的句型(也称右句
型)。
•规范前缀:若存在规范句型,且是终极符
ISi,并做下面动作: [1] 对每个符号XSymbSet:
若ISiX非空,给ISiX标上NO,并在ISi和ISiX之间 画有向X边:ISi → ISiX。 [2] 给ISi标上OK。 ■ 重复上述步骤二,直至在LRSM中没有被标记为NO的 状态(项目集)节点为止。
S0
S1=S0a
S3
•abc[1] •abd[2] •ad[3] •bec[4] •bed[5]
活前缀 为一个或若干规范句型的前缀。
在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 串的已被分析过的部分是该文法某规范 句型的一个正确部分。

编译原理 第5章

编译原理 第5章
(3)X >·Y 当且仅当G中存在产生式A …BD…, 且B +…X和D *Y… ( X在 Y 的下层或X比 Y 先归约——规范归约/最左归约 )
例:有文法G(S):
S→bAb A→( B | a B→Aa ) 解:文法符号优先关系推导如下: (1) 求=· 关系: 由S→bAb , A→( B, B→Aa ) b =· A, A =· b, (=· B , A =· a, a =· )
自底向上的语法分析
• 核心问题
– 寻找可归约串。对“可归约串”概念的不同定义, 就形成了不同的自底向上的分析方法。在算符优 先分析法中我们用“最左素短语”来刻画“可归 约串”,在“规范归约”中,则用“句柄”来刻 画“可归约串”
分析方法
• 输入串:
abbcde
S → a A c B e A → A b|b B → d
S
b

=· <·

A
(

<· <· =·


B
a



>· =· =·
)
#
寻找句柄

<· <·

简单优先文法的定义: (1)在文法符号集中,任意两个符号之间最多只有 一种优先关系; (2)在文法中任意两个产生式没有相同的右部。
语法树结构如下:
S S S b S b
b
A b
B
b
U S0…Sj-1SjSj+1Sj+2… …Si-1SiSi+1…Sn
算符优先分析
• 我们要通过两个相邻符号SiSi+1之间的关系来找到句 柄: – SiSi+1在句柄内:必然有规则U …SiSi+1… – Si在句柄内部,但是Si+1在句柄之后:必然有规则 U …Si,且存在规范句型…USi+1…。 – 如果Si+1在句柄内,而Si在句柄外,那么必然存在 规范句型…SiU…,且U Si+1…。

编译原理自底向上的语法分析

编译原理自底向上的语法分析

规范前缀
或者终极符串
规范句型
一些相关概念
规范活前缀:满足如下条件之一的规范前缀称为规范 活前缀:
该规范前缀不包含简单短语;
该规范前缀只包含一个简单短语,而且是在该规范前缀的最 后(这个简单短语就是句柄);
Z ABb 规范活前缀:
规范前缀为 AB, ABb AB(不包含简单短语) , ABb(包含一个简单短语且在最后)
自顶向下语法分析回顾 自底向上语法分析的例子 自底向上语法分析的主要思想 自底向上语法分析的关键问题 一些相关概念
自顶向下分析例
自顶向下分析过程是从文法开始符出发,为所给输入串构造
最左推导的过程。
输入
句型
动作
P: (1) Z aBeA (2) A Bc (3) B d (4) B bB (5) B
移入型规范活前缀
归约:规范活前缀只包含一个简单短语,而且是在该规范
活前缀的最后;
可归约规范活前缀 :归约规范活前缀
Z ABb
规范前缀为 AB, ABb
规范活前缀: AB(不包含简单短语) --- 移入型规范活前缀
ABb(包含一个简单短语) --- 归约规范活前缀
自底向上分析知识关系图
推导(*)
句型(S *)
( E) E +T
每棵简单子树(只有一层的子树)的叶子节 点构成简单短语:T、E+T、i
最左简单子树的叶子节点构成句柄: T
一些相关概念
自顶向下的语法分析方法中曾介绍过: 推导:对句型中的非终极符用产生式右部替换
推导的逆过程称为归约
规范推导:一个句型的最右推导称为该句型的 规范推导; 规范推导的逆过程称为规范归约(最左归约)
分析动作:移入(shift),归约(reduce) 包含以下方法:

第5章+自底向上的语法分析

第5章+自底向上的语法分析

OPG优先关系的构造
1. 由算法构造算符优先关系 2. 由关系图构造算符优先关系(自学)
36
由算法构造算符优先关系 定义: FIRSTVT(B)={b|B=>+ b…,或B=>+ Cb…} LASTVT(B)={a|B=>+… a,或B=>+… aC} 构造优先关系: 1. ±关系:若有形如A→…ab… A→…aBb…的 产生式,则a ± b。 2. ≮关系:若有形如A→…aB…的产生式,b ∈ FIRSTVT(B),则a ≮b。 3. ≯关系:若有形如A→…Bb…的产生式,a 37 ∈ LASTVT(B),则a ≯ b。
7
自底向上分析方法的分类
寻找句柄的方法不同,就形成了不 同的自底向上分析方法。 优先分析法
简单优先分析法(句柄)
算符优先分析法(最左素短语)
LR分析法(句柄)
8
§5.2 短语、直接 短语及句柄
9
刻画“可归约串”
句型的短语 S =>* αAδ且 A =>+ β,则称β是句型αβδ 相对于非终结符A的短语。 句型的直接短语 若有A β,则称β是句型αβδ相对于非终 结符A 的直接短语。 句型的句柄 一个句型的最左直接短语称为该句型的句 柄。
直观算符优先分析法
为了易于理解算符优先分析法,先介绍 一种简单的算符优先分析法—直观算符优 先分析法。 四则运算的例子说明了运算的次序只与 运算符有关,而与运算对象无关。 因而直观算符优先分析法的关键是对一 个给定文法G,人为地规定其算符(终结符) 的优先关系,再根据任何两个可能相继出 现的终结符的优先关系对输入串进行归约。31
e
B A a S5
a

Part5语法分析自底向上的语法分析(1)解读

Part5语法分析自底向上的语法分析(1)解读

Part5.语法分析——自底向上的语法分析(1)作业1.对于文法S→A A→BA A→εB→aB B→b(1) 构造LR(1)分析表;(2) 给出用LR(1)分析表对输入符号串abab的分析过程。

2.设已给文法(1)G1[S]:S→Aa|bAc|dc|bdaA→d(2)G2[S]:S→Aa|bAc|Bc|bBaA→dB→d试证明:G1是LALR(1)文法但不是SLR(1)文法;G2是LR(1)文法但不是LALR(1)文法。

3.试为如下的文法构造LALR(1)分析表。

E→E+T|T T→TF|F F→F*|a|b4.给出下面二义文法的语法分析表:E→E sub E sup EE→E sub EE→E sup EE→{E}E→c1.1自底向上分析的基本问题自底向上的语法分析方法,也称为移动归约分析法。

最易于实现的一种移动归约分析方法,叫做算符优先分析法,而更一般的移动归约分析方法叫做LR分析法,LR分析法可以用作许多自动的语法分析器的生成器。

移动归约分析法为输入串构造分析数时是从叶结点(底端)开始,向根结点(顶端)前进。

我们可以把该过程看成是把输入串ω“归约”成文法开始符号的过程。

在每一步归约中,如果一个子串和某个产生式的右部匹配,则用该产生式的左部符号代替该子串。

如果每一步都能恰当的选择子串,我们就可以得到最右推导的逆过程。

在实现上,就是说用一个寄存符号的先进后出栈,把输入符号一个一个的移进到栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换(归约)为该产生式的左部符号。

所有不同的自底向上分析法的一个共同特点就是,便输入单词符号(移进符号栈),边归约。

也就是从左到右移进输入串的过程中,一旦发现栈顶符号呈现可归约串就立即进行归约。

1.1.1句柄和归约非形式的,一个符号串的“句柄”是和一个产生式右部匹配的子串,而且把它归约到该产生式左部的非终结符代表了最右推导逆过程的一步。

形式的说,右句型(最右推导可得到的句型)γ的句柄是一个产生式A→β以及γ的一个位置,在该位置可以找到串β,而且用A代替β可以得到γ的最右推导的前一个右句型,即如果S=>*αAω=>αβω,其中ω全部由终结符构成,那么我们就说β是句型αβω的句柄。

编译原理第五章语法分析——自下而上分析

编译原理第五章语法分析——自下而上分析

第五章语法分析——自下而上分析要紧内容:[1]自下而上分析的大体问题[2]算符优先分析法[3]算符优先分析表和优先函数的构造[4]LR分析器的大体原理大体要求:[1]明白得自下而上分析法的大体思想[2]明白得有关归约、短语、句柄、标准归约等概念[3]把握算符优先分析法[4]了解算符优先表和优先函数的构造技术[5]了解LR 分析器大体原理和工作方式教学要点:本章介绍自下而上语法分析方式。

所谓自下而上分析法确实是从输入串开始,慢慢进行“归约”,直至归约到文法的开始符号;或说,从语法树的结尾开始,步步向上“归约”,直到根结。

讲义摘要:5.1 自下而上分析大体问题自下而上分析法的大体思想:从输入串开始,慢慢进行“归约”,直到文法的开始符号。

即从树结尾开始,构造语法树。

所谓归约,是指依照文法的产生式规那么,把产生式的右部替换成左部符号。

自上而下分析的核心问题是:如何判定符号串的可归约性,和如何归约。

即,识别可归约串的问题。

归约自下而上分析法事实上确实是一种“移进-归约”法,即,采纳“移进-归约”思想进行。

实现思想是:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句型对应某产生式的右部,即栈顶生成了某产生式的右部的文法符号串),就将栈顶的这一部份替换成 (归约为) 该产生式的左部符号,这称为归约。

重复这一进程直到归约到栈中只剩文法的开始符号时那么为分析成功,也就确认输入串是文法的句子。

现举例说明。

例1:设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d试对abbcde进行“移进-归约”分析。

步骤: 1 2 3 4 5 6 7 8 9 10解:动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)表1符合栈的转变进程自下而上语法分析的进程也可看成自底向上构造语法树的进程,每步归约都是构造一棵子树,最后当输入串终止时恰好构造出整个语法树,如图1所示。

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


形如A→•[P]的项目称为归约型项目 形如A→•[P]的项目称为移入型项目 移入-归约冲突 归约-归约冲突
LRSM不能直接用于LR分析 LRSM提供的信息:
(1)合法性检查信息 [A→a] (2)移入/归约信息 [A→a]; [A→] (3)移入/归约后的转向状态信息

例:构造LR(0)状态机 SE$ EE+T ET T id T ( E )
0
T (
9
T
6
S→ E $ E→ E+T E→ T T→ id T→ ( E )
E→T
5
id
+
T→id
id
(
T→( E) E→ E+T E→ T T→ id T→ ( E )
(
E
1 3
id
E→E+ T T→ id T→ (E)
E
7
S→E $ E→E +T
+
T→(E ) E→E +T
$
2 4
T
8
)
T→(E)
S→E $
E→E+T
GE的LRSM
LRSM给出了所有的可归活前缀
LRSM中的每个状态将对应一个饱和项目集: (1)其中一部分是由先驱状态分出来 (称为基本项目); (2)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
6 S1=S0a S3 S c abc•[1] a•bc[1] b ab•c[1] ab•d[2] 7 a•bd[2] S d abd•[2] a•d[3] S4 d ad•[3] S5 c S8 bec•[4] e be•c[4] be•d[5] S9 d bed•[5]
正则式到LRSM的转换例
LRSM的性质
简单优先分析中的三种关系
Y :当且仅当存在一个产生式A→…XY… X ⊲ Y :当且仅当存在一个产生式A→…XB… 并有B+Y…。 X ⊳ Y :当且仅当存在一个产生式A→…BC… 并有B+…X,C*Y…。
X 文法G为简单优先文法如果满足:
对于任意两个语法符号X和Y,至多成立一种 优先关系; 任意两个产生式都具有不同的右部。
[1] 对每个符号XSymbSet:
若ISiX非空,给ISiX标上NO,并在ISi和ISiX之间 画有向X边:ISi → ISiX。 [2] 给ISi标上OK。 ■ 重复上述步骤二,直至在LRSM中没有被标记为NO的
状态(项目集)节点为止。
S0 •abc[1] •abd[2] a •ad[3] •bec[4] •bed[5] b S2 b•ec[4] b•ed[5]
Stack
LR分析模型
LR分析表
Action矩阵:行代表状态,列代表输入 符,而矩阵元素则表示相应的分析动作: Shift / Reduce / Accept / Error 。 GoTo矩阵:行代表状态,而列则代表语 法符号(非终极符,终极符),而矩阵 元素则表示移入或归约后的转向状态。 定义 若IS是一个LR(0)项目集,X是一个 文法符号,函数GO(IS, X)定义为 GO(IS, X)=CLOSURE(IS(X)),其中 IS(X)为LR(0)项目集IS的投影。
•两种分析方法 简单优先和LR类分析方法
例:S aAcBe [1] Ab [2] A Ab [3] Bd [4] 输入流:abbcde。 规范推导过程为:

逆过程:(符号栈,输入流)
( -, abbcde)
(a,bbcde) (ab,bcde) (aA,bcde) (aAb,cde)

优先关系矩阵 一个文法的全部优先关系可以用矩阵 来表示,称作优先关系矩阵。



例: Z bMb Z Ma Z M (L L Ma) M
L b ( a ) #
Z FIRST b LAST b
M a( aL)
L M( a )
M L
b

(
a

)
#

⊳ ⊲ ⊲ ⊲ ⊲ ⊳ ⊳ ⊳ ⊳ ⊲ ⊳

线性正则式状态机-LRSM


线性正则式:不含*符号的正则表达式
LRSM:(Linear Regular States Machine) (1)从LRSM可构造出恰好接受给定所有正 则式的确定自动机DA; (2)从LRSM的终止状态可判定接受的是哪 个正则式; (3)从LRSM的状态可判定一个正则式是不 是另一正则式的前缀。
IS = {abd[1],abc[2],bc[3],de[4],
dec[5]},
则有 : IS(a) = { abd[1], abc[2] } IS(b) = { bc[3] } IS(c) = { dec[4] }
线性正则式到LRSM的构造
给定正则式集{1,2,…n}: ■构造初始项目集 IS0={1[1],...,n[n]},并给 IS0 标上NO(表示未处理)。 ■从已构造的 LRSM 部分图选择被标为 NO 的任一项目集 ISi,并做下面动作:






定理: 设X1…XiXi+1…Xj…Xn是一个句型,若有 Xi ⊲Xi+1 Xi+2 … Xj-1 Xj ⊳Xj+1 则Xi+1Xi+2…Xj-1Xj一定是该句型的简单短语。 结论: ⊲用来确定句柄的头; 用来确定句柄 的内部; ⊳用来确定句柄的结束。

简单优先分析算法要点
活前缀的描述性定义:形成可归前缀之 前,包括可归前缀在内所有规范句型的 前缀都称为活前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 串的已被分析过的部分是该文法某规范 句型的一个正确部分。
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
第五章 自底向上分析方法
主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法
5.1 自底向上语法分析方法介绍
•基本思想 从待分析的符号串开始,自左向右进行 扫描,自下而上进行分析,通过反复查找当前句型 的句柄,并使用产生式规则将找到的句柄归约为相 应产生式的左部非终极符,直到将输入串归约为文 法的开始符。(移入-归约分析)
设当前格局是:
# X1 X2 … Xk … Xt Si0 Si1 Si2 … Sik … Sit
# X1 X2 … Xk … Xt ai Si0 Si1 Si2 … Sik … Sit S*
aiai+1…an #
移入动作:设Sit的ai输入边所指向的状态为S*
归约动作:设按A→Xk+1Xk+2…Xt进行归约,则首先归约为A
文法优先关系的确定
FIRST(W) ={S | W + S…,S(VNVT)} LAST(W) ={S | W + …S,S(VN VT)}

若有U…SiSj…: 则有Si Sj ; 若有U…SiW…:任SjFIRST(W),有Si ⊲ Sj 若有U…VW…:任SiLAST(V), Sj(FIRST(W) {W})则有Si ⊳ Sj 输入流的开始和结束标志 ‘#’,文法的开始符为Z, SFIRST(Z),有# ⊲ S,; 且# ⊲ Z SLAST(Z),有S ⊳ #,; 且Z ⊳ #
# X1 X2 … Xk A Si0 Si1 Si2 … Sik
Sik的A输出边所指向的状态设为S*,则格局变为:
# X1 X2 … Xk A Si0 Si1 Si2 … Sik S*

LR(0)分析
Input a1 … ai … an #
St Xt … …
LR分析驱动器
Output
action
goto
展望符:Lookup(S) 有效前缀集 Prefix(S) 状态Si中的项目•[P]表示部分已被输 入,而且是Si的前缀的后缀,表示待输 入部分。 可构造接受给定正则式集合的DA 严格前缀:某状态中既含有定位点在尾处 的项目又含有定位点不在尾处的项目,则 一个正则式是另一个正则式的严格前缀。

找第一个使Sj⊳Sj+1的Sj。 从Sj开始往前(左)找第一个使Si-1⊲Si的Si。

用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄SiSi+1…Sj (归约) 。
重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。

简单优先分析实例
符号栈 # 关系 输入流 b(aa)b#

识别规约活前缀的LRSM的构造
派生定理


开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
上NO。 从已构造的 LRSM 部分图选择被标为 NO 的任一状态 IS, 并做 [1] 对每个符号XVTVN,做下面动作: 1) 令ISj = CLOSURE( IS(X)),若非空。 2) 若在LRSM部分图中已有ISk与ISj有相同项目 集,则令m=k;否则构造ISj的状态点ISj, 并给ISj标上NO,同时令m=j。 x 3) 在IS和ISm之间画有向X边:IS ISm 。 [2] 给IS标上OK。 重复上一步骤,直至没有被标记为 NO 的状态节点为止。
相关文档
最新文档