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 回答