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 に答える