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