// Input
// ...
Input = _{ SOI ~ Expr* ~ EOI }
WordExpr = _{
ASCII_ALPHA+
}
Expr = _{
WHITE_SPACE*
~ (AtTimeExpr | WordExpr | DurationExpr)
~ WHITE_SPACE*
}
// Duration
// ...
Hours = {
"hour" ~ "s"?
| "hr" ~ "s"?
| "h"
}
Minutes = {
"minute" ~ "s"?
| "min" ~ "s"?
| "m"
}
Seconds = {
"second" ~ "s"?
| "sec" ~ "s"?
| "s"
}
Duration = {
"-"?
~ ASCII_DIGIT*
~ ("." ~ ASCII_DIGIT*)?
}
DurationExpr = {
Duration
~ WHITE_SPACE*
~ (Hours | Minutes | Seconds)
}
// At Time
// ...
AtHours = {
ASCII_DIGIT+
}
AtMinutes = {
ASCII_DIGIT+
}
TimeValue = _{
AtHours
~ ":"?
~ AtMinutes?
}
Pm = { "PM" | "pm" }
Am = { "AM" | "am" }
AtTime = {
TimeValue
~ (WHITE_SPACE* ~ (Am | Pm))?
}
AtTimeExpr = {
"at"
~ WHITE_SPACE+
~ AtTime
~ (WHITE_SPACE+ ~ TimezoneLikeExpr)?
}
// Timezone
// ...
TimezonePositive = { "+" }
TimezoneNegative = { "-" }
TimezoneSign = _{ TimezonePositive | TimezoneNegative }
TimezoneUTCLiteral = _{ ^"utc" }
TimezoneHours = { ASCII_DIGIT{1,2} }
TimezoneHours2 = { ASCII_DIGIT{2} }
TimezoneMinutes = { ASCII_DIGIT{2} }
TimezoneLiteral = _{
(!"0" ~ TimezoneHours ~ !":")
| (TimezoneHours2 ~ ":"? ~ TimezoneMinutes)
}
TimezoneLikeExpr = {
TimezoneUTCLiteral
~ (ASCII_DIGIT | "+" | "-" | ":")*
}
TimezoneExpr = {
TimezoneUTCLiteral
~ (TimezoneSign ~ TimezoneLiteral)?
}