130 likes | 362 Views
主要内容. 识别规约活前缀的 LRSM 的构造. 派生定理. 开始符产生式的右部是归约活前缀。 如果 A 是归约活前缀,且 A→ 是产生式, 则 也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是 : S → 1 | 2 | … | n RPS G ={ 1 , … , n } { |ARPS G ,A → P }. 例有文法 G[s]: S → aAc [1] A → Abb [2] A → b [3]. 可归前缀集: aAc
E N D
主要内容 • 识别规约活前缀的LRSM的构造
派生定理 • 开始符产生式的右部是归约活前缀。 • 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 • 任何归约活前缀,都可按上述方式被派生。 • 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
例有文法G[s]: S → aAc[1] A → Abb[2] A → b[3] 可归前缀集: aAc aAbb ab
LR(0)项目:若A→是产生式, 则称A→为LR(0)项目(简称项目),也 写作[p]形式。 • 项目集的投影:假设IS是LR(0)项目集,则 称下面IS(X)为IS关于X的投影集: IS(X) = { A→X | A→X IS, X (VTVN ) }. • 项目集的闭包:假设IS是LR(0)项目集,则 称下面CLOSURE(IS)为IS的闭包集: CLOSURE(IS)= IS {A→ | Y→ACLOSURE(IS) A→是产生式 }
两个重要的性质 • 归约活前缀的性质:若A是归约活前 缀,A→是产生式,则也是归约活 前缀。 • 活前缀状态机性质:若有 Prefix(ISi ),且A→ISi ,则 是归约活前缀。
若有 Prefix(ISi ),Y→AISi ,则 根据性质2—(活前缀状态机的性质), A是归约活前缀。再根据派生原理,若 A→是A的产生式,则也是归约活前缀。 • 构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点: • 构造初始状态IS0:IS0=CLOSURE({Z→S}),并给IS0标上NO。 • 从已构造的LRSM部分图选择被标为NO的任一状态IS,并做 [1] 对每个符号XVTVN,做下面动作: 1) 令ISj = CLOSURE( IS(X)),若非空。 2) 若在LRSM部分图中已有ISk与ISj有相同项目 集,则令m=k;否则构造ISj的状态点ISj, 并给ISj标上NO,同时令m=j。 3) 在IS和ISm之间画有向X边:IS ISm 。 [2] 给IS标上OK。 • 重复上一步骤,直至没有被标记为NO的状态结点为止。 x
例:构造LR(0)状态机 S E # E E + T E T T id T ( E )
0 2 5 9 3 1 6 7 8 4 T T ( ( id id E id ( E + + # T ) S→ E # E→ E+T E→ T T→ id T→ ( E ) T→( E) E→ E+T E→ T T→ id T→ ( E ) E→E+ T T→ id T→ (E) S→E # E→E +T T→(E ) E→E +T E→T E→E+T T→(E) T→id S→E # GE的LRSM
LRSM给出了所有的可归活前缀 • LRSM中的每个状态将对应一个饱和项目集: (1)其中一部分是由先驱状态分出来 (称为基本项目); (2)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在产 生式右部的最左侧。
形如A→•[P]的项目称为归约型项目 • 形如A→•[P]的项目称为移入型项目 • 移入-归约冲突 • 归约-归约冲突 • LRSM不能直接用于LR分析 • LRSM提供的信息: (1)合法性检查信息 [A→a] (2)移入/归约信息 [A→a]; [A→] (3)移入/归约后的转向状态信息
设当前格局是: 移入动作:设Sit的ai输入边所指向的状态为S* 归约动作:设按A→Xk+1Xk+2…Xt进行归约,则首先归约为A Sik的A输出边所指向的状态设为S*,则格局变为:
文法定义如下: Z → S S → (S) S | 构造该文法的LR(0)状态机,要求不含有空输出边。