1

我是 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;
  }
4

1 回答 1

0

简而言之result.value,获取您的解析树,或者ParserException在发生错误时抛出一个。

有关更多详细信息,请查看Result的类文档,它是SuccessFailure实例。在这两种情况下,对象都包含额外的信息,例如消耗了多少输入或发生错误时出了什么问题。

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

于 2020-11-03T21:07:49.463 回答