第五章LR方法.ppt

第五章LR方法

* * * * * * * * * * * * LR(0)分析的例子 状态栈 符号栈 输入流 分析动作 0 abac# 移入 02 a bac# 移入 027 ab ac# 归约 (4) 025 aB ac# 移入 0256 aBa c# 归约(3) 023 aA c# 移入 0234 aAc # 归约(1) 01 S # 归约(0) 01 Z # 接受 P: (0) Z ?S (1) S? aAc (2)A ? ABb (3)A ? Ba (4)B ? b a b a c LR(0) 分析表 action表 goto表 LR(0) 分析表 action表 终极符 状 态 a1 … # S1 … Sn action(Si,a) = Sj, 如果Si到Sj有a输出边 action(Si,c) = Rp, 如果Si是p-归约状态,c?Vt ?{#} action(Si,#) = accept, 如果Si是接受状态 action(Si,a) = error, 其他情形 LR(0) 分析表 goto表 非终极符 状 态 A1 … S1 … Sn goto (Si, A) = Sj, 如果Si到Sj有A输出边 goto (Si, A) = error,如果Si没有A输出边 LR(0)分析表的例子 VT = {a, b, c} VN = {S, A, B} S = S P: { (1) S? aAc (2)A ? ABb (3)A ? Ba (4)B ? b } Z ? ?S S ? ?aAc Z ? S? S a S ? a?Ac A? ?ABb A? ?Ba B? ?b A S ? aA?c A? A?Bb B? ?b b B A ? B?a a A ? Ba ? B ? b? S ? aAc? c B A ? AB?b b A ? ABb? b 0 1 2 3 5 6 7 8 9 4 action表 goto表 a b c # S A B 0 S2 1 1 accept 2 S7 3 5 3 S7 S4 8 4 R1 R1 R1 R1 5 S6 6 R3 R3 R3 R3 7 R4 R4 R4 R4 8 S9 9 R2 R2 R2 R2 LR(0) 分析驱动程序 符号约定: S0: 开始状态 Stack:状态栈 Stack(top):栈顶元素 P:产生式 | P |:产生式P右部符号个数; PA:产生式P左部非终极符; Push(S):把状态S压入stack; Pop(n):从stack弹出n个栈顶元素; LR(0) 分析驱动程序 初始化: push(S0); a = readOne(); L: Switch action(stack(top), a) Case error: error(); Case accept: return true; Case Si: push(Si), a=readOne(); goto L; Case RP: pop(|P|); push(goto(stack(top), PA )); goto L; LR(0) 分析过程 状态栈 输入流 分析动作 0 abac# S2 02 bac# S7 027 ac# R4,Goto(3, B)=5 025 ac# S6 0256 c# R3,Goto(3, A)=3 023 c# S4 0234 # R1, Goto(0, S)=1 01 # Accept P: (0) Z ?S (1) S? aAc (2)A ? ABb (3)A ? Ba (4)B ? b a b a c * * * * * * * * * * * * * * * * * * * * * * * 第五章 自底向上的语法分析 5.1 自底向上的语法分析方法概述 5.2 LR(0)分析的有限自动机 5.3 LR(0) 分析 5.4 SLR(1) 分析 5.5 LR(1) 分析 5.6 LALR(1) 分析 5.7 LALR(1) 语法分析器的自动生成器 (YACC) 内容回顾 自底向上的分析过程 LR分析机制 LR分析的关键问题 自底向上语法分析的例子 P: Z ? ABb (2) A ? a (3) A ? b (4)

文档评论(0)

1亿VIP精品文档

相关文档