- 第一部分·如何求FIRST集
*FIRST集可以包含空符号ε
FIRST是针对产生式右部的一个函数,在构造LL(1)分析表的时候十分重要。但实际过程中,还是需要先求产生式头部的FIRST集合,这有利于对右部的求解。
- 终结符的FIRST集合就是它本身
- 如果求产生式右部字符串的FIRST集合,那就是第一个终结符(此实可能是非终结符的形式,那就产生了递归)
- 如果求产生式左部的FIRST集合,那就是产生式右边的第一个终结符,同2
- 抽象算法:
- 第二部分·如何求FOLLOW集
*FOLLOW集没有空符号ε
FOLLOW是针对于非终结符的一种函数,对于非终结符,有三种可能的情况:
1.非终结符就是一个产生式的开始符号
将句子的结束符号(#)加入到该非终结符的FOLLOW集中
2.非终结符后紧跟了一个非空字符串a
将FIRST(a)并入到FOLLOW集合中
3.非终结符后没有符号,或者跟了一个可空的字符串
将FOLLOW(开始符号)并入FOLLOW集合中
抽象算法如下:
- 第三部分·如何构造LL(1)分析表
- 首先画出表格,表格的左列是每一个产生式的左部(不重复),表格的横行是每一个终结符号。
- 接着逐个考察所有产生式。
- 抽象算法:
对于G中的每一个产生式, A -> α ,执行以下2步:
1.for ∀ a ∈ FIRST(α), 将 A -> α 填入 M [A, a ];
//对逐个产生式进行考察,考察产生式的FIRST集合的元素,在找到的元素的对应表格中填写该产生式
2. if(ε ∈ FIRST(α))
∀ a ∈ FOLLOW (A) , 将 A -> ε 填入 M [A, a ];
//如果发现产生式的FIRST集中包含空符号,就查找该产生式头部的FOLLOW集合中的元素,在元素的对应表格中填写空产生式