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

时间:2012-01-29 20:17:51

标签: grammar disjoint-sets

我有三个语法:

A - > aB | b | CBB

B - > aB | ba | ABB

C - > aaA | b | CAB

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

这就是我到目前为止......

A - > aB | b | CBB

首先(aB)= a

首先(b)= b

首先(CBB)= aaA = a

这是我遇到麻烦的人。我做了正确的CBB吗?如果是这样,我会说他们相交了规则未通过测试。 (右?)

B - > aB | ba | ABB

首先(aB)= a

first(ba)= b

首先(aBb)= a

他们是交叉的&因此规则未通过测试。

C - > aaA | b | CAB

首先(aaA)= a

首先(b)= b

首先(caB)= c

他们没有相交&因此规则通过

2 个答案:

答案 0 :(得分:7)

测试的目的是看看,在查看第一个终端时,您可以判断使用哪个规则(LL的要求)。对于B来说很明显,有两个规则可以应用于终端a;它也非常明显,C的每个规则都以不同的终端开始。你可以看到C(以及CBB)可能的第一个终端与A的其他规则重叠。

底线:看起来不错(但是,如果你在CBB的一个终端停了下来并碰巧选择了c,你就会得出错误的结论)。

答案 1 :(得分:0)

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