1.自顶向下的文法分析 LL(1)文法
从左向右扫描,进行最左推导
2.First集
首符号集 找最左边可能出现的终结符
找First(E),就先看推导,推出来是非终结符T,然后看T的推导,F,看F的推导是(和i,因此,
First(E) = { ( , i }
以此类推,就可以得到First集,如果推导的首字母是终结符,就是终结符符号,如果是非终结符,就看非终结符的推导
3.Follow集
后跟符号集 找出该非终极符后面所能跟随的所有终结符 (看右边)
1.# ∈ Follow(S) S是识别符号
2.若存在 U - > xWy First(y) - {空串} ∈ Follow(W)
3.若存在 U - > xW 或 U -> xWy ,其中y可以推导出空串
此时,U的follow也是W的follow,因此follow(W) = follow(U)
例题举例:
4.SELECT选择符号集
求SELECT集的方法
计算出文法的所有First集和Follow集
选择符号集是针对可以有两条以及以上的产生式的时候,计算SELECT集
5.LL(1)文法
自顶向下分析技术
判断:对于每一个非终结符,它的任意两个产生式,满足可选集的交集为空集
且至多有一个能推导出来
非LL(0)文法进行等价变换为LL(1)文法
方法一:提取左公共因子(找右部的公共因子)
例题:
方法二:消除左递归
方法如下:
现在我们来看一道例题:
问我们消除左递归后的文法:
将左递归的式子分为两个,第一个式子将含E的去掉,第二个式子在补上,实际就是将左递归转变为右递归的过程,我们会创建一个非终结符,不要忘记了空串
如果是间接左递归,就先转换为直接左递归,然后再套用公式
LL(1)分析的实现:递归下降的分析,表驱动的分析
可以判断某字符串是否是文法的句子