0

FParsecが文字列に対して行うことを日付に対して行う「日付パーサー」ライブラリはありますか?

つまり、ルールを指定すると、ルールと照合されて、提供されたパターンが認識されます。


逆に、いくつかの解析ルールに基づいて日付を生成するライブラリはありますか?アイデアは、ユーザーに「リアルタイム」の完了を提供して、有効な将来のfparsecマッチングにユーザーを導くことです。

(この生成的構文解析の問題は、人里離れた構文解析サークルに名前がありますか?)

4

1 に答える 1

8

これらの種類のルールを表現するために、単純なドメイン固有言語 (DSL) を定義できます。「パーサー」に対応するタイプは、実際には日付を取り、ブール値を返す単なる関数です。

type DateClassifier = DC of (DateTime -> bool)

簡単な関数をいくつか簡単に定義できます。

// Succeeds when the date is wednesday
let wednesday = DC (fun dt -> dt.DayOfWeek = DayOfWeek.Wednesday)

// Succeeds if the date is after specified limit
let after limit = DC (fun dt -> dt > limit)

// Succeeds if the day is the specified value
let day d = DC (fun dt -> dt.Day = d)

// Takes two date classifiers and succeeds if either of them succeeds
let (<|>) (DC f) (DC g) = (fun dt -> f dt || g dt)

// Takes two date classifiers and succeeds if both of them succeed
let (<&>) (DC f) (DC g) = (fun dt -> f dt && g dt)

条件 - 「その月の 5 日後の次の水曜日」 - を指定するには、次のように実行できる、5 日以降の任意の日に成功する関数を生成するヘルパーが必要です (これは少し非効率的ですが、既存のプリミティブを使用した構成、これは素晴らしいことです):

let afterDay d = 
  [ for n in d + 1 .. 31 -> day n ] |> Seq.reduce (<|>)

あなたが説明した日にのみ成功する仕様(または「パーサー」)は次のとおりです。

after DateTime.Now (wednesday <&> afterDay 5)
于 2012-04-30T17:36:09.377 に答える