自顶向下
上下文无关文法
CFG本质上就是产生式的集合,规定了一个非终结符的形式,规定了它可以长什么样子,比如下图的E→EAE,就表明了E这个语法结构(非终结符),他的基本形式应该是 E 搭配 A 搭配 E。
推导:根据单词序列,从开始符号选择合适的产生式进行替换,比如:输入的单词串时 num – num + num,我们的产生式就是 E→E+E | E-E | digit,根据输入的单词串我们可以知道我们应该先选择第一个产生式,再选择第二个产生式,最后选择第三个产生式(实际情况不能这么做,人眼可以),总之,推导就是用产生式进行替换。
语法树
对应着推导过程
NFA→CFG
预测分析法
预测分析法就是从开始符号开始,依次选择产生式知道匹配到单词串,问题就是怎么选择产生式,每次都要匹配太过麻烦,而且,如果产生式右部的第一个单词也是非终结符会需要不停的向下搜索,直至是终结符,这十分麻烦,所以,我们选择用first集和follow集进行判定.
first集,顾名思义,就是这个非终结符通过一系列产生式(包括继续递归的产生式)能够产生的第一个终结符,所以,根据first集很容易进行产生式的选择,follow集,顾名思义,就是找到该非终结符后面会直接跟随的符号,比如A→Bc,B的follow集就是{c},follow集的作用就是确定ε产生式,选择了这个产生式就意味着这个推导到这里就结束了,结束在类似于非终结符的地方
所以,我们可以知道,我们根据first集和follo集合判断产生式的选择
预测分析表的使用
预测分析表的构造
根据first和follow
改写CFG
原因
我们可以看到,如果采用预测分析法,对于文法的使用有很多要求,比如,如果有两个产生式的first集有交集,那么在产生式的选择上就会有多种选择,如果,A→Ac,这样就会导致无限度的递归,也要消除
消除二义性
只能依靠按照语法的本质更改文法,没有特殊算法。
消除左递归
消除左公因子
消除空产生式
这里面注意回溯
消除回路