private static Parser <Parser <Row> > HeaderParser(ParsersBase p) { var dateParser1 = DateParser(p, false); var temperatureParser1 = TemperatureParser(p, true); var rowParser1 = p.Map2(dateParser1, () => temperatureParser1, Row.MakeRowFunc); var temperatureParser2 = TemperatureParser(p, false); var dateParser2 = DateParser(p, true); var rowParser2 = p.Map2(temperatureParser2, () => dateParser2, Flip(Row.MakeRowFunc)); var columnTitlesParser = ColumnTitlesParser(p); return(columnTitlesParser.Map(cols => { var colsList1 = cols.ToList(); if (colsList1.SequenceEqual(new[] { "Date", "Temperature" })) { return rowParser1; } if (colsList1.SequenceEqual(new[] { "Temperature", "Date" })) { return rowParser2; } return p.Fail <Row>(""); })); }
private static Parser <Json> JsonRoot(ParsersBase p) { return(p.Whitespace().SkipL( () => JsonObject(p) | (() => JsonArray(p)) | (() => p.Fail <Json>("expected an object or an array")))); }
private static Parser <Json> JsonValue(ParsersBase p) { return (JsonLiteral(p) | (() => JsonArray(p)) | (() => JsonObject(p)) | (() => p.Fail <Json>("expected a literal or an array or an object"))); }
private static Parser <Json> JsonObject(ParsersBase p) { return(p.Surround( p.Token(p.String("{")), p.Token(p.String("}")), () => JsonKeyValue(p).SepBy(p.Token(p.String(","))) .Map(kvs => new JObject(kvs.ToDictionary(kv => kv.Item1, kv => kv.Item2)) as Json)) .Scope("object")); }
private static Parser <Json> JsonArray(ParsersBase p) { return(p.Surround( p.Token(p.String("[")), p.Token(p.String("]")), () => JsonValue(p).SepBy(p.Token(p.String(",")))) .Map(vs => new JArray(vs) as Json) .Scope("array")); }
private static Parser <Json> JsonLiteral(ParsersBase p) { return(p.Scope( "literal", p.Token(p.String("null")).As(new JNull() as Json) | (() => p.Double().Map(n => new JNumber(n) as Json)) | (() => p.Token(p.Quoted()).Map(s => new JString(s) as Json)) | (() => p.Token(p.String("true")).As(new JBool(true) as Json)) | (() => p.Token(p.String("false")).As(new JBool(false) as Json))) | (() => p.Fail <Json>("expected a literal"))); }
private static Parser <IEnumerable <string> > ColumnTitlesParser(ParsersBase p) { var beginLineCommentParser = p.Token(p.String("#")); var commaParser = p.Token(p.String(",")); var columnTitleParser = p.Token(p.Quoted() | (() => p.R(@"(\w+)"))); return(p.Whitespace() .SkipL( () => beginLineCommentParser.SkipL( () => columnTitleParser.SepBy(commaParser)))); }
public TemplateParser(ParsersBase p) { _p = p; }
private static Parser <Tuple <string, Json> > JsonKeyValue(ParsersBase p) { return(p.Quoted().Product(() => p.SkipL(p.Token(p.String(":")), () => JsonValue(p)))); }
private static Parser <int> TemperatureParser(ParsersBase p, bool lastColumn) { var temperatureParser = p.Int(); return(lastColumn ? temperatureParser : AddOptionalCommaTokenSuffix(p, temperatureParser)); }
private static Parser <DateTime> DateParser(ParsersBase p, bool lastColumn) { var dateParser = p.R(@"\d{1,2}/\d{1,2}/\d{4}").Map(DateTime.Parse); return(lastColumn ? dateParser : AddOptionalCommaTokenSuffix(p, dateParser)); }
private static Parser <TA> AddOptionalCommaTokenSuffix <TA>(ParsersBase p, Parser <TA> thingParser) { return(thingParser.SkipR(() => p.OptionMaybe(p.Token(p.String(","))))); }