我试图找到LL(1)解析器如何处理正确的关联语法。例如,在左对联语法的情况下,像E->+TE'
first()和follow()工作顺利,解析表很容易生成。但是,在右递归语法的情况下,例如,在像E->T^E/T
这样的幂的情况下,解析表不能正确生成。我正在寻找资源,但发现每个例子都避免了像权力一样的正确联想。
答案 0 :(得分:3)
LL算法处理右递归,没有任何问题。实际上,您提到的转换将左关联语法转换为右关联语法,并且需要通过在语义规则中转换语法树来恢复左关联性语法。因此,如果制作真的是正确关联的,那么您可以使用相同的语法,而无需对树进行后处理。
let first = [|0.02;0.03;0.05;0.07;0.11|]
let second = [|0.30;0.50;0.70;1.10;1.30|]
let diff2 = Array.scan (fun (prv, _) cur -> cur, cur - prv) (0., 0.) second
(first, diff2.[1..])
||> Array.map2 (fun x (y, dy) ->
if y < 1. then x - 0.37 * dy else 0. )
// val it : float [] = [|-0.091; -0.044; -0.024; 0.0; 0.0|]
的问题不在于它是正确的递归。问题是两个右侧以相同的非终端开始,使得预测变得不可能。解决方案是左因子分解,它将产生E->T^E/T
T(^ T)*`。