核心概念
增广文法
对于起始符号为 的文法 ,增加一条产生式 ,初始符号设为 ,得到增广文法
活前缀
若 ,且 ,则 的任何前缀均为活前缀
- 直观上讲,活前缀是一个右句型的前缀,且或不包含句柄,或句柄是它的后缀。它不能包含句柄后的任何符号。
LR(0) FSM 的构造
- 一个 LR(0) 项目是在右端某一位置有圆点的产生式
- 产生式 对应 4 个 LR(0) 项目:
- 圆点标志着已分析过的串与该产生式匹配的位置
- 根据圆点所在位置和圆点后是否是终结符分为以下几种:
- 移进项目:
- 待约项目:
- 归约项目:
- 接受项目:
- LR(0) FSM 的状态是一个 LR(0) 项目集的闭包,计算方法:
- 对于项目集 ,重复:对于其中每个项目 和产生式 ,加 到 中,直到没有新项目加入
- 初态:
- 转移函数:,其中
- 从初态开始重复遍历所有状态和文法符号 可以构造出所有状态
增广文法的每个活前缀都有唯一对应的状态。
LR(0) 分析表的构造
,状态 对应的 LR(0) 分析表的栈顶状态为
- 若项目 且 , 为终结符,则
- 若项目 ,则对任何终结符 ,,其中 为第 个产生式
- 若项目 ,则
- 若 , 为非终结符,则
- 其余位置为
LR(0) 文法
按上述算法构造的分析表,如果各表项无多重定义,则称该文法为一个 LR(0) 文法
LR(0) FSM 中,每个状态满足:
- 不同时含有移进项目和归约项目
- 不含有两个以上归约项目