LL(1)解析器如何处理Right Associative语法

时间:2017-12-03 19:04:44

标签: parsing ll

我试图找到LL(1)解析器如何处理正确的关联语法。例如,在左对联语法的情况下,像E->+TE' first()和follow()工作顺利,解析表很容易生成。但是,在右递归语法的情况下,例如,在像E->T^E/T这样的幂的情况下,解析表不能正确生成。我正在寻找资源,但发现每个例子都避免了像权力一样的正确联想。

1 个答案:

答案 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)*`。