将AST树转换为另一个AST树

时间:2016-12-20 20:18:34

标签: parsing tree abstract-syntax-tree peg

我有一个生成AST树的简单PEG解析器。每个运算符都是右关联的,因此解析A + B + C + D会返回树[1]。有没有一种简单的方法可以将[1]树转换为由左关联运算符[2]创建的树?

[1]  +        [2]       +
    / \                / \
   A   +              +   D
      / \            / \
     B   +          +   C
        / \        / \
       C   D      A   B

1 个答案:

答案 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]*