我可以使用 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
我究竟做錯了什么?我挖掘了一堆示例語法,但在任何地方都沒有找到以空格分隔的串列。
uj5u.com熱心網友回復:
.trim()數字決議器中的決議器在數字前后消耗空格。這可以防止空格分隔的串列決議器找到分隔空格。
我建議重寫為:
Parser spaces() =>
ref0(number).separatedBy(char(' ').plus(), includeSeparators: false);
// add this ^^^^^^^
Parser<int> number() =>
digit().plus().flatten().map(int.parse);
// remove trim, here ^
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374036.html
