给定文法S->S+S|SS|(S)|S*|a,计算该文法的first和follow集
时间: 2023-10-20 12:05:53 浏览: 255
首先,计算该文法的First集合:
- First(S) = { (, a }
- First(S+S) = First(S) = { (, a }
- First(SS) = First(S) = { (, a }
- First((S)) = { ( }
- First(S*) = { (, a }
- First(a) = { a }
因此,该文法的First集合为:
```
First(S) = { (, a }
First(S') = { (, a }
```
接下来,计算该文法的Follow集合:
- Follow(S) = { $, ), * }
- Follow(S') = { $, ), * }
因此,该文法的Follow集合为:
```
Follow(S) = { $, ), * }
Follow(S') = { $, ), * }
```
相关问题
给定文法G【S】:S→S+S |SS|(S)|S*|a 计算该文法的FIRST和FOLLOW集。(注意:FIRST和FOLLOW的计算对象)
首先,我们需要理解什么是 FIRST 和 FOLLOW 集。
- FIRST 集:对于文法中的每个非终结符,找出它能够推导出的所有字符串的最左边(即最开始)的终结符。如果一个非终结符能够推导出 ε(空串),那么 ε 也应该包含在这个非终结符的 FIRST 集中。
- FOLLOW 集:对于文法中的每个非终结符,找出所有能够紧跟在它后面的终结符。如果一个非终结符在某个产生式的最右边,那么应该把这个非终结符后面的终结符添加到它的 FOLLOW 集中。同时,如果一个非终结符在某个产生式的中间位置,那么应该把它后面所有能够推导出 ε 的非终结符的 FOLLOW 集也加入到它的 FOLLOW 集中。
下面是文法 G【S】的产生式:
S → S + S | S S | (S) | S* | a
接下来分别计算该文法的 FIRST 和 FOLLOW 集。
FIRST 集的计算:
- FIRST(S) = { (, a }
- FIRST(S + S) = { (, a }
- FIRST(S S) = { (, a }
- FIRST((S)) = { ( }
- FIRST(S*) = { (, a }
- FIRST(a) = { a }
FOLLOW 集的计算:
- FOLLOW(S) = { $, ), + }
- FOLLOW(S + S) = { $, ), + }
- FOLLOW(S S) = { $, ), + }
- FOLLOW((S)) = { ), $, + }
- FOLLOW(S*) = { ), $, + }
- FOLLOW(a) = { ), +, $ }
其中,$ 表示输入串的结束符号。
给定文法G【S】:S→S+S | S S | ( S ) |S*|a 计算该文法的FIRST和FOLLOW集。(注意:FIRST和FOLLOW的计算对象)
首先,我们需要了解一下什么是FIRST集和FOLLOW集:
- FIRST集:对于文法中的每个非终结符和终结符,求出它所能推导出的最左串的首符号集合,这个集合就是这个符号的FIRST集。
- FOLLOW集:对于文法中的每个非终结符,求出在任何一个句型中紧跟在它后面的所有终结符的集合,这个集合就是这个非终结符的FOLLOW集。
接下来,我们按照如下步骤计算该文法的FIRST和FOLLOW集:
1. 求出所有终结符的FIRST集和FOLLOW集
终结符的FIRST集和FOLLOW集都是它本身,即:
- FIRST(a) = {a}
- FOLLOW(a) = {}
2. 求出所有可以直接推导出终结符的非终结符的FIRST集
根据该文法,可以直接推导出终结符的非终结符有S和(。
- FIRST(S) = {a, (}
- FIRST(()) = {(}
3. 求出所有可以通过推导和ε产生式间接推导出终结符的非终结符的FIRST集
根据该文法,可以通过推导和ε产生式间接推导出终结符的非终结符只有S。
- FIRST(S) = {a, (, ε}
4. 求出所有非终结符的FOLLOW集
根据该文法,S是起始符号,所以将$加入S的FOLLOW集。
对于每个非终结符:
- 对于S,FOLLOW(S) = {$, ), +}
- 对于(,FOLLOW(() = {a, (}
- 对于),FOLLOW()) = {$, ), +}
- 对于*,FOLLOW(*) = {a, (, )}
综上所述,该文法的FIRST和FOLLOW集为:
- FIRST(S) = {a, (, ε}
- FIRST(()) = {(}
- FIRST(*) = {*}
- FIRST(+) = {+}
- FIRST(a) = {a}
- FOLLOW(S) = {$, ), +}
- FOLLOW(()) = {a, (}
- FOLLOW()) = {$, ), +}
- FOLLOW(*) = {a, (, )}
- FOLLOW(+) = {a, (, *)}
注意,这里的ε表示空串。
阅读全文