以下设置过程



我知道有很多问题,但我仍然无法找到我想要的东西。

至于为给定语法查找 Follow 集的过程,我已经看过很多版本,但让我们坚持使用这里给出的版本,因为它是我见过最多的版本。我将它复制到此处,这样您就不必打开它:

  1. 首先将 $(输入标记的末尾(放入 Follow(S((S 是开始符号(
  2. 如果有一个生产 A → aBb,(其中 a 可以是整个字符串(,那么 FIRST(b( 中除了 ε 之外的所有内容都放在 FOLLOW(B( 中。
  3. 如果有一个生产 A → aB,那么 FOLLOW(A( 中的所有内容都在 FOLLOW(B( 中
  4. 如果有一个生产 A → aBb,其中 FIRST(b( 包含 ε,那么 FOLLOW(A( 中的所有内容都在 FOLLOW(B( 中

问题 1:规则 2 和规则 4 是相互排斥的,还是它们都可以在同一个"迭代"中应用(这样写,因为这实际上是我的问题之一(?我这里的意思是它们在第一部分匹配,也就是说,它们都应用"如果有生产 A -> aBb"。

这是否意味着,如果我遇到生产 A -> aBb 使得ε在 First(b( 中,我应该同时应用第二条和第四条规则,或者只应用第四条规则?

问题2:"a"和"b"到底是什么?它没有在规则 2 中部分指定,其中它说"a 可以是整个字符串"。规则 3 和 4 呢?实际上,让我进一步概括这个问题。如果我有表格的生产: A -> abcd....efgBxyzw.....这些规则中的任何一个都可以应用吗?也就是说,这些规则是否要求生产在其右侧仅包含三个元素?或者可以这样解释:

A -> abcd...ef [gBx] yzw...,其中 gBx 部分现在对应于规则 2 和 4 中的 aBb 部分。或者这仅适用于规则 2 并且仅适用于"a"部分,例如:

A -> abcd....ef[gBx] ,其中左部分可以是整个字符串,而右部分必须正好是一个符号?

注意:方括号不是语法的一部分,我只是用它们来分隔东西,这样我就可以解释我的意思。

问题3:这个过程甚至是确定性的吗?问题是,他们没有提到我们应该这样做多长时间以及以什么顺序。好吧,实际上,我已经看到一些消息来源说"只要还有什么要补充的"。我们应该这样做的顺序呢?我想我们只是随机进行生产并尽可能长时间地应用它们。我们是否应该尝试从我们拥有的语法规则中得出进一步的产品?还是该程序旨在间接"捕获"这些东西?这里还有一件非常令人困惑的事情。让我们看一下以下场景:

我正在查看一个作品,通过应用规则,我确定 Follow(A( 中的所有内容都应该进入 Follow(B(。让我们非正式地将其写成:

关注(B( += 关注(A(

现在(根据我的最新计算(让 Follow(A( 包含一些元素,比如 {x, y, z}。我应该立即写 Follow(B( = {..., x, y, z} 还是应该等到最后?为什么?好吧,如果,几个作品之后,我遇到一个以任何方式修改 Follow(A( 的作品,假设它添加了"w",所以现在 Follow(A( = {x, y, z, w}。这是否意味着,假设我已经立即编写了 Follow(B( = {..., x, y, z} 而不是等待,我现在需要回到那里并向其添加"w",或者该过程是否应该在以后的一些迭代中"捕获"该"w"?

提前谢谢。

问题 1:不可以,它们不能在同一迭代中应用。那是因为其中except for ε部分意味着如果没有ε。

问题2:">a"和"b"是α(alpha(和β(beta(。它们都代表多个符号。(就像A → Z b B n m可以A → α B β;Z b缩短为αn m缩短为β(。所以不,它不仅限于 rhs 上的 3 个符号。

问题3:是的,这是贬义的。你要做的是,你有一个映射(比如std::unordered_map来存储跟随集(,然后你开始一个while循环——条件是在当前迭代期间对跟随集进行了更改。在循环体内部,你放了规则。举个例子:

follow_sets = {} # map
changes = True
while changes:
changes = False
# follow set rules
# once a rule is applied, and things are added to the follow sets map, set changes to True

现在,您的规则集很好,但描述性不够。这是我用来构建关注集的规则集:

Follow(START) has $
If A → α B β (Provided β ≠ ε):
Follow(B) → First(β)
If A → α B:
Follow(B) → Follow(A)
If A → α B β (provided β → ε):
Follow(B) → { First(β) - ε } ∪ First(A)

最新更新