首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取使用ExpressionBuilder创建的PetitParser数据结构的Dart

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

Stack Overflow用户
提问于 2020-11-04 01:37:23
回答 1查看 143关注 0票数 1

我是个刚开始使用petitparser的人,但它看起来就像是解析器的sonic螺丝刀。

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

代码语言:javascript
复制
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;
  }
EN

回答 1

Stack Overflow用户

发布于 2020-11-04 05:07:49

简而言之,调用result.value来获取解析树,或者在出现错误时抛出ParserException

有关更多详细信息,请查看Result的类文档,它既可以是Success实例,也可以是Failure实例。在这两种情况下,对象都包含额外的信息,例如消耗了多少输入,或者在发生错误的情况下出现了错误。

更新:我已经尝试澄清了有关8698f91中提到的类的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64667777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档