0

我可以使用 dart-petitparser 成功解析逗号分隔的列表,但是当遇到空格分隔的列表时,相同的代码会失败:

class MyDefinition extends GrammarDefinition {
  @override
  Parser start() => throw UnsupportedError('Not yet.');

  Parser commas() =>
      ref0(number).separatedBy(char(','), includeSeparators: false);
  Parser spaces() =>
      ref0(number).separatedBy(char(' '), includeSeparators: false);
  Parser<int> number() => digit().plus().flatten().trim().map(int.parse);
}
  test('commas', () {
    var defn = MyDefinition();
    var parser = defn.build(start: defn.commas);
    expect(parser.parse("7,4,9,5").value, [7, 4, 9, 5]);  // PASS
  });

  test('spaces', () {
    var defn = MyDefinition();
    var parser = defn.build(start: defn.spaces);
    expect(parser.parse("7  4 9    5").value, [7, 4, 9, 5]); // FAIL
  });

它失败并显示以下内容:

  Expected: [7, 4, 9, 5]
    Actual: [7]
     Which: at location [1] is [7] which shorter than expected

我究竟做错了什么?我已经挖掘了一堆示例语法,并没有在任何地方找到以空格分隔的列表。

4

1 回答 1

1

数字解析器中的.trim()解析器在数字前后消耗空格。这可以防止空格分隔的列表解析器找到分隔空格。

我建议重写为:

Parser spaces() =>
    ref0(number).separatedBy(char(' ').plus(), includeSeparators: false);
//                           add this ^^^^^^^
Parser<int> number() =>
    digit().plus().flatten().map(int.parse);
//        remove trim, here ^
于 2021-12-05T21:31:37.287 回答