2013-03-05 51 views
2

我有一个报表服务器,需要解析一个字符串与控制报告中的内容的一些参数。Sprache分析器与自定义字段

我正在使用解析器库sprache来帮助解决这个问题。所有工作都很好,除了我被困住的一件事。

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

这是自定义,给了我一些悲伤。所有其他人都只是简单的字符串。自定义之后还有一个来自和去往的属性。

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; 

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

任何想法非常赞赏。

+0

你能展示这样一个“自定义”数据的例子吗? – Michael 2013-03-05 09:21:43

+0

定制2012/12/25 2013/1/1第一个日期是“从”第二个“到”。然后传递给DataFilterEntity.Custom(from,to) – 2013-03-05 09:23:33

+0

好的,你会得到一个错误还是它不解析定制内容?自定义过滤器如何看起来像现在这样?是否指定采用这两个日期,以空格分开,还是必须分别提供这两个日期(2个单一参数)? – Michael 2013-03-05 09:31:52

回答

6

您需要先为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); 
} 
+0

我是绿色的...谢谢迈克。伟大的图书馆BTW。 :) – 2013-03-05 10:11:40

+0

Nick Blumhardt是作者,我只是为他照顾它。 – 2013-03-05 10:37:01