首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带自定义字段的Sprache解析器

带自定义字段的Sprache解析器
EN

Stack Overflow用户
提问于 2013-03-05 17:19:23
回答 1查看 1.9K关注 0票数 3

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

我正在使用解析器库sprache来帮助实现这一点。一切都很好,除了一件事我被卡住了。

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

是风俗习惯给了我一些悲哀。其他的都是简单的字符串。Custom还具有from和to属性。

代码语言:javascript
复制
   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)

任何想法都非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-05 18:06:30

您需要首先为DateTime创建一个解析器,然后为您的自定义类型创建一个解析器。这里有一个“可能工作的最简单的东西”的例子。您可能想让DateTimeParser在它接受的值中更具体一些。我不知道DataFilterEntity的构造函数是什么样子,所以我猜到了:)

代码语言:javascript
复制
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);
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15219976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档