您好,欢迎来到伴沃教育。
搜索
您的当前位置:首页LL(1)文法条件与FIRST集和FELLOW集的介绍

LL(1)文法条件与FIRST集和FELLOW集的介绍

来源:伴沃教育

LL(1)文法是一种自顶向下的解析方法,它要求文法满足一定的条件,以确保解析过程没有歧义。LL(1)文法的三个条件是:

1. 文法没有左递归

2. 任何非终结符的First集之间没有交集

3. 对于任何非终结符,它的所有产生式的First集的并集与该非终结符的Follow集的交集为空。

 

First集:

First集是指对于文法中的某个非终结符,能够从它推导出的字符串中第一个出现的终结符的集合。如果这个非终结符能够推导出空字符串(ε),那么ε也包含在它的First集中。

 

Follow集:

Follow集是指对于文法中的某个非终结符,所有可能紧跟在它后面的终结符的集合。如果这个非终结符在某个产生式的末尾,那么它的Follow集中包含结束符号(通常用 # 表示)。

 

为了更好地理解LL(1)文法的第二和第三个条件,我将通过一个具体的例子来详细说明。

第二个条件:任何非终结符的产生式的First集之间没有交集

    这个条件要求对于同一个非终结符的所有产生式,它们的First集不能有共同的元素。这样在构建预测分析表时,我们可以根据输入符号直接决定使用哪个产生式,而不会产生冲突。

第三个条件:对于任何非终结符,它的所有产生式的First集的并集与该非终结符的Follow集的交集为空

    这个条件要求对于一个非终结符的所有产生式的First集的并集(即所有产生式的First集合并在一起),与该非终结符的Follow集的交集必须是空集。这意味着,如果一个符号既出现在某个非终结符的某个产生式的First集中,又出现在该非终结符的Follow集中,那么在解析时会产生冲突。

 

让我们通过一个完整的文法例子来说明LL(1)文法的第二个和第三个条件。

文法例子

考虑以下文法:

E -> TE'

E' -> +TE' | ε

T -> FT'

T' -> *FT' | ε

F -> (E) | i

这里,E、T、F 是非终结符,而 +、*、(、)、i 是终结符,ε 表示空字符串。

第一步:计算 First 集

1. First(E):E 推导出 TE',所以 First(E) = First(T)。

2. First(E'):E' 推导出 +TE' 或 ε,所以 First(E') = {+, ε}。

3. First(T):T 推导出 FT',所以 First(T) = First(F)。

4. First(T'):T' 推导出 FT' 或 ε,所以 First(T') = {, ε}。

5. First(F):F 推导出 (E) 或 i,所以 First(F) = {(, i}。

第二步:计算 Follow 集

1. Follow(E):E 是开始符号,所以 Follow(E) = {#}。

2. Follow(E'):E' 在 E -> TE' 中出现,所以 Follow(E) = {#} 并入 Follow(E')。另外,E' 在 E' -> +TE' 中出现,由于 T' 可以推导出 ε,Follow(T) 也并入 Follow(E')。因此,Follow(E') = {#, )}。

3. Follow(T):T 在 E -> TE' 中出现,由于 E' 可以推导出 ε,Follow(E) 并入 Follow(T)。T 还在 T -> FT' 中出现,由于 T' 可以推导出 ε,Follow(T) 并入 Follow(T)。因此,Follow(T) = {+, #, )}。

4. Follow(T'):T' 在 T -> FT' 中出现,由于 F 不能推导出 ε,所以只有 First(F) 中的元素并入 Follow(T')。另外,T' 在 T' -> FT' 中出现,由于 T' 可以推导出 ε,Follow(T) 并入 Follow(T')。因此,Follow(T') = {, +, #, )}。

5. Follow(F):F 在 T -> FT' 中出现,由于 T' 可以推导出 ε,Follow(T) 并入 Follow(F)。另外,F 在 F -> (E) 中出现,由于 E' 可以推导出 ε,Follow(E) 并入 Follow(F)。因此,Follow(F) = {*, +, #, )}。

第三步:检查 LL(1) 文法条件

1. 检查 First 集的交集:

对于 E,First(E) = First(T) = {(, i},没有交集。

对于 E',First(E') = {+, ε},没有交集。

对于 T,First(T) = First(F) = {(, i},没有交集。

对于 T',First(T') = {*, ε},没有交集。

对于 F,First(F) = {(, i},没有交集。

2. 检查 First 集的并集与 Follow 集的交集:

对于 E,First(E) ∪ First(E') = {+, (, i, ε},与 Follow(E) = {#} 没有交集。

对于 T,First(T) ∪ First(T') = {*, (, i, ε},与 Follow(T) = {+, #, )} 没有交集。

对于 F,First(F) = {(, i},与 Follow(F) = {*, +, #, )} 没有交集。

由于所有的 First 集之间没有交集,并且 First 集的并集与对应的 Follow 集没有交集,这个文法满足LL(1)文法的条件。

通过这个例子,我们可以看到如何计算 First 集和 Follow 集,并且如何检查文法是否满足LL(1)文法的条件。

 

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务