diff --git a/lib/DateTime/Parse.rakumod b/lib/DateTime/Parse.rakumod index f2eb12b..7293763 100644 --- a/lib/DateTime/Parse.rakumod +++ b/lib/DateTime/Parse.rakumod @@ -3,10 +3,13 @@ my class X::DateTime::CannotParse is Exception { method message() { "Unable to parse {$!invalid-str}" } } -class DateTime::Parse is DateTime { +#use Grammar::Tracer; + +role DateTime::Parse is DateTime { grammar DateTime::Parse::Grammar { token TOP { - | | | | | | + | | | | | + | } token rfc3339-date { @@ -81,6 +84,10 @@ class DateTime::Parse is DateTime { \w+ } + token date { + | | | | | | + } + token date1 { # e.g., 02 Jun 1982 <.SP> <.SP> } @@ -105,6 +112,10 @@ class DateTime::Parse is DateTime { '/' '/' } + token date7 { + <.TH> <.SP> <.SP> + } + token time { ':' ':' } @@ -125,6 +136,10 @@ class DateTime::Parse is DateTime { 'Jan' | 'Feb' | 'Mar' | 'Apr' | 'May' | 'Jun' | 'Jul' | 'Aug' | 'Sep' | 'Oct' | 'Nov' | 'Dec' } + token month-long { + \w* + } + token D4-year { \d ** 4 } @@ -144,6 +159,10 @@ class DateTime::Parse is DateTime { token D2 { \d ** 2 } + + token TH { + 'st' | 'nd' | 'rd' | 'th' + } } class DateTime::Parse::Actions { @@ -194,6 +213,10 @@ class DateTime::Parse is DateTime { make { year => $.made, month => $.made, day => $.made } } + method date($/) { + make { year => $.made, month => $.made, day => $.made } + } + method date1($/) { # e.g., 02 Jun 1982 self!genericDate($/); } @@ -218,6 +241,10 @@ class DateTime::Parse is DateTime { self!genericDate($/); } + method date7($/) { # e.g. 28th Mar 2023 + self!genericDate($/); + } + my %timezones = UTC => 0, GMT => 0, @@ -285,6 +312,10 @@ class DateTime::Parse is DateTime { make %month{~$/} } + method month-long($/) { + make %month{~$/} + } + method day($/) { make +$/ } diff --git a/t/01-basic.t b/t/01-basic.t index a2237a7..c362331 100644 --- a/t/01-basic.t +++ b/t/01-basic.t @@ -15,6 +15,10 @@ my $rfc3339_2 = '1996-12-19T16:39:57-08:00'; is DateTime::Parse.new('Sun', :rule), 6, "'Sun' is day 6 in rule wkday"; is DateTime::Parse.new('06 Nov 1994', :rule).sort, {"day" => 6, "month" => 11, "year" => 1994}.sort, "we parse '06 Nov 1994' as rule date1"; +is DateTime::Parse.new('20th September 2023', :rule).sort, + {"day" => 20, "month" => 9, "year" => 2023}.sort, "we parse '20th September 2023' as rule date7"; +is DateTime::Parse.new('20th September 2023', :rule).sort, + {"day" => 20, "month" => 9, "year" => 2023}.sort, "we parse '20th September 2023' as rule date"; is DateTime::Parse.new('08:49:37', :rule