/// <summary> /// Parses the day expression. /// Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday /// </summary> /// <returns></returns> public override Expr Parse() { var name = _tokenIt.ExpectId().ToLower(); // 1. Day of week : "monday" or "Monday" etc. if (_days.ContainsKey(name)) { return(new ConstantExpr(_days[name])); } // 2. DateTime ( today, yesterday, tommorrow ) var dateTime = _dayAliases[name](); TimeSpan time = TimeSpan.MinValue; if (_tokenIt.NextToken.Token.Text != "at") { return(new ConstantExpr(dateTime)); } time = TimeExprPlugin.ParseTime(_parser, true, true); dateTime = new DateTime(dateTime.Year, dateTime.Month, (int)dateTime.Day, time.Hours, time.Minutes, time.Seconds); return(new ConstantExpr(dateTime)); }
/// <summary> /// Parses a date. /// </summary> /// <param name="parser"></param> /// <returns></returns> public static DateTime ParseDate(ILangParser parser) { var year = DateTime.Now.Year; var month = DateTime.Now.Month; double day = DateTime.Now.Day; var time = new TimeSpan(0, 0, 0); var tokenIt = parser.TokenIt; TokenData n = null; if (tokenIt.NextToken.Token.Kind == TokenKind.LiteralDate) { var parsedDate = (DateTime)tokenIt.NextToken.Token.Value; year = parsedDate.Year; month = parsedDate.Month; day = parsedDate.Day; } else { // 1. 1st token is definitely month name in long or short form. "oct" or "october". var monthNameOrAbbr = tokenIt.ExpectId(true, true); month = _months[monthNameOrAbbr.ToLower()]; // 2. Check for "," after month. if (tokenIt.NextToken.Token == Tokens.Comma) { tokenIt.Advance(); } // 3. 2nd token is the day 10. day = tokenIt.ExpectNumber(false); // 4. Check for "st nd rd th" as in 1st, 2nd, 3rd 4th for the day part. n = tokenIt.Peek(); var text = n.Token.Text.ToLower(); if (text == "st" || text == "nd" || text == "rd" || text == "th") { tokenIt.Advance(); } // 5. Check for another "," after day part. n = tokenIt.Peek(); var n2 = tokenIt.Peek(2); // IMPORTANT: Make sure not to interpret the "," as feb 12, if the the "," is part of a comma in array/map. if (n.Token == Tokens.Comma && n2.Token.Type == TokenTypes.LiteralNumber) { tokenIt.Advance(); } // 6. Finally check for year n = tokenIt.Peek(); if (n.Token.Type == TokenTypes.LiteralNumber) { year = Convert.ToInt32(n.Token.Text); tokenIt.Advance(); } } // 8. Now check for time. n = tokenIt.Peek(); if (n.Token.Text == "at") { time = TimeExprPlugin.ParseTime(parser, true, true); } else { tokenIt.Advance(); } var date = new DateTime(year, month, (int)day, time.Hours, time.Minutes, time.Seconds); return(date); }