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);
Не проверено - но, надеюсь, достаточно, чтобы идти в правильном направлении.