使用成对不相交测试来确定语法是否是LL



我有三种语法:

A->aB|b|CBB

B->aB|ba|aBb

C->aaA|b|caB

我需要"通过执行成对不相交测试来确定[它们]是否是LL语法,显示每个非终结符的每个RHS的第一组。

这就是我目前所拥有的。。。

A->aB|b|CBB

第一(aB)=

第一个(b)=b

第一个(CBB)=aaA=

这就是我遇到麻烦的那个。我做CBB正确吗?如果是这样的话,我会说它们相交&该规则未通过测试。(对吗?)

B->aB|ba|aBb

第一(aB)=

第一个(ba)=b

第一(aBb)=

它们是相交的&因此该规则未通过测试。

C->aaA|b|caB

first(aaA)=

第一个(b)=b

第一个(caB)=c

它们不相交&因此该规则通过

测试的重点是查看第一个终端,是否可以判断使用哪个规则(LL的要求)。对于B来说,很明显有2条规则可以应用于终端a;同样显而易见的是,C的每个规则都以不同的终端开始。你可以看到,C(以及CBB)可能的第一个终端与A的其他规则重叠。

一句话:看起来不错(尽管,如果你在CBB的一个终端停下来,碰巧选择了c,你会得出错误的结论)。

我相信A规则的FIRST集是{A}、{b}和{A、b、c}。语法不是LL,因为它没有通过成对不相交测试,因为至少有一个交集。事实上,在这种情况下有两个相交的终端,a和b。

最新更新