首先计算并遵循该语法集

时间:2018-12-20 15:32:49

标签: compiler-construction grammar

我正在为编译器做考试题。问题是找到以下语法的第一套和第二套:

S → uBDz
B → Bv | w
D → EF
E → y | e
F → x | e

这是我计算第一组时得到的:

First
S  u,v,w,y,x,z,e
B  v,w
D  y,x,e
E  y,e
F  x,e

我的讲师已经解决了,但我似乎不明白他从哪里得到答案:

   First     Follow
S  u         $
B  w         y,x,z,y
D  y,x,e     z
E  y,e       x,z
F  x,e       z

PS。 e = epsilon

PSS。这是我遵循的示例https://www.youtube.com/watch?v=dDoo5BF9T4E&t=787s

1 个答案:

答案 0 :(得分:0)

如果非终结符的扩展可以从该符号开始,则该符号位于该非终结符的第一个集合中。这就是FIRST集的定义,如果您的算法没有产生该结果,则该算法是错误的。

例如,示例语法中S的唯一产生形式是:

S → uBDz

这意味着S的每个扩展都必须以u开始。没有办法解决这个事实。跳过u并继续使用其他字符串继续生产是不可能的。因此,很容易看到FIRST(S)恰好是{u}

类似地,B有两个作品

B → Bv
B → w

这意味着B可以产生:

w
Bv → wv
Bv → Bvv → wvv
Bv → Bvvv → wvvv

,依此类推。扩展可以包含任意数量的v,但是第一个符号始终为w。因此FIRST(B)恰好是{w}