C# 具有自定义字段的Sprache解析器

C# 具有自定义字段的Sprache解析器,c#,parsing,sprache,C#,Parsing,Sprache,我有一个报表服务器,它需要解析一个字符串,其中包含一些控制报表内容的参数 我正在使用解析器库sprache来帮助实现这一点。除了一件我坚持的事情外,一切都很顺利 我有一个时间过滤器,它可以是以下值之一:今天、昨天、上周、上月、无或自定义 这是给我带来一些悲伤的习俗。所有其他的都只是简单的字符串。自定义还具有“从”和“到”属性 private static readonly Parser<DataFilterEntity> TimeFilter = from fi

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

我正在使用解析器库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;
专用静态只读解析器时间过滤器=
从Parse.String(“今日”)中的过滤器返回(DataFilterEntity.today)
.Or(Parse.String(“昨天”).Return(DataFilterEntity.dayed)
.Or(Parse.String(“上周”).Return(DataFilterEntity.LastWeek)
.Or(Parse.String(“上个月”).Return(DataFilterEntity.lastmount)
.Or(Parse.String(“none”).Return(DataFilterEntity.none))
.Or(Parse.String(“custom”).Return(DataFilterEntity.custom()))())
选择过滤器;
自定义行是问题所在。我需要解析“custom”字符串,但还要解析from和to DateTime字段,并将它们传递给DataFilterEntity.custom(from,to)


非常感谢您的任何想法。

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

public静态只读解析器DateTimeParser=
从Parse.Number中的天开始
来自Parse.Char(“/”中的s1)
从Parse.Number中的月份开始
来自Parse.Char(“/”中的s2)
从解析中的年份开始。编号
选择新的日期时间(int.Parse(年)、int.Parse(月)、int.Parse(日));
公共静态只读解析器CustomParser=
来自Parse.String(“custom”).Token()中的a1
来自DateTimeParser.Token()中的fromDateTime
从DateTimeParser.Token()中的toDateTime
选择新的DataFilterEntity(fromDateTime.ToSortDateString()+“->”+toDateTime.ToStorDateString());
公共静态只读解析器时间过滤器=
parase.String(“今日”).Return(DataFilterEntity.today)
.Or(Parse.String(“昨天”).Return(DataFilterEntity.dayed)
.Or(Parse.String(“上周”).Return(DataFilterEntity.LastWeek)
.Or(Parse.String(“上个月”).Return(DataFilterEntity.lastmount)
.Or(Parse.String(“none”).Return(DataFilterEntity.none))
.或(CustomParser);;
公开无效测试()
{
var result=TimeFilter.Parse(“custom 21/3/2013 10/4/2013”);
Console.Out.WriteLine(“result.Value={0}”,result.Value);
}

您能展示这样一个“自定义”数据示例吗?自定义2012/12/25 2013/1/1第一个日期是“从”第二个“到”。然后传递给DataFilterEntity.Custom(from,to)好的,您是否收到错误,或者它是否仍然没有解析自定义内容?定制过滤器目前看起来怎么样?是指定采用这两个日期,用空格分隔,还是必须分别提供这两个日期(两个单独的参数)?由于DataFilterEntity.Custom()采用两个从和到的参数,因此无法编译上述内容。我现在无法传递它们,因为我不知道如何将sprache或表达式与进一步的解析结合起来。Nick Blumhardt是作者,我只是替他照看它。
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);
}