使用空格作为列表分隔符

Using whitespace as a list separator

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

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

我做错了什么?我已经研究了一堆示例语法,但在任何地方都没有找到白色 space 分隔列表。

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

我建议重写为:

Parser spaces() =>
    ref0(number).separatedBy(char(' ').plus(), includeSeparators: false);
//                           add this ^^^^^^^
Parser<int> number() =>
    digit().plus().flatten().map(int.parse);
//        remove trim, here ^