求first fllow selsect集
时间: 2023-06-12 19:04:46 浏览: 96
首先,需要明确一下文法的定义和相关概念:
- 终结符:文法中出现在右部的不可再分解的符号。
- 非终结符:可以推导出终结符的符号。
- 产生式:非终结符推导出的符号串。
- FIRST 集:对于一个文法符号串,其最左侧的非终结符的所有可能的终结符集合。
- FOLLOW 集:对于一个非终结符,其紧随其后的所有可能的终结符集合。
- SELECT 集:对于一个产生式,其可能的最左终结符集合。
下面给出求取 FIRST、FOLLOW、SELECT 集的算法:
1. 求取 FIRST 集
- 如果 X 是终结符,则 FIRST(X) = {X}
- 如果 X 是非终结符,则对于每一个产生式 X -> Y1 Y2 ... Yk,将 FIRST(Y1) - {ε} 中的所有元素加入 FIRST(X),如果 FIRST(Y1) 中包含 ε,则将 FIRST(Y2) - {ε} 中的所有元素加入 FIRST(X),以此类推,直到某个 Ym 没有 ε 出现,将 FIRST(Ym) 中的所有元素加入 FIRST(X),如果所有 Y1 ... Yk 都可以推导出 ε,则将 ε 加入 FIRST(X)。
2. 求取 FOLLOW 集
- 对于文法的开始符号 S,将 $ 加入 FOLLOW(S)
- 对于每个产生式 A -> αBβ,将 FOLLOW(A) 中的所有元素加入 FOLLOW(B),如果 β 可以推导出 ε,则将 FOLLOW(A) 中的所有元素加入 FOLLOW(B)
- 如果文法中存在产生式 A -> αB 或 A -> αBβ,其中 β 可以推导出 ε,则将 FOLLOW(A) 中的所有元素加入 FOLLOW(B)
3. 求取 SELECT 集
- 对于每个产生式 A -> α,将 FIRST(α) 中的所有元素加入 SELECT(A),如果 α 可以推导出 ε,则将 FOLLOW(A) 中的所有元素加入 SELECT(A)
需要注意的是,对于某些文法,可能存在无法求出 FIRST、FOLLOW、SELECT 集的情况,这时需要对文法进行一定的调整。
阅读全文