繁体   English   中英

计算语法的 FIRST 和 FOLLOW 集?

[英]Computing FIRST and FOLLOW sets for a grammar?

我必须计算以下语法的 FIRST 和 FOLLOW 集:

S -> ABC
A -> a | Cb | 1
B -> c | dA | 1
C -> e | f

但是,我不完全确定我是否理解如何做到这一点。 根据我的理解,我得到以下计算:

FIRST(S)= {a, e, f, b, c, d}
FIRST(A)= {a, e, f, 1}
FIRST(B)= {c, d, a, e, f, b, 1}
FIRST(C)= {e, f}

FOLLOW(S)= {$}
FOLLOW(A)= {c, d, a, e, f, b}
FOLLOW(B)= {e, f}
FOLLOW(C)= {$}

这样对吗? 我错过了什么? 如果是这样,请有人解释我错过了什么以及我将如何计算正确的 FIRST 和 FOLLOW 集? 另外,通过查看生成的集合,我如何判断它是否是 LL(1) 语法?

当 S(目标非终结符)展开时,其派生中的第一个终结符必须仅来自 A,因为这正是 S->ABC 中语法所指示的。 (除非你的语法中的“1”表示 epsilon,一个空的右边;在这种情况下,我们继续到 B 并找到 B 的第一个集合。)A 可以直接扩展到 a 和 1,并通过 C 扩展到 e 和 f . 所以第一组 S 是 a,1,e,f(所有这些终端的并集)。 语法看起来是 LL(1),因为每个实际标记似乎决定了在推导的每个步骤中使用哪个右侧。 计算所有 FIRST 集以确认此猜测。 如果同一个终结符在同一个非终结符 LHS 的两个 RHS 的 FIRST 集合中,则文法不是 LL(1),因为该终结符会导致在推导中选择使用哪个产生式时产生歧义。 LL(1) 文法必须是明确的,并且每个非终结符都有一个非空的 FIRST 条目,这意味着文法没有左递归。

请注意,不需要 FOLLOW 集,因为没有右侧为空的产生式(此类产生式可用于在 LL(1) 文法中对 LL(2) 语言进行建模,但会增加解析器的复杂性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM