Dart PetitParser 获取使用 ExpressionBuilder 创建的 AST 数据结构

Dart PetitParser to get at AST datastructure created with ExpressionBuilder

我是 petitparser 的新手,但它看起来像是解析器的声波螺丝刀。

对于我的第一个项目,我正在构建代码来解析一个简单的表达式,该表达式构建我的 Node 对象的 AST 树,然后使用一些规则遍历该树以最小化不需要的括号。我不知道将什么传递给 .parse() 的输出(似乎是一个结果)来访问我定义的树,所以我可以在 AST 的顶部调用 .visit() 。有什么想法吗?

class RIPParser {
  Parser _make_parser() {
    final builder = ExpressionBuilder();

    // precedence 5
    builder.group()
      ..primitive(digit()
          .plus()
          .seq(char('.').seq(digit().plus()).optional())
          .flatten()
          .trim()
          .map((a) => Node(precedence: 5, value: a)))
      ..wrapper(char('(').trim(), char(')').trim(),
          (l, a, r) => Node(precedence: 5, left: l, value: a, right: r));
    // negation is a prefix operator
    // precedence 4
    builder.group()
      ..prefix(
          char('-').trim(), (op, a) => Node(precedence: 4, value: '$op$a'));

    // power is right-associative
    // precedence 3
    builder.group()
      ..right(char('^').trim(),
          (a, op, b) => Node(precedence: 3, left: a, value: op, right: b));

    // multiplication and addition are left-associative
    // precedence 2
    builder.group()
      ..left(char('*').trim(),
          (a, op, b) => Node(precedence: 2, left: a, value: op, right: b))
      ..left(char('/').trim(),
          (a, op, b) => Node(precedence: 2, left: a, value: op, right: b));
    // precedence 1
    builder.group()
      ..left(char('+').trim(),
          (a, op, b) => Node(precedence: 1, left: a, value: op, right: b))
      ..left(char('-').trim(),
          (a, op, b) => Node(precedence: 1, value: op, left: a, right: b));

    final parser = builder.build().end();

    return parser;
  }

  Result parse(String input) {
    var parser = _make_parser();
    var result = parser.parse(input);
    return result;
  }

简而言之调用 result.value 获取您的 parse-tree,或者在出现错误时抛出 ParserException

有关详细信息,请查看 Result, which is either a Success or a Failure 实例的 class 文档。在这两种情况下,对象都包含额外的信息,例如消耗了多少输入或出现错误时出了什么问题。

更新:我试图澄清 8698f91 中提到的 classes 的文档。