手动计算第一组

时间:2012-07-19 01:19:39

标签: parsing compiler-construction grammar

我有一个小问题,一直困扰我很长一段时间,而且我无法在网上找到合适的答案。

给出一个语法:

S = Sc | Eab | Db | b
D = EDcD | ca | ɛ
E = dE | DY
Y = Ed | Dad | ɛ

要找到第一组说Y,所以FIRST(Y),我是否正确,假设它是这样的:

FIRST(Y)
= FIRST(Ed) ∪ FIRST(Dad) ∪ FIRST(ɛ)
= FIRST(E) ∪ (FIRST(D)\{ɛ}) ∪ FIRST(ad) ∪ {ɛ}
= FIRST(E) ∪ (FIRST(D)\{ɛ}) ∪ {a, ɛ}

现在的问题是如何找到FIRST(E)和FIRST(D)?

1 个答案:

答案 0 :(得分:4)

因此,FIRST(E)和FIRST(D)的问题是E和D相互引用。当你想要一种“最不固定的点”时,解决方案就是常用的方法 - 从一切空的开始并继续迭代直到它们稳定下来。

即:首先,将所有FIRST集初始化为空集。现在,反复考虑每个生产并假装你当前对非终端FIRST集的估计是事实。 (实际上,它们通常会“低估”。)计算生产告诉你的第一套LHS的内容,并相应地更新你对非终端的FIRST集的估计。继续这样做,依次处理所有产品,直到你完成所有产品并且你的估算没有改变。那时,你已经完成了。

在这种情况下,这是怎么回事(假设我当然没有傻瓜)。第一遍连续产生S:{b},D:{c,ɛ},E:{c,d},Y:{c,d,ɛ}。第二个连续产生S:{b,c,d},D:{c,d,ɛ},E:{c,d,ɛ},Y:{c,d,ɛ}。第三个没有改变任何一个,所以这些是最终答案。