我有一个生成AST树的简单PEG解析器。每个运算符都是右关联的,因此解析A + B + C + D
会返回树[1]
。有没有一种简单的方法可以将[1]
树转换为由左关联运算符[2]
创建的树?
[1] + [2] +
/ \ / \
A + + D
/ \ / \
B + + C
/ \ / \
C D A B
答案 0 :(得分:1)
PEG默认生成右关联树。您可以添加一个后处理步骤来反转它,如下所示:
{
function invert(tree, acc) {
if (acc === undefined) {
acc = tree[0]
}
if (tree.length == 1) {
return acc;
}
return invert(tree[2], [acc, tree[1], tree[2][0]]);
}
}
Start
= expr:Expression {
return invert(expr)
}
Expression
= head:Integer tail:(_ "+" _ Expression)* {
var result = [head]
for (var i = 0; i < tail.length; i++) {
result.push(tail[i][1])
result.push(tail[i][3])
}
return result;
}
Integer "integer"
= [0-9]+ { return parseInt(text(), 10); }
_ "whitespace"
= [ \t\n\r]*