我正在为编译器做考试题。问题是找到以下语法的第一套和第二套:
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
答案 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}
。