1

使用单子解析器Sprache,寻找匹配数字字符(0..9),不包括非数字字符,但前导或尾随空格是可以的。

我认为这应该工作:

public static readonly Parser<string>
    Number = Parse.Numeric.Except(Parse.Letter).AtLeastOnce().Text().Token();

或这个:

public static readonly Parser<int>
    Number = Parse.Number.Select(int.Parse).Token();

两者都适用于我能想到的所有情况,除了尾随文本:

[Test]
public void Number_ParseNumberWithTrailingLetter_WasUnsuccessfull()
{
    var input = new Input("123bogus");
    IResult<string> result = Lexicon.Number(input);
    Assert.IsFalse(result.WasSuccessful);
}

有什么线索吗?

4

1 回答 1

2

如果目标是只接受一个数字,那么要消除尾随文本,请使用一个.End()子句,它断言已到达字符串的末尾:

public static readonly Parser<int> MatchInt =
      Parse.Number.Select(int.Parse).Token().End();

相反,如果您想接受输入流中的后续数字(由空格分隔),则可以使用.Then()子句为您提供所有这些数字。就像是:

public static readonly Parser<int> MatchInt = Parse.Number.Select(int.Parse).Token();
public static readonly Parser<IEnumerable<int>> MatchIntList = 
      from int1 in MatchInt
      from intRest in Parse.WhiteSpace.AtLeastOnce().Then(_ => MatchInt).Many().End()
      select new List<int>() { int1 }.Concat(intRest);

未经测试 - 但希望足以朝着正确的方向发展。

于 2013-04-08T03:54:59.847 回答