LR(0)分析表的构造

本文详细介绍了LR(0)分析表的构造过程,包括文法规范句型的活前缀、LR(0)项目的分类以及LR(0)分析表的生成步骤。通过对闭包函数和状态转移函数的定义,解析了识别文法规范句型活前缀的DFA,并阐述了如何避免分析表中的多重定义问题。
摘要由CSDN通过智能技术生成

文法规范句型的活前缀

  • 字符串的前缀是指字符串的任意首部,例如字符串"abc"的前缀有 ϵ \epsilon ϵaababc
  • 规范语句活前缀是指规范语句的前缀,这种前缀不包括句柄右边的任何符号

在LR分析工作过程中的任何时刻,栈中的文法符号应是某一规范句型的活前缀。这是因为一旦句型句柄在栈的顶部形成,就会立即被规约,因此只要输入串已扫描过得部分保持可规约成一个活前缀,那就意味着所扫描过的部分是正确的。这样一来,我们对句柄的识别就变成对规范句型活前缀的识别

LR(0)项目

活前缀与句柄之间的关系存在三种情况:

  1. 活前缀中已经含有句柄的全部符号,表明此时某一规则 A → α A\rightarrow{\alpha} Aα的右部符号串 α \alpha α已经出现在栈顶,其相应的分析动作使用此规则进行规约
  2. 活前缀中只含有句柄的一部分符号,此时意味着形如 A → α 1 α 2 A\rightarrow{\alpha_1\alpha_2} Aα1α2规则的右部子串 α 1 ! \alpha_1! α1!已出现在栈顶,正期待着从剩余的输入串中进行规约得到 α 2 \alpha_2 α2
  3. 活前缀中全然不含有句柄的任何符号,此时意味着期望从剩余输入串中能看到由某规则 A → α A\rightarrow{\alpha} Aα的右部 α \alpha α所推出的符号串

为了刻画在分析过程中,文法的一个规则右部符号串已有多大一部分被识别,我们可在文法中每个规则右部适当位置加一个圆点来表示。针对上述3中情况,标有圆点的规则分别为:

A → α ⋅ A \rightarrow{\alpha·} Aα
A → α 1 ⋅ α 2 A \rightarrow{\alpha_1·\alpha_2} Aα1α2
A → ⋅ α A \rightarrow{·\alpha} Aα

文法G中右部标有圆点的规则称为G的一个LR(0)项目

注:规则 A → ϵ A\rightarrow{\epsilon} Aϵ仅有LR(0)项目 A → ⋅ A\rightarrow{·} A

不同的LR(0)项目反映了在分析过程中栈顶的不同情况,因此,可以根据圆点后是终结符还是非终结符,将一个文法的全部LR(0)项目进行分类:

  1. 规约项目:形如 A → α ⋅ A \rightarrow{\alpha·} A
  • 12
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值