清华大学编译原理第七章 LR分析法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
同一文法采用的LR分析器不同时,分析表也将不同。分析 表由动作表(ACTION)和状态转换表(GOTO)组成,在 计算机里常用二维数组表示。
(3)分析栈:包括文法符号栈和相应的状态栈。都为先进
后出栈。
分析器的动作由栈顶状态和当前输入符号 决定。 LR分析器的关键部分是LR分析表的构造。
LR分析器模型
栈
SP
Input#
Si Xm 总控程序 … … S1 X1 S0 #
状态 文法符号
output
ACTION GOTO LR分析表
SP:栈指针 S[i]:状态栈 X[i]:文法符号栈
产 生 式 表
文法要求
shift-reduce or reduce-reduce 冲突(conflicts)
分析程序不能决定是shift 还是 reduce
(2) α 0为文法的开始符号 (3)对任何j,0<j<=n, α
j-1是从α j
经把句柄替换为相应产生式的左部而得到的
LR分析表中动作表的四种动作
(1)移进:
把Sj=GOTO[Si,a]移入到状态栈,把a移入到文法符号 栈。(i,j表示状态号)
(2)规约:
在确定当前句柄时进行的替换操作。
(3)接受acc:
LR(K)的含义:
L表示由左向右处理输入;
R表示生成了最右推导; 数字K表示使用了先行的K个符号。
LR分析法同样要用到先行集合(FIRST集合)和 后跟集合(FOLLOE集合)。
SLR(1)是“简单LRwenku.baidu.com1)”的简写,是对LR
(1)分析的改进。
LALR(1)即先行LR(1),是比SLR(1)分析
第7章 LR分析法
7.1 LR类分析法
LR分析法根据当前分析栈和输入串来确定 句柄。 LR分析过程是一种规范规约过程。 LR分析法适用于大多数无二义性的上下文 无关文法。 常用的LR分析法有:
(1)LR(0)分析法 (2)SLR(1)分析法 (3)LALR(1)分析法 (4)LR(1)分析法
Reduce的一个特殊情况:栈中的全部内容w 归约为开始符号S (即施用 S → w) ,且 没有余留输入了,意味着已成功分析了整个 输入串. 移进归约分析中还会出现一种情况,就是出 错,比如当前的token不能构成一个合法句 子的一部分,例如上面的文法,试分析 int+)时就会发生错误。
STACK
若使用了E → T,在栈中形成的(E+E不是规范句 型的活前缀(viable prefixes) (E+E不能和任何产生式的右端匹配 (E+E)不是 规范句型 活前缀:是规范句型(右句型)的前缀,但不超 过句柄
移进归约分析的栈中出现的内容加上余留输入 构成规范句型
规范推导 规范句型 规范归约
最右推导:在推导的任何一步α β ,其中α 、β 是句型,都是对α 中 的最右非终结符进行替换。 最右推导被称为规范推导。
当规约到文法符号栈中只剩文法的开始符号时,并且输 入符号串已结束即当前输入符号是“#”,则分析成功。
(4)报错:
当遇到状态栈顶为某一状态下不该遇到的文法符号时, 说明输入串不是该文法的一个句子,则报错。
LR分析器
一个LR分析器由3个部分组成:
程序都是相同的。
(1)总控程序:也称驱动程序。对所有的LR分析器总控 (2)分析表(或分析函数):不同的文法其分析表不同,
Shift Shift Reduce: Reduce: Shift Shift Reduce: Reduce: Shift Reduce: Reduce: Reduce:
T → int E→T
T → int E→E+T T → (E) E→T S→E
8 9 9
(E + T
(E
)# Reduce:E → E + T why?不用 E → T )#
由规范推导所得的句型称为规范句型
G[S]: S→E E→E+T|T T→(E)|int SE T (E) (E+T) (E+int) (T+int) (int+int)
规范归约
假定α 是G的一个句子,称序列α 如果该序列满足:
( 1) α
n
n
,α
n-1
…,α 0是 α 的一个规范归约
= α
稍微强大但却比一般LR(1)分析简单的方法。
S→E
E→T|E+T
T → int | (E)
Reduce: 如能找到一产生式 A → w 且栈中的内容是 qw (q 可能为空), 则可以将其归约为 qA。即倒过 来用这个产生式。 如上例, 若栈中内容是 (int ,我们使用产生式 T → int 并把栈中内容归约为(T Shift: 如不能执行一个归约且在输入串中还有 token , 就把它从输入串移到栈中。 如上例,假定栈中内容是 ( ,输入中还有 int+int)#.不 能对( 执行一个归约,因为它不和任何产生式的右 端匹配,所以把输入的第一个符号移到栈中,于是栈 中内容是 (int ,而余留的输入是 +int)# 。
LR(0)分析表的结构
LR(0)分析法采用规范规约。
LR(0)分析表的构造思想和方法是构造其它LR
分析表的基础。 LR(0)分析表分为两个部分:
(1)ACTION(动作表)部分: 列标志为文法的终结符号以及输入结束符#。表中的元 素为某个状态或某条规则,或接受标志acc。 (2)GOTO(转换表)部分: 列标志为非终结符号。表中的元素为要装入的状态。
或者分析程序归约时有多个产生式可选
例子 ( dangling else) :
S → if E then S | if E then S else S
如输入if E then if E then S else S 分析某一时刻,栈的内容:if E then if E then S 而 else 是下一 token 归约还是移进?
REMAINING INPUT
PARSER ACTION
1 (int + int)# 2 ( int + int)# 3 (int + int)# 4 (T + int)# 5 (E + int)# 6 (E + int)# 7 (E + int )# 8 (E + T )# 9 (E )# 10 (E) # 11 T # 12 E # 13 S #
(3)分析栈:包括文法符号栈和相应的状态栈。都为先进
后出栈。
分析器的动作由栈顶状态和当前输入符号 决定。 LR分析器的关键部分是LR分析表的构造。
LR分析器模型
栈
SP
Input#
Si Xm 总控程序 … … S1 X1 S0 #
状态 文法符号
output
ACTION GOTO LR分析表
SP:栈指针 S[i]:状态栈 X[i]:文法符号栈
产 生 式 表
文法要求
shift-reduce or reduce-reduce 冲突(conflicts)
分析程序不能决定是shift 还是 reduce
(2) α 0为文法的开始符号 (3)对任何j,0<j<=n, α
j-1是从α j
经把句柄替换为相应产生式的左部而得到的
LR分析表中动作表的四种动作
(1)移进:
把Sj=GOTO[Si,a]移入到状态栈,把a移入到文法符号 栈。(i,j表示状态号)
(2)规约:
在确定当前句柄时进行的替换操作。
(3)接受acc:
LR(K)的含义:
L表示由左向右处理输入;
R表示生成了最右推导; 数字K表示使用了先行的K个符号。
LR分析法同样要用到先行集合(FIRST集合)和 后跟集合(FOLLOE集合)。
SLR(1)是“简单LRwenku.baidu.com1)”的简写,是对LR
(1)分析的改进。
LALR(1)即先行LR(1),是比SLR(1)分析
第7章 LR分析法
7.1 LR类分析法
LR分析法根据当前分析栈和输入串来确定 句柄。 LR分析过程是一种规范规约过程。 LR分析法适用于大多数无二义性的上下文 无关文法。 常用的LR分析法有:
(1)LR(0)分析法 (2)SLR(1)分析法 (3)LALR(1)分析法 (4)LR(1)分析法
Reduce的一个特殊情况:栈中的全部内容w 归约为开始符号S (即施用 S → w) ,且 没有余留输入了,意味着已成功分析了整个 输入串. 移进归约分析中还会出现一种情况,就是出 错,比如当前的token不能构成一个合法句 子的一部分,例如上面的文法,试分析 int+)时就会发生错误。
STACK
若使用了E → T,在栈中形成的(E+E不是规范句 型的活前缀(viable prefixes) (E+E不能和任何产生式的右端匹配 (E+E)不是 规范句型 活前缀:是规范句型(右句型)的前缀,但不超 过句柄
移进归约分析的栈中出现的内容加上余留输入 构成规范句型
规范推导 规范句型 规范归约
最右推导:在推导的任何一步α β ,其中α 、β 是句型,都是对α 中 的最右非终结符进行替换。 最右推导被称为规范推导。
当规约到文法符号栈中只剩文法的开始符号时,并且输 入符号串已结束即当前输入符号是“#”,则分析成功。
(4)报错:
当遇到状态栈顶为某一状态下不该遇到的文法符号时, 说明输入串不是该文法的一个句子,则报错。
LR分析器
一个LR分析器由3个部分组成:
程序都是相同的。
(1)总控程序:也称驱动程序。对所有的LR分析器总控 (2)分析表(或分析函数):不同的文法其分析表不同,
Shift Shift Reduce: Reduce: Shift Shift Reduce: Reduce: Shift Reduce: Reduce: Reduce:
T → int E→T
T → int E→E+T T → (E) E→T S→E
8 9 9
(E + T
(E
)# Reduce:E → E + T why?不用 E → T )#
由规范推导所得的句型称为规范句型
G[S]: S→E E→E+T|T T→(E)|int SE T (E) (E+T) (E+int) (T+int) (int+int)
规范归约
假定α 是G的一个句子,称序列α 如果该序列满足:
( 1) α
n
n
,α
n-1
…,α 0是 α 的一个规范归约
= α
稍微强大但却比一般LR(1)分析简单的方法。
S→E
E→T|E+T
T → int | (E)
Reduce: 如能找到一产生式 A → w 且栈中的内容是 qw (q 可能为空), 则可以将其归约为 qA。即倒过 来用这个产生式。 如上例, 若栈中内容是 (int ,我们使用产生式 T → int 并把栈中内容归约为(T Shift: 如不能执行一个归约且在输入串中还有 token , 就把它从输入串移到栈中。 如上例,假定栈中内容是 ( ,输入中还有 int+int)#.不 能对( 执行一个归约,因为它不和任何产生式的右 端匹配,所以把输入的第一个符号移到栈中,于是栈 中内容是 (int ,而余留的输入是 +int)# 。
LR(0)分析表的结构
LR(0)分析法采用规范规约。
LR(0)分析表的构造思想和方法是构造其它LR
分析表的基础。 LR(0)分析表分为两个部分:
(1)ACTION(动作表)部分: 列标志为文法的终结符号以及输入结束符#。表中的元 素为某个状态或某条规则,或接受标志acc。 (2)GOTO(转换表)部分: 列标志为非终结符号。表中的元素为要装入的状态。
或者分析程序归约时有多个产生式可选
例子 ( dangling else) :
S → if E then S | if E then S else S
如输入if E then if E then S else S 分析某一时刻,栈的内容:if E then if E then S 而 else 是下一 token 归约还是移进?
REMAINING INPUT
PARSER ACTION
1 (int + int)# 2 ( int + int)# 3 (int + int)# 4 (T + int)# 5 (E + int)# 6 (E + int)# 7 (E + int )# 8 (E + T )# 9 (E )# 10 (E) # 11 T # 12 E # 13 S #