【问题标题】:Left-factoring a grammar左分解一个语法
【发布时间】:2016-01-24 18:29:43
【问题描述】:

所以我有这个语法(如下),我需要建立一个解析表。我需要使它适合预测解析器。我知道第一个想法是让它明确,但对我来说它已经明确(因为我找不到可以为其绘制 2 个不同解析树的字符串)。其次,我需要将其考虑在内。我把我的猜测放在原始语法下面,我觉得我错过了一些东西,如果我错过了一些东西,有人可以指出。

S -> m G | m K p
G -> n G | n
K -> q K r | m n

我的猜测:

S -> m A
A -> G | K p 
G -> n G'
G' -> n G' | emptyString
K -> q K r | m n

【问题讨论】:

  • 我理解错了还是你有一个额外的mS -> mQQ -> mA 会给你一个额外的m,对吧?
  • 纠正我的错误,错误更新。感谢您指出这一点
  • 为什么你认为它是错误的?
  • 我试图找到第一个并关注非终端,我得到了$,除了K,我认为可能有问题,因为我没有玩过语法这么多。
  • 通过检查很明显,除了 K 之外的任何非终结符都不能跟 $ 以外的任何东西。

标签: parsing context-free-grammar ll ambiguous-grammar


【解决方案1】:

你所拥有的看起来是正确的!以下是了解如何实现目标的分步方法,以及每次转换的必要性。

首先,让我们看看我们的 S 非终结符。这个非终结符有两个以m 开头的产生式,这意味着我们在这些产生式之间存在 FIRST/FIRST 冲突。左分解产生式 S → mG 和 S → mKp 给我们

S → 毫安

A → G

A → Kp

现在,这样做是否暴露了以前不存在的任何问题?幸运的是,没有。非终结符 G 只能产生以n 开头的字符串,非终结符 K 只能产生以qm 开头的字符串。这意味着我们没有在此处引入任何 FIRST/FIRST 冲突,因此无需进一步触及任何内容 - 至少目前还没有。

接下来,让我们看看 G 非终结符,它有产生式 G → nG 和 G → n。换句话说,这会产生一串由一个或多个字母n 组成的副本。正如目前所写的那样,存在 FIRST/FIRST 冲突。我们有很多方法可以重写它。您提出的建议基本上是将其分成两部分 - 一个生成单个 n 的部分,以及生成零个或多个 n 副本的后续部分。我会按照你的做法来做这件事,它引入了一个新的非终结符,我将称之为 H 以将其与 G 区分开来:

G → nH

H → nH | ε

现在,我们不得不问 - 这个 ε 产生式是否会引入任何 FIRST/FOLLOW 冲突?要回答这个问题,我们需要确定 FOLLOW(H) 是什么。我们看到 H 只出现在产生式 H → nH(它没有给我们任何新东西)和 G → nH 的末尾,它告诉我们 FOLLOW(G) 中的所有内容也将出现在 FOLLOW(H) 中. FOLLOW(G) 中有什么? G 出现在产生式 A → G 的末尾,它告诉我们 FOLLOW(A) 中的所有内容都将在 FOLLOW(H) 中。并且 A 只出现在 S → mA 中,这意味着 FOLLOW(A) 中唯一的记号是输入结束标记 $。呸!所以跟随(H)= { $ }。这是个好消息,因为这不会与 H → nH 产生冲突。

这留下了 K 的生产规则,幸运的是它们没有任何问题。

把这些放在一起,我们得到网络转换的语法是

S &rarr mA

A → G |公里数

G → nH

H → nH | ε

K → qKr | mn

这恰好是 LL(1)。这是解析表:

     m      n       q     r      $
  +------+------+------+------+------+
S |  mA  |      |      |      |      |
  +------+------+------+------+------+
A |  Kp     G      Kp  |      |      |
  +------+------+------+------+------+
G |      |  nH  |      |      |      |
  +------+------+------+------+------+
H |      |  nH  |      |      | eps  |
  +------+------+------+------+------+
K |  mn  |      | qKr  |      |      |
  +------+------+------+------+------+

看,妈!没有冲突!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多