//e = epision 空字符串 打不出来。。
’从文法开始做笔记
直接左递归需要被消除,否则会无限循环回溯。
消除方法:A→Aα等价于A→βA',A'→αA'|e【实质上是把左递归转换成了右递归】
此方法的一般形式:有A→Aα|β,将所有终结符开头的A→β后面添加新的非终结符A‘,得到A→βA’,A’=αA‘|e
此方法的缺点:引入非终结符和e产生式。
消除左递归算法(输入不含A→A和e产生式的文法,输出等价无左递归文法):
对每一个非终结符Am,对1到i-的每个j,将每个形如Ai→Ajγ替换为Ai→λ1γ,...,其中Aj→λ1,2,...k即所有的Aj产生式
人话:对每个不是结束符的符号X,查找X会产生什么,它的产生式没有非终结符的话就代入存在X的A→Xα,有非终结符X‘的话就继续查找这个X'产生什么,递归调用上面的逻辑。经此以往循环查找查找查找直到所有的符号X都被转化成终结符。
/*——————
____________*/
计算机使用递归下降分析,即对每一次的分析都进行判定,如果是非终结符就调用自身,是终结符就指针+1.但是这样的会存在回溯现象,针对这种情况可以进行预测分析。
S_文法:每个产生式的A→都以终结符开始,同一个非终结符X各个候选式子X→的首终结符都不同。
人话:A→aX|bX',X→a