代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

使用空白作为列表分隔符

  •  0
  • Roger Lipscombe  · 技术社区  · 3 年前

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

    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
    

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

    0 回复  |  直到 3 年前
        1
  •  1
  •   Roger Lipscombe    3 年前

    这个 .trim() 数字解析器中的解析器使用数字前后的空格。这将阻止以空格分隔的列表解析器查找分隔的空白。

    我建议重写为:

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