本次笔记内容:
4-4 FIRST集和FOLLOW集
4-5 递归的预测分析法
4-6 非递归的预测分析法
4-7 预测分析法中的错误处理
本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析_2.pdf
文章目录
承接上一节课。上一节课提出了FIRST集
和FOLLOW集
的概念,这节课先来讨论如何计算这两个集合。
FIRST集和FOLLOW集的计算
计算文法符号X的FIRST(X)
- FIRST(X):可以从X推导出的所有串首终结符构成的集合;
- 如果 X ⇒ ∗ ϵ X \Rightarrow * \epsilon X⇒∗ϵ,那么ε∈FIRST(X)。
取决于产生式的右部:
- 比如2、4、5产生式,
左部以终结符打头
,这个终结符就是就是产生式可以推导出的终结符,于是加入到 FIRST 集合中
; - 对于非终结符,其依赖于自己的内容,比如F的FIRST为 {( id} ,则 T 的 FIRST 也为这个; E 依赖于 T ,则 E 的 FIRST 也是这个。
算法总结
不断应用下列规则,直到没有新的终结符或ε可以被加入到任何FIRST集合中为止。
- 如果X是一个终结符,那么FIRST ( X ) = { X };
- 如果X是一个非终结符,且X→Y1…Yk∈P(k≥1),那么如果对于某个i,a在FIRST (Yi ) 中且ε 在所有的FIRST(Y1) , … , FIRST(Yi-1)中(即Y1…Yi-1 ⇒ \Rightarrow ⇒* ε ),就把a加入到FIRST( X )中。如果对于所有的j = 1,2, . . . , k,ε在FIRST(Yj)中,那么将ε加入到FIRST( X );
- 如果X→ε∈P,那么将ε加入到FIRST( X )中。
接着,计算串X1X2 …Xn的FIRST 集合
- 向FIRST( X 1 X 2 X 3 X_1X_2X_3 X1X2X3)加入FIRST( X 1 X_1 X1