3

我有一个报表服务器,它需要解析一个带有一些参数的字符串,这些参数控制报表中的内容。

我正在使用解析器库语言来帮助解决这个问题。一切都很好,除了我坚持的一件事。

我有一个时间过滤器,它可以是以下值之一:今天、昨天、上周、上个月、无或自定义。

习惯让我有些悲伤。所有其他的只是简单的字符串。Custom 之后还有一个 from 和 to 属性。

   private static readonly Parser<DataFilterEntity> TimeFilter =
        from filter in Parse.String("today").Return(DataFilterEntity.Today)
            .Or(Parse.String("yesterday").Return(DataFilterEntity.Yesterday)
            .Or(Parse.String("last week").Return(DataFilterEntity.LastWeek)
            .Or(Parse.String("last month").Return(DataFilterEntity.LastMonth)
            .Or(Parse.String("none").Return(DataFilterEntity.None))
            .Or(Parse.String("custom").Return(DataFilterEntity.Custom())))))
        select filter;

自定义行是问题所在。我需要解析“自定义”字符串,然后解析 from 和 to DateTime 字段并将它们传递给 DataFilterEntity.Custom(from, to)

任何想法都非常感谢。

4

1 回答 1

7

您需要先为 DateTime 创建一个解析器,然后再为您的自定义类型创建一个解析器。这是一个“可能可行的最简单的事情”示例。您可能希望 DateTimeParser 在它接受的值方面更加具体。我不知道您的 DataFilterEntity 的构造函数是什么样的,所以我猜想:)

public static readonly Parser<DateTime> DateTimeParser =
    from day in Parse.Number
    from s1 in Parse.Char('/')
    from month in Parse.Number
    from s2 in Parse.Char('/')
    from year in Parse.Number
    select new DateTime(int.Parse(year), int.Parse(month), int.Parse(day));

public static readonly Parser<DataFilterEntity> CustomParser =
    from a1 in Parse.String("custom").Token()
    from fromDateTime in DateTimeParser.Token()
    from toDateTime in DateTimeParser.Token()
    select new DataFilterEntity(fromDateTime.ToShortDateString() + " -> " + toDateTime.ToShortDateString());

public static readonly Parser<DataFilterEntity> TimeFilter =
    Parse.String("today").Return(DataFilterEntity.Today)
        .Or(Parse.String("yesterday").Return(DataFilterEntity.Yesterday)
        .Or(Parse.String("last week").Return(DataFilterEntity.LastWeek)
        .Or(Parse.String("last month").Return(DataFilterEntity.LastMonth)
        .Or(Parse.String("none").Return(DataFilterEntity.None))
        .Or(CustomParser))));

public void TestIt()
{
    var result = TimeFilter.Parse("custom 21/3/2013 10/4/2013");
    Console.Out.WriteLine("result.Value = {0}", result.Value);
}
于 2013-03-05T10:06:30.187 回答