Sprache: Как исключить буквы из числовых совпадений?

Использование монадического синтаксического анализатора 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);
}

Есть какие-нибудь подсказки?

1 ответ

Решение

Если цель состоит в том, чтобы принять только одно число, то для исключения завершающего текста используйте .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);

Не проверено - но, надеюсь, достаточно, чтобы идти в правильном направлении.

Другие вопросы по тегам