Duckling/Time/PT/Rules.hs (1,727 lines of code) (raw):

-- Copyright (c) 2016-present, Facebook, Inc. -- All rights reserved. -- -- This source code is licensed under the BSD-style license found in the -- LICENSE file in the root directory of this source tree. {-# LANGUAGE GADTs #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoRebindableSyntax #-} {-# LANGUAGE OverloadedStrings #-} module Duckling.Time.PT.Rules ( rules ) where import Data.Text (Text) import Prelude import qualified Data.Text as Text import Duckling.Dimensions.Types import Duckling.Duration.Helpers (isGrain) import Duckling.Numeral.Helpers (parseInt) import Duckling.Regex.Types import Duckling.Time.Helpers import Duckling.Time.Types (TimeData(..)) import Duckling.Types import qualified Duckling.Time.Types as TTime import qualified Duckling.TimeGrain.Types as TG ruleSHourmintimeofday :: Rule ruleSHourmintimeofday = Rule { name = "às <hour-min>(time-of-day)" , pattern = [ regex "(à|a)s?" , Predicate isATimeOfDay , regex "horas?" ] , prod = \tokens -> case tokens of (_:x:_) -> Just x _ -> Nothing } ruleTheDayAfterTomorrow :: Rule ruleTheDayAfterTomorrow = Rule { name = "the day after tomorrow" , pattern = [ regex "depois de amanh(ã|a)" ] , prod = \_ -> tt $ cycleNth TG.Day 2 } ruleNatal :: Rule ruleNatal = Rule { name = "natal" , pattern = [ regex "natal" ] , prod = \_ -> tt $ monthDay 12 25 } ruleNaoDate :: Rule ruleNaoDate = Rule { name = "n[ao] <date>" , pattern = [ regex "n[ao]" , Predicate $ isGrainOfTime TG.Day ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ notLatent td _ -> Nothing } ruleIntersectByDaOrDe :: Rule ruleIntersectByDaOrDe = Rule { name = "intersect by `da` or `de`" , pattern = [ dimension Time , regex "d[ae]" , Predicate isNotLatent ] , prod = \tokens -> case tokens of (Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td1 td2 _ -> Nothing } rulePassadosNCycle :: Rule rulePassadosNCycle = Rule { name = "passados n <cycle>" , pattern = [ regex "(passad|[úu]ltim)[ao]s?" , Predicate $ isIntegerBetween 2 9999 , dimension TimeGrain ] , prod = \tokens -> case tokens of (_:token:Token TimeGrain grain:_) -> do v <- getIntValue token tt $ cycleN True grain (-v) _ -> Nothing } ruleLastTime :: Rule ruleLastTime = Rule { name = "last <time>" , pattern = [ regex "[úu]ltim[ao]s?" , dimension Time ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ predNth (-1) False td _ -> Nothing } ruleDatetimeDatetimeInterval :: Rule ruleDatetimeDatetimeInterval = Rule { name = "<datetime> - <datetime> (interval)" , pattern = [ Predicate isNotLatent , regex "\\-|até( ao?)?|ao?" , Predicate isNotLatent ] , prod = \tokens -> case tokens of (Token Time td1:_:Token Time td2:_) -> Token Time <$> interval TTime.Closed td1 td2 _ -> Nothing } ruleDeDatetimeDatetimeInterval :: Rule ruleDeDatetimeDatetimeInterval = Rule { name = "de <datetime> - <datetime> (interval)" , pattern = [ regex "de?" , Predicate isATimeOfDay , regex "\\-|até( ao?)?|ao?" , Predicate isATimeOfDay ] , prod = \tokens -> case tokens of (_:Token Time td1:_:Token Time td2:_) -> Token Time <$> interval TTime.Closed td1 td2 _ -> Nothing } ruleEvening :: Rule ruleEvening = Rule { name = "evening" , pattern = [ regex "noite" ] , prod = \_ -> let from = hour False 18 to = hour False 0 in Token Time . mkLatent . partOfDay <$> interval TTime.Open from to } ruleDayOfMonthSt :: Rule ruleDayOfMonthSt = Rule { name = "day of month (1st)" , pattern = [ regex "primeiro|um|1o" ] , prod = \_ -> tt . mkLatent $ dayOfMonth 1 } ruleNow :: Rule ruleNow = Rule { name = "now" , pattern = [ regex "(hoje)|(neste|nesse) momento" ] , prod = \_ -> tt today } ruleDimTimeDaMadrugada :: Rule ruleDimTimeDaMadrugada = Rule { name = "<dim time> da madrugada" , pattern = [ dimension Time , regex "(da|na|pela) madruga(da)?" ] , prod = \tokens -> case tokens of (Token Time td:_) -> do td2 <- mkLatent . partOfDay <$> interval TTime.Open (hour False 1) (hour False 4) Token Time <$> intersect td td2 _ -> Nothing } ruleHhhmmTimeofday :: Rule ruleHhhmmTimeofday = Rule { name = "hh(:|.|h)mm (time-of-day)" , pattern = [ regex "((?:[01]?\\d)|(?:2[0-3]))[:h\\.]([0-5]\\d)" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do h <- parseInt m1 m <- parseInt m2 tt $ hourMinute True h m _ -> Nothing } ruleProximoCycle :: Rule ruleProximoCycle = Rule { name = "proximo <cycle> " , pattern = [ regex "pr(ó|o)xim(o|a)s?" , dimension TimeGrain ] , prod = \tokens -> case tokens of (_:Token TimeGrain grain:_) -> tt $ cycleNth grain 1 _ -> Nothing } ruleCycleAntesDeTime :: Rule ruleCycleAntesDeTime = Rule { name = "<cycle> antes de <time>" , pattern = [ dimension TimeGrain , regex "antes d[eo]" , dimension Time ] , prod = \tokens -> case tokens of (Token TimeGrain grain:_:Token Time td:_) -> tt $ cycleNthAfter False grain (-1) td _ -> Nothing } ruleEsteCycle :: Rule ruleEsteCycle = Rule { name = "este <cycle>" , pattern = [ regex "(n?es[st](es?|as?))" , dimension TimeGrain ] , prod = \tokens -> case tokens of (_:Token TimeGrain grain:_) -> tt $ cycleNth grain 0 _ -> Nothing } ruleCycleActual :: Rule ruleCycleActual = Rule { name = "<cycle> actual" , pattern = [ dimension TimeGrain , regex "ac?tual" ] , prod = \tokens -> case tokens of (Token TimeGrain grain:_) -> tt $ cycleNth grain 0 _ -> Nothing } ruleSHourminTimeofday :: Rule ruleSHourminTimeofday = Rule { name = "às <hour-min> <time-of-day>" , pattern = [ regex "[àa]s" , Predicate isNotLatent , regex "da" , Predicate isATimeOfDay ] , prod = \tokens -> case tokens of (_:Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td1 td2 _ -> Nothing } ruleSeason4 :: Rule ruleSeason4 = Rule { name = "season" , pattern = [ regex "primavera" ] , prod = \_ -> let from = monthDay 3 20 to = monthDay 6 21 in Token Time <$> interval TTime.Open from to } ruleYearLatent2 :: Rule ruleYearLatent2 = Rule { name = "year (latent)" , pattern = [ Predicate $ isIntegerBetween 2101 10000 ] , prod = \tokens -> case tokens of (token:_) -> do n <- getIntValue token tt . mkLatent $ year n _ -> Nothing } ruleDiaDayofmonthDeNamedmonth :: Rule ruleDiaDayofmonthDeNamedmonth = Rule { name = "dia <day-of-month> de <named-month>" , pattern = [ regex "dia" , Predicate isDOMInteger , regex "de|\\/" , Predicate isAMonth ] , prod = \tokens -> case tokens of (_:token:_:Token Time td:_) -> Token Time <$> intersectDOM td token _ -> Nothing } ruleNoon :: Rule ruleNoon = Rule { name = "noon" , pattern = [ regex "meio[\\s\\-]?dia" ] , prod = \_ -> tt $ hour False 12 } ruleProximasNCycle :: Rule ruleProximasNCycle = Rule { name = "proximas n <cycle>" , pattern = [ regex "pr(ó|o)xim(o|a)s?" , Predicate $ isIntegerBetween 2 9999 , dimension TimeGrain ] , prod = \tokens -> case tokens of (_:token:Token TimeGrain grain:_) -> do v <- getIntValue token tt $ cycleN True grain v _ -> Nothing } ruleThisnextDayofweek :: Rule ruleThisnextDayofweek = Rule { name = "this|next <day-of-week>" , pattern = [ regex "es[ts][ae]|pr(ó|o)xim[ao]" , Predicate isADayOfWeek ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ predNth 0 True td _ -> Nothing } ruleTheDayBeforeYesterday :: Rule ruleTheDayBeforeYesterday = Rule { name = "the day before yesterday" , pattern = [ regex "anteontem|antes de ontem" ] , prod = \_ -> tt . cycleNth TG.Day $ - 2 } ruleHourofdayIntegerAsRelativeMinutes :: Rule ruleHourofdayIntegerAsRelativeMinutes = Rule { name = "<hour-of-day> <integer> (as relative minutes)" , pattern = [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay] , Predicate $ isIntegerBetween 1 59 ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: token: _) -> do n <- getIntValue token tt $ hourMinute is12H hours n _ -> Nothing } ruleHourofdayAndRelativeMinutes :: Rule ruleHourofdayAndRelativeMinutes = Rule { name = "<hour-of-day> and <relative minutes>" , pattern = [ Predicate isAnHourOfDay , regex "e" , Predicate $ isIntegerBetween 1 59 ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _: token: _) -> do n <- getIntValue token tt $ hourMinute is12H hours n _ -> Nothing } ruleIntegerParaAsHourofdayAsRelativeMinutes :: Rule ruleIntegerParaAsHourofdayAsRelativeMinutes = Rule { name = "<integer> para as <hour-of-day> (as relative minutes)" , pattern = [ Predicate $ isIntegerBetween 1 59 , regex "para ((o|a|à)s?)?" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (token:_:Token Time td:_) -> do n <- getIntValue token Token Time <$> minutesBefore n td _ -> Nothing } ruleHourofdayIntegerAsRelativeMinutes2 :: Rule ruleHourofdayIntegerAsRelativeMinutes2 = Rule { name = "<hour-of-day> <integer> (as relative minutes) minutos" , pattern = [ Predicate $ and . sequence [isNotLatent, isAnHourOfDay] , Predicate $ isIntegerBetween 1 59 , regex "min\\.?(uto)?s?" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: token: _) -> do n <- getIntValue token tt $ hourMinute is12H hours n _ -> Nothing } ruleHourofdayAndRelativeMinutes2 :: Rule ruleHourofdayAndRelativeMinutes2 = Rule { name = "<hour-of-day> and <relative minutes> minutos" , pattern = [ Predicate isAnHourOfDay , regex "e" , Predicate $ isIntegerBetween 1 59 , regex "min\\.?(uto)?s?" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _: token: _) -> do n <- getIntValue token tt $ hourMinute is12H hours n _ -> Nothing } ruleIntegerParaAsHourofdayAsRelativeMinutes2 :: Rule ruleIntegerParaAsHourofdayAsRelativeMinutes2 = Rule { name = "<integer> minutos para as <hour-of-day> (as relative minutes)" , pattern = [ Predicate $ isIntegerBetween 1 59 , regex "min\\.?(uto)?s?" , regex "para ((o|a|à)s?)?" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (token:_:_:Token Time td:_) -> do n <- getIntValue token Token Time <$> minutesBefore n td _ -> Nothing } ruleHourofdayQuarter :: Rule ruleHourofdayQuarter = Rule { name = "<hour-of-day> quarter (as relative minutes)" , pattern = [ Predicate isAnHourOfDay , regex "quinze" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _) -> tt $ hourMinute is12H hours 15 _ -> Nothing } ruleHourofdayAndQuarter :: Rule ruleHourofdayAndQuarter = Rule { name = "<hour-of-day> and quinze" , pattern = [ Predicate isAnHourOfDay , regex "e quinze" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _) -> tt $ hourMinute is12H hours 15 _ -> Nothing } ruleQuarterParaAsHourofdayAsRelativeMinutes :: Rule ruleQuarterParaAsHourofdayAsRelativeMinutes = Rule { name = "quinze para as <hour-of-day> (as relative minutes)" , pattern = [ regex "quinze para ((o|a|à)s?)?" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> Token Time <$> minutesBefore 15 td _ -> Nothing } ruleHourofdayHalf :: Rule ruleHourofdayHalf = Rule { name = "<hour-of-day> half (as relative minutes)" , pattern = [ Predicate isAnHourOfDay , regex "meia|trinta" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _) -> tt $ hourMinute is12H hours 30 _ -> Nothing } ruleHourofdayAndHalf :: Rule ruleHourofdayAndHalf = Rule { name = "<hour-of-day> and half" , pattern = [ Predicate isAnHourOfDay , regex "e (meia|trinta)" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _) -> tt $ hourMinute is12H hours 30 _ -> Nothing } ruleHalfParaAsHourofdayAsRelativeMinutes :: Rule ruleHalfParaAsHourofdayAsRelativeMinutes = Rule { name = "half para as <hour-of-day> (as relative minutes)" , pattern = [ regex "(meia|trinta) para ((o|a|à)s?)?" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> Token Time <$> minutesBefore 30 td _ -> Nothing } ruleHourofdayThreeQuarter :: Rule ruleHourofdayThreeQuarter = Rule { name = "<hour-of-day> 3/4 (as relative minutes)" , pattern = [ Predicate isAnHourOfDay , regex "quarenta e cinco" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _) -> tt $ hourMinute is12H hours 45 _ -> Nothing } ruleHourofdayAndThreeQuarter :: Rule ruleHourofdayAndThreeQuarter = Rule { name = "<hour-of-day> and 3/4" , pattern = [ Predicate isAnHourOfDay , regex "e quarenta e cinco" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _) -> tt $ hourMinute is12H hours 45 _ -> Nothing } ruleThreeQuarterParaAsHourofdayAsRelativeMinutes :: Rule ruleThreeQuarterParaAsHourofdayAsRelativeMinutes = Rule { name = "3/4 para as <hour-of-day> (as relative minutes)" , pattern = [ regex "quarenta e cinco para ((o|a|à)s?)?" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> Token Time <$> minutesBefore 45 td _ -> Nothing } ruleTiradentes :: Rule ruleTiradentes = Rule { name = "Tiradentes" , pattern = [ regex "tiradentes" ] , prod = \_ -> tt $ monthDay 4 21 } ruleInThePartofday :: Rule ruleInThePartofday = Rule { name = "in the <part-of-day>" , pattern = [ regex "(de|pela|a|à)" , Predicate isAPartOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ notLatent td _ -> Nothing } rulePartofdayDessaSemana :: Rule rulePartofdayDessaSemana = Rule { name = "<part-of-day> dessa semana" , pattern = [ Predicate isNotLatent , regex "(d?es[ts]a semana)|agora" ] , prod = \tokens -> case tokens of (Token Time td:_) -> Token Time . partOfDay <$> intersect today td _ -> Nothing } ruleDepoisDasTimeofday :: Rule ruleDepoisDasTimeofday = Rule { name = "depois das <time-of-day>" , pattern = [ regex "(depois|ap(ó|o)s) d?((a|á|à)[so]?|os?)" , dimension Time ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ withDirection TTime.After td _ -> Nothing } ruleDdmm :: Rule ruleDdmm = Rule { name = "dd[/-]mm" , pattern = [ regex "(3[01]|[12]\\d|0?[1-9])[\\/\\-](0?[1-9]|1[0-2])" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do m <- parseInt mm d <- parseInt dd tt $ monthDay m d _ -> Nothing } ruleEmDuration :: Rule ruleEmDuration = Rule { name = "em <duration>" , pattern = [ regex "em" , dimension Duration ] , prod = \tokens -> case tokens of (_:Token Duration dd:_) -> tt $ inDuration dd _ -> Nothing } ruleAfternoon :: Rule ruleAfternoon = Rule { name = "afternoon" , pattern = [ regex "tarde" ] , prod = \_ -> let from = hour False 12 to = hour False 19 in Token Time . mkLatent . partOfDay <$> interval TTime.Open from to } ruleDimTimeDaManha :: Rule ruleDimTimeDaManha = Rule { name = "<dim time> da manha" , pattern = [ Predicate $ isGrainFinerThan TG.Year , regex "(da|na|pela) manh(ã|a)" ] , prod = \tokens -> case tokens of (Token Time td:_) -> do td2 <- mkLatent . partOfDay <$> interval TTime.Open (hour False 4) (hour False 12) Token Time <$> intersect td td2 _ -> Nothing } ruleNCycleProximoqueVem :: Rule ruleNCycleProximoqueVem = Rule { name = "n <cycle> (proximo|que vem)" , pattern = [ Predicate $ isIntegerBetween 2 9999 , dimension TimeGrain , regex "(pr(ó|o)xim(o|a)s?|que vem?|seguintes?)" ] , prod = \tokens -> case tokens of (token:Token TimeGrain grain:_) -> do v <- getIntValue token tt $ cycleN True grain v _ -> Nothing } ruleMidnight :: Rule ruleMidnight = Rule { name = "midnight" , pattern = [ regex "meia[\\s\\-]?noite" ] , prod = \_ -> tt $ hour False 0 } ruleDdddMonthinterval :: Rule ruleDdddMonthinterval = Rule { name = "dd-dd <month>(interval)" , pattern = [ regex "(3[01]|[12]\\d|0?[1-9])" , regex "\\-|a" , regex "(3[01]|[12]\\d|0?[1-9])" , regex "de" , Predicate isAMonth ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (m1:_)): _: Token RegexMatch (GroupMatch (m2:_)): _: Token Time td: _) -> do d1 <- parseInt m1 d2 <- parseInt m2 from <- intersect (dayOfMonth d1) td to <- intersect (dayOfMonth d2) td Token Time <$> interval TTime.Closed from to _ -> Nothing } ruleTimeofdayLatent :: Rule ruleTimeofdayLatent = Rule { name = "time-of-day (latent)" , pattern = [ Predicate $ isIntegerBetween 0 23 ] , prod = \tokens -> case tokens of (token:_) -> do v <- getIntValue token tt . mkLatent $ hour True v _ -> Nothing } ruleUltimoTime :: Rule ruleUltimoTime = Rule { name = "ultimo <time>" , pattern = [ regex "(u|ú)ltimo" , dimension Time ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ predNth (-1) False td _ -> Nothing } ruleNamedmonthnameddayPast :: Rule ruleNamedmonthnameddayPast = Rule { name = "<named-month|named-day> past" , pattern = [ Predicate isNotLatent , regex "(da semana)? passad(o|a)" ] , prod = \tokens -> case tokens of (Token Time td:_) -> tt $ predNth (-1) False td _ -> Nothing } ruleSeason3 :: Rule ruleSeason3 = Rule { name = "season" , pattern = [ regex "inverno" ] , prod = \_ -> let from = monthDay 12 21 to = monthDay 3 20 in Token Time <$> interval TTime.Open from to } ruleSeason :: Rule ruleSeason = Rule { name = "season" , pattern = [ regex "ver(ã|a)o" ] , prod = \_ -> let from = monthDay 6 21 to = monthDay 9 23 in Token Time <$> interval TTime.Open from to } ruleRightNow :: Rule ruleRightNow = Rule { name = "right now" , pattern = [ regex "agora|j(á|a)|(nesse|neste) instante" ] , prod = \_ -> tt now } ruleFazemDuration :: Rule ruleFazemDuration = Rule { name = "fazem <duration>" , pattern = [ regex "faz(em)?" , dimension Duration ] , prod = \tokens -> case tokens of (_:Token Duration dd:_) -> tt $ durationAgo dd _ -> Nothing } ruleAmanhPelaPartofday :: Rule ruleAmanhPelaPartofday = Rule { name = "amanhã pela <part-of-day>" , pattern = [ dimension Time , regex "(da|na|pela|a)" , Predicate isAPartOfDay ] , prod = \tokens -> case tokens of (Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td1 td2 _ -> Nothing } ruleHhmmMilitaryTimeofday :: Rule ruleHhmmMilitaryTimeofday = Rule { name = "hhmm (military time-of-day)" , pattern = [ regex "((?:[01]?\\d)|(?:2[0-3]))([0-5]\\d)" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do h <- parseInt m1 m <- parseInt m2 tt . mkLatent $ hourMinute False h m _ -> Nothing } ruleNamedmonthnameddayNext :: Rule ruleNamedmonthnameddayNext = Rule { name = "<named-month|named-day> next" , pattern = [ dimension Time , regex "(da pr(o|ó)xima semana)|(da semana)? que vem" ] , prod = \tokens -> case tokens of (Token Time td:_) -> tt $ predNth 1 False td _ -> Nothing } ruleIntersect :: Rule ruleIntersect = Rule { name = "intersect" , pattern = [ Predicate isNotLatent , Predicate isNotLatent ] , prod = \tokens -> case tokens of (Token Time td1:Token Time td2:_) -> Token Time <$> intersect td1 td2 _ -> Nothing } ruleTimeofdayPartofday :: Rule ruleTimeofdayPartofday = Rule { name = "<time-of-day> <part-of-day>" , pattern = [ dimension Time , regex "(da|na|pela)" , Predicate isAPartOfDay ] , prod = \tokens -> case tokens of (Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td1 td2 _ -> Nothing } ruleDentroDeDuration :: Rule ruleDentroDeDuration = Rule { name = "dentro de <duration>" , pattern = [ regex "(dentro de)|em" , dimension Duration ] , prod = \tokens -> case tokens of (_:Token Duration dd:_) -> Token Time <$> interval TTime.Open now (inDuration dd) _ -> Nothing } ruleSTimeofday :: Rule ruleSTimeofday = Rule { name = "às <time-of-day>" , pattern = [ regex "(à|a)s?" , Predicate isATimeOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ notLatent td _ -> Nothing } ruleDimTimeDaTarde :: Rule ruleDimTimeDaTarde = Rule { name = "<dim time> da tarde" , pattern = [ dimension Time , regex "(da|na|pela) tarde" ] , prod = \tokens -> case tokens of (Token Time td:_) -> do td2 <- mkLatent . partOfDay <$> interval TTime.Open (hour False 12) (hour False 18) Token Time <$> intersect td td2 _ -> Nothing } ruleWeekend :: Rule ruleWeekend = Rule { name = "week-end" , pattern = [ regex "final de semana|fim de semana|fds" ] , prod = \_ -> tt weekend } ruleDayofweekSHourmin :: Rule ruleDayofweekSHourmin = Rule { name = "<day-of-week> às <hour-min>" , pattern = [ Predicate isATimeOfDay , regex "(à|a)s" , Predicate isNotLatent , regex "da|pela" , Predicate isATimeOfDay ] , prod = \tokens -> case tokens of (Token Time td1:_:Token Time td2:_:Token Time td3:_) -> do td <- intersect td1 td2 Token Time <$> intersect td td3 _ -> Nothing } ruleCycleQueVem :: Rule ruleCycleQueVem = Rule { name = "<cycle> (que vem)" , pattern = [ dimension TimeGrain , regex "que vem|seguintes?" ] , prod = \tokens -> case tokens of (Token TimeGrain grain:_) -> tt $ cycleNth grain 1 _ -> Nothing } ruleAnoNovo :: Rule ruleAnoNovo = Rule { name = "ano novo" , pattern = [ regex "ano novo|reveillon" ] , prod = \_ -> tt $ monthDay 1 1 } ruleNextTime :: Rule ruleNextTime = Rule { name = "next <time>" , pattern = [ regex "(d[ao]) pr(ó|o)xim[ao]s?|que vem" , Predicate isNotLatent ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ predNth 0 True td _ -> Nothing } ruleDeYear :: Rule ruleDeYear = Rule { name = "de <year>" , pattern = [ regex "de|do ano" , Predicate $ isIntegerBetween 1000 2100 ] , prod = \tokens -> case tokens of (_:token:_) -> do n <- getIntValue token tt $ year n _ -> Nothing } ruleVesperaDeAnoNovo :: Rule ruleVesperaDeAnoNovo = Rule { name = "vespera de ano novo" , pattern = [ regex "v(é|e)spera d[eo] ano[\\s\\-]novo" ] , prod = \_ -> tt $ monthDay 12 31 } ruleNPassadosCycle :: Rule ruleNPassadosCycle = Rule { name = "n passados <cycle>" , pattern = [ Predicate $ isIntegerBetween 2 9999 , regex "(passad|[úu]ltim)[ao]s?|anterior(es)?" , dimension TimeGrain ] , prod = \tokens -> case tokens of (token:_:Token TimeGrain grain:_) -> do v <- getIntValue token tt $ cycleN True grain (- v) _ -> Nothing } ruleNCyclePassados :: Rule ruleNCyclePassados = Rule { name = "n <cycle> passados" , pattern = [ Predicate $ isIntegerBetween 2 9999 , dimension TimeGrain , regex "(passad|[úu]ltim)[ao]s?|anterior(es)?" ] , prod = \tokens -> case tokens of (token: Token TimeGrain grain:_) -> do v <- getIntValue token tt $ cycleN True grain (- v) _ -> Nothing } ruleDiaDayofmonthNonOrdinal :: Rule ruleDiaDayofmonthNonOrdinal = Rule { name = "dia <day-of-month> (non ordinal)" , pattern = [ regex "dia" , Predicate isDOMInteger ] , prod = \tokens -> case tokens of (_:token:_) -> do v <- getIntValue token tt $ dayOfMonth v _ -> Nothing } ruleYyyymmdd :: Rule ruleYyyymmdd = Rule { name = "yyyy-mm-dd" , pattern = [ regex "(\\d{2,4})-(0?[1-9]|1[0-2])-(3[01]|[12]\\d|0?[1-9])" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (yy:mm:dd:_)):_) -> do y <- parseInt yy m <- parseInt mm d <- parseInt dd tt $ yearMonthDay y m d _ -> Nothing } ruleTimeofdayHoras :: Rule ruleTimeofdayHoras = Rule { name = "<time-of-day> horas" , pattern = [ Predicate isATimeOfDay , regex "h\\.?(ora)?s?" ] , prod = \tokens -> case tokens of (Token Time td:_) -> tt $ notLatent td _ -> Nothing } ruleTwoTimeTokensSeparatedBy :: Rule ruleTwoTimeTokensSeparatedBy = Rule { name = "two time tokens separated by \",\"" , pattern = [ Predicate isNotLatent , regex "," , Predicate isNotLatent ] , prod = \tokens -> case tokens of (Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td1 td2 _ -> Nothing } ruleTwoTimeTokensSeparatedBy2 :: Rule ruleTwoTimeTokensSeparatedBy2 = Rule { name = "two time tokens separated by \",\"2" , pattern = [ Predicate isNotLatent , regex "," , Predicate isNotLatent ] , prod = \tokens -> case tokens of (Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td2 td1 _ -> Nothing } ruleMorning :: Rule ruleMorning = Rule { name = "morning" , pattern = [ regex "manh(ã|a)" ] , prod = \_ -> let from = hour False 4 to = hour False 12 in Token Time . mkLatent . partOfDay <$> interval TTime.Open from to } ruleThisPartofday :: Rule ruleThisPartofday = Rule { name = "this <part-of-day>" , pattern = [ regex "es[ts]a" , Predicate isAPartOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> Token Time . partOfDay <$> intersect today td _ -> Nothing } ruleThisTime :: Rule ruleThisTime = Rule { name = "this <time>" , pattern = [ regex "es[ts][ae]" , dimension Time ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ predNth 0 False td _ -> Nothing } ruleProclamaoDaRepblica :: Rule ruleProclamaoDaRepblica = Rule { name = "Proclamação da República" , pattern = [ regex "proclama(c|ç)(a|ã)o da rep(ú|u)blica" ] , prod = \_ -> tt $ monthDay 11 15 } ruleYearLatent :: Rule ruleYearLatent = Rule { name = "year (latent)" , pattern = [ Predicate $ isIntegerBetween 1 999 ] , prod = \tokens -> case tokens of (token:_) -> do n <- getIntValue token tt . mkLatent $ year n _ -> Nothing } ruleYesterday :: Rule ruleYesterday = Rule { name = "yesterday" , pattern = [ regex "ontem" ] , prod = \_ -> tt . cycleNth TG.Day $ - 1 } ruleSeason2 :: Rule ruleSeason2 = Rule { name = "season" , pattern = [ regex "outono" ] , prod = \_ -> let from = monthDay 9 23 to = monthDay 12 21 in Token Time <$> interval TTime.Open from to } ruleDiaDoTrabalhador :: Rule ruleDiaDoTrabalhador = Rule { name = "Dia do trabalhador" , pattern = [ regex "dia do trabalh(o|ador)" ] , prod = \_ -> tt $ monthDay 5 1 } ruleNCycleAtras :: Rule ruleNCycleAtras = Rule { name = "n <cycle> atras" , pattern = [ Predicate $ isIntegerBetween 2 9999 , dimension TimeGrain , regex "atr(a|á)s" ] , prod = \tokens -> case tokens of (token:Token TimeGrain grain:_) -> do v <- getIntValue token tt $ cycleN True grain (- v) _ -> Nothing } ruleTimeofdayAmpm :: Rule ruleTimeofdayAmpm = Rule { name = "<time-of-day> am|pm" , pattern = [ Predicate isATimeOfDay , regex "([ap])\\.?m?\\.?" ] , prod = \tokens -> case tokens of (Token Time td:Token RegexMatch (GroupMatch (ap:_)):_) -> tt $ timeOfDayAMPM (Text.toLower ap == "a") td _ -> Nothing } ruleDOMOfMonth :: Rule ruleDOMOfMonth = Rule { name = "<day-of-month> (ordinal or number) de <named-month>" , pattern = [ Predicate isDOMValue , regex "de|\\/" , Predicate isAMonth ] , prod = \case (token:_:Token Time td:_) -> Token Time <$> intersectDOM td token _ -> Nothing } ruleDOMMonth :: Rule ruleDOMMonth = Rule { name = "<day-of-month> (ordinal or number) <named-month>" , pattern = [ Predicate isDOMValue , Predicate isAMonth ] , prod = \case (token:Token Time td:_) -> Token Time <$> intersectDOM td token _ -> Nothing } ruleMonthDOM :: Rule ruleMonthDOM = Rule { name = "<named-month> <day-of-month>" , pattern = [ Predicate isAMonth , Predicate isDOMInteger ] , prod = \case (Token Time td:token:_) -> Token Time <$> intersectDOM td token _ -> Nothing } ruleEntreDatetimeEDatetimeInterval :: Rule ruleEntreDatetimeEDatetimeInterval = Rule { name = "entre <datetime> e <datetime> (interval)" , pattern = [ regex "entre( [ao])?|desde|(a partir )?d[eo]" , dimension Time , regex "e|\\-|até( ao?)?|ao?" , dimension Time ] , prod = \tokens -> case tokens of (_:Token Time td1:_:Token Time td2:_) -> Token Time <$> interval TTime.Closed td1 td2 _ -> Nothing } ruleEntreDdEtDdMonthinterval :: Rule ruleEntreDdEtDdMonthinterval = Rule { name = "entre dd et dd <month>(interval)" , pattern = [ regex "entre" , regex "(0?[1-9]|[12]\\d|3[01])" , regex "e?" , regex "(0?[1-9]|[12]\\d|3[01])" , regex "de" , Predicate isAMonth ] , prod = \tokens -> case tokens of (_: Token RegexMatch (GroupMatch (d1:_)): _: Token RegexMatch (GroupMatch (d2:_)): _: Token Time td: _) -> do dd1 <- parseInt d1 dd2 <- parseInt d2 dom1 <- intersect (dayOfMonth dd1) td dom2 <- intersect (dayOfMonth dd2) td Token Time <$> interval TTime.Closed dom1 dom2 _ -> Nothing } ruleCyclePassado :: Rule ruleCyclePassado = Rule { name = "<cycle> passado" , pattern = [ dimension TimeGrain , regex "passad[ao]s?|anterior(es)?" ] , prod = \tokens -> case tokens of (Token TimeGrain grain:_) -> tt . cycleNth grain $ - 1 _ -> Nothing } rulePassadoCycle :: Rule rulePassadoCycle = Rule { name = "passado <cycle>" , pattern = [ regex "(passad|[úu]ltim)[ao]s?|anterior(es)?" , dimension TimeGrain ] , prod = \tokens -> case tokens of (_:Token TimeGrain grain:_) -> tt . cycleNth grain $ - 1 _ -> Nothing } ruleNossaSenhoraAparecida :: Rule ruleNossaSenhoraAparecida = Rule { name = "Nossa Senhora Aparecida" , pattern = [ regex "nossa senhora( aparecida)?" ] , prod = \_ -> tt $ monthDay 10 12 } ruleFinados :: Rule ruleFinados = Rule { name = "Finados" , pattern = [ regex "finados|dia dos mortos" ] , prod = \_ -> tt $ monthDay 11 2 } ruleYear :: Rule ruleYear = Rule { name = "year" , pattern = [ Predicate $ isIntegerBetween 1000 2100 ] , prod = \tokens -> case tokens of (token:_) -> do n <- getIntValue token tt $ year n _ -> Nothing } ruleAntesDasTimeofday :: Rule ruleAntesDasTimeofday = Rule { name = "antes das <time-of-day>" , pattern = [ regex "(antes|at(e|é)|n(a|ã)o mais que) (d?(o|a|à)s?)?" , dimension Time ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ withDirection TTime.Before td _ -> Nothing } ruleNProximasCycle :: Rule ruleNProximasCycle = Rule { name = "n proximas <cycle>" , pattern = [ Predicate $ isIntegerBetween 2 9999 , regex "pr(ó|o)xim(o|a)s?" , dimension TimeGrain ] , prod = \tokens -> case tokens of (token:_:Token TimeGrain grain:_) -> do v <- getIntValue token tt $ cycleN True grain v _ -> Nothing } ruleDdmmyyyy :: Rule ruleDdmmyyyy = Rule { name = "dd[/-.]mm[/-.]yyyy" , pattern = [ regex "(3[01]|[12]\\d|0?[1-9])[\\.\\/\\-](0?[1-9]|1[0-2])[\\.\\/\\-](\\d{2,4})" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (m1:m2:m3:_)):_) -> do y <- parseInt m3 m <- parseInt m2 d <- parseInt m1 tt $ yearMonthDay y m d _ -> Nothing } ruleIndependecia :: Rule ruleIndependecia = Rule { name = "Independecia" , pattern = [ regex "independ(ê|e)ncia" ] , prod = \_ -> tt $ monthDay 9 7 } ruleTomorrow :: Rule ruleTomorrow = Rule { name = "tomorrow" , pattern = [ regex "amanh(ã|a)" ] , prod = \_ -> tt $ cycleNth TG.Day 1 } ruleTimezone :: Rule ruleTimezone = Rule { name = "<time> timezone" , pattern = [ Predicate isATimeOfDay , regex "\\b(YEKT|YEKST|YAKT|YAKST|WITA|WIT|WIB|WGT|WGST|WFT|WET|WEST|WAT|WAST|VUT|VLAT|VLAST|VET|UZT|UYT|UYST|UTC|ULAT|TVT|TMT|TLT|TKT|TJT|TFT|TAHT|SST|SRT|SGT|SCT|SBT|SAST|SAMT|RET|PYT|PYST|PWT|PST|PONT|PMST|PMDT|PKT|PHT|PHOT|PGT|PETT|PETST|PET|PDT|OMST|OMSST|NZST|NZDT|NUT|NST|NPT|NOVT|NOVST|NFT|NDT|NCT|MYT|MVT|MUT|MST|MSK|MSD|MMT|MHT|MDT|MAWT|MART|MAGT|MAGST|LINT|LHST|LHDT|KUYT|KST|KRAT|KRAST|KGT|JST|IST|IRST|IRKT|IRKST|IRDT|IOT|IDT|ICT|HOVT|HKT|GYT|GST|GMT|GILT|GFT|GET|GAMT|GALT|FNT|FKT|FKST|FJT|FJST|EST|EGT|EGST|EET|EEST|EDT|ECT|EAT|EAST|EASST|DAVT|ChST|CXT|CVT|CST|COT|CLT|CLST|CKT|CHAST|CHADT|CET|CEST|CDT|CCT|CAT|CAST|BTT|BST|BRT|BRST|BOT|BNT|AZT|AZST|AZOT|AZOST|AWST|AWDT|AST|ART|AQTT|ANAT|ANAST|AMT|AMST|ALMT|AKST|AKDT|AFT|AEST|AEDT|ADT|ACST|ACDT)\\b" ] , prod = \tokens -> case tokens of (Token Time td: Token RegexMatch (GroupMatch (tz:_)): _) -> Token Time <$> inTimezone (Text.toUpper tz) td _ -> Nothing } ruleCycleOrdinalOfTime :: Rule ruleCycleOrdinalOfTime = Rule { name = "<ordinal> <cycle> de <time>" , pattern = [ dimension Ordinal , dimension TimeGrain , regex "d[eo]|em" , dimension Time ] , prod = \tokens -> case tokens of (token:Token TimeGrain grain:_:Token Time td:_) -> do n <- getIntValue token tt $ cycleNthAfter True grain (n - 1) td _ -> Nothing } ruleCycleOrdinalTime :: Rule ruleCycleOrdinalTime = Rule { name = "<ordinal> <cycle> <time>" , pattern = [ dimension Ordinal , dimension TimeGrain , dimension Time ] , prod = \tokens -> case tokens of (token:Token TimeGrain grain: Token Time td:_) -> do n <- getIntValue token tt $ cycleNthAfter True grain (n - 1) td _ -> Nothing } ruleCycleTheOrdinalOfTime :: Rule ruleCycleTheOrdinalOfTime = Rule { name = "o <ordinal> <cycle> de <time>" , pattern = [ regex "o|a" , dimension Ordinal , dimension TimeGrain , regex "d[eo]|em" , dimension Time ] , prod = \tokens -> case tokens of (_:token:Token TimeGrain grain:_:Token Time td:_) -> do n <- getIntValue token tt $ cycleNthAfter True grain (n - 1) td _ -> Nothing } ruleOrdinalTrimestre :: Rule ruleOrdinalTrimestre = Rule { name = "<ordinal> trimestre" , pattern = [ dimension Ordinal , Predicate $ isGrain TG.Quarter ] , prod = \tokens -> case tokens of (token:_) -> do n <- getIntValue token tt . cycleNthAfter True TG.Quarter (n - 1) $ cycleNth TG.Year 0 _ -> Nothing } ruleTheOrdinalTrimestre :: Rule ruleTheOrdinalTrimestre = Rule { name = "o <ordinal> trimestre" , pattern = [ regex "o|a" , dimension Ordinal , Predicate $ isGrain TG.Quarter ] , prod = \tokens -> case tokens of (_:token:_) -> do n <- getIntValue token tt . cycleNthAfter True TG.Quarter (n - 1) $ cycleNth TG.Year 0 _ -> Nothing } ruleOrdinalTrimestreYear :: Rule ruleOrdinalTrimestreYear = Rule { name = "<ordinal> trimestre <year>" , pattern = [ dimension Ordinal , Predicate $ isGrain TG.Quarter , dimension Time ] , prod = \tokens -> case tokens of (token:_:Token Time td:_) -> do n <- getIntValue token tt $ cycleNthAfter False TG.Quarter (n - 1) td _ -> Nothing } ruleLastCycleOfTime :: Rule ruleLastCycleOfTime = Rule { name = "último <cycle> de <time>" , pattern = [ regex "[úu]ltim[ao]s?" , dimension TimeGrain , regex "d[eo]|em" , dimension Time ] , prod = \tokens -> case tokens of (_:Token TimeGrain grain:_:Token Time td:_) -> tt $ cycleLastOf grain td _ -> Nothing } ruleLastCycleTime :: Rule ruleLastCycleTime = Rule { name = "último <cycle> <time>" , pattern = [ regex "[úu]ltim[ao]s?" , dimension TimeGrain , dimension Time ] , prod = \tokens -> case tokens of (_:Token TimeGrain grain: Token Time td:_) -> tt $ cycleLastOf grain td _ -> Nothing } ruleIntervalFromMonthDDDDOf :: Rule ruleIntervalFromMonthDDDDOf = Rule { name = "desde <month> dd-dd de (interval)" , pattern = [ regex "desde|a partir d[eo]" , Predicate isDOMValue , regex "até( ao?)?|ao?" , Predicate isDOMValue , regex "d[eo]|em" , Predicate isAMonth ] , prod = \tokens -> case tokens of (_: token1: _: token2: _: Token Time td: _) -> do dom1 <- intersectDOM td token1 dom2 <- intersectDOM td token2 Token Time <$> interval TTime.Closed dom1 dom2 _ -> Nothing } ruleIntervalDDDDMonthOf :: Rule ruleIntervalDDDDMonthOf = Rule { name = "dd-dd <month> de (interval)" , pattern = [ Predicate isDOMValue , regex "\\-|a(té)?" , Predicate isDOMValue , regex "d[eo]|em" , Predicate isAMonth ] , prod = \tokens -> case tokens of (token1: _: token2: _: Token Time td: _) -> do dom1 <- intersectDOM td token1 dom2 <- intersectDOM td token2 Token Time <$> interval TTime.Closed dom1 dom2 _ -> Nothing } ruleIntervalFromMonthDDDD :: Rule ruleIntervalFromMonthDDDD = Rule { name = "desde <month> dd-dd (interval)" , pattern = [ regex "desde|a partir d[eo]" , Predicate isDOMValue , regex "até( ao?)?|ao?" , Predicate isDOMValue , Predicate isAMonth ] , prod = \tokens -> case tokens of (_: token1: _: token2: Token Time td: _) -> do dom1 <- intersectDOM td token1 dom2 <- intersectDOM td token2 Token Time <$> interval TTime.Closed dom1 dom2 _ -> Nothing } ruleIntervalDDDDMonth :: Rule ruleIntervalDDDDMonth = Rule { name = "dd-dd <month> (interval)" , pattern = [ Predicate isDOMValue , regex "\\-|a(té)?" , Predicate isDOMValue , Predicate isAMonth ] , prod = \tokens -> case tokens of (token1: _: token2: Token Time td: _) -> do dom1 <- intersectDOM td token1 dom2 <- intersectDOM td token2 Token Time <$> interval TTime.Closed dom1 dom2 _ -> Nothing } ruleOrdinalCycleOfYearOrdinalCycleOfYear :: Rule ruleOrdinalCycleOfYearOrdinalCycleOfYear = Rule { name = "<ordinal> <cycle> de <year> - <ordinal> <cycle> de <year>" , pattern = [ dimension Ordinal , dimension TimeGrain , regex "d[eo]|em" , dimension Time , regex "\\-|até( ao?)?|ao?" , dimension Ordinal , dimension TimeGrain , regex "d[eo]|em" , dimension Time ] , prod = \tokens -> case tokens of (token1: Token TimeGrain grain1: _: Token Time td1: _: token2: Token TimeGrain grain2: _: Token Time td2: _) -> do n1 <- getIntValue token1 n2 <- getIntValue token2 let from = cycleNthAfter False grain1 (n1 - 1) td1 to = cycleNthAfter False grain2 (n2 - 1) td2 Token Time <$> interval TTime.Closed from to _ -> Nothing } ruleOrdinalCycleYearOrdinalCycleYear :: Rule ruleOrdinalCycleYearOrdinalCycleYear = Rule { name = "<ordinal> <cycle> <year> - <ordinal> <cycle> <year>" , pattern = [ dimension Ordinal , dimension TimeGrain , dimension Time , regex "\\-|até( ao?)?|ao?" , dimension Ordinal , dimension TimeGrain , dimension Time ] , prod = \tokens -> case tokens of (token1: Token TimeGrain grain1: Token Time td1: _: token2: Token TimeGrain grain2: Token Time td2: _) -> do n1 <- getIntValue token1 n2 <- getIntValue token2 let from = cycleNthAfter False grain1 (n1 - 1) td1 to = cycleNthAfter False grain2 (n2 - 1) td2 Token Time <$> interval TTime.Closed from to _ -> Nothing } daysOfWeek :: [(Text, String)] daysOfWeek = [ ( "Segunda-feira", "segunda((\\s|\\-)feira)?|seg\\.?" ) , ( "Terça-feira", "ter(ç|c)a((\\s|\\-)feira)?|ter\\." ) , ( "Quart-feira", "quarta((\\s|\\-)feira)?|qua\\.?" ) , ( "Quinta-feira", "quinta((\\s|\\-)feira)?|qui\\.?" ) , ( "Sexta-feira", "sexta((\\s|\\-)feira)?|sex\\.?" ) , ( "Sábada", "s(á|a)bado|s(á|a)b\\.?" ) , ( "Domingo", "domingo|dom\\.?" ) ] ruleDaysOfWeek :: [Rule] ruleDaysOfWeek = mkRuleDaysOfWeek daysOfWeek months :: [(Text, String)] months = [ ( "Janeiro" , "janeiro|jan\\.?" ) , ( "Fevereiro" , "fevereiro|fev\\.?" ) , ( "Março" , "mar(ç|c)o|mar\\.?" ) , ( "Abril" , "abril|abr\\.?" ) , ( "Maio" , "maio|mai\\.?" ) , ( "Junho" , "junho|jun\\.?" ) , ( "Julho" , "julho|jul\\.?" ) , ( "Agosto" , "agosto|ago\\.?" ) , ( "Setembro" , "setembro|set\\.?" ) , ( "Outubro" , "outubro|out\\.?" ) , ( "Novembro" , "novembro|nov\\.?" ) , ( "Dezembro" , "dezembro|dez\\.?" ) ] ruleMonths :: [Rule] ruleMonths = mkRuleMonths months rules :: [Rule] rules = [ ruleAfternoon , ruleAmanhPelaPartofday , ruleAnoNovo , ruleAntesDasTimeofday , ruleDatetimeDatetimeInterval , ruleDayOfMonthSt , ruleDayofweekSHourmin , ruleDdddMonthinterval , ruleDdmm , ruleDdmmyyyy , ruleDeDatetimeDatetimeInterval , ruleDeYear , ruleDentroDeDuration , ruleDepoisDasTimeofday , ruleDiaDayofmonthDeNamedmonth , ruleDiaDayofmonthNonOrdinal , ruleDiaDoTrabalhador , ruleDimTimeDaMadrugada , ruleDimTimeDaManha , ruleDimTimeDaTarde , ruleDOMOfMonth , ruleDOMMonth , ruleEmDuration , ruleEntreDatetimeEDatetimeInterval , ruleEntreDdEtDdMonthinterval , ruleEsteCycle , ruleCycleActual , ruleEvening , ruleFazemDuration , ruleFinados , ruleHhhmmTimeofday , ruleHhmmMilitaryTimeofday , ruleHourofdayAndRelativeMinutes , ruleHourofdayAndRelativeMinutes2 , ruleHourofdayAndQuarter , ruleHourofdayAndThreeQuarter , ruleHourofdayAndHalf , ruleHourofdayIntegerAsRelativeMinutes , ruleHourofdayIntegerAsRelativeMinutes2 , ruleHourofdayQuarter , ruleHourofdayHalf , ruleHourofdayThreeQuarter , ruleInThePartofday , ruleIndependecia , ruleIntegerParaAsHourofdayAsRelativeMinutes , ruleIntegerParaAsHourofdayAsRelativeMinutes2 , ruleHalfParaAsHourofdayAsRelativeMinutes , ruleQuarterParaAsHourofdayAsRelativeMinutes , ruleThreeQuarterParaAsHourofdayAsRelativeMinutes , ruleIntersect , ruleIntersectByDaOrDe , ruleLastTime , ruleMidnight , ruleMonthDOM , ruleMorning , ruleNCycleAtras , ruleNCycleProximoqueVem , ruleNPassadosCycle , ruleNProximasCycle , ruleNamedmonthnameddayNext , ruleNamedmonthnameddayPast , ruleNaoDate , ruleNatal , ruleNextTime , ruleCycleQueVem , ruleProximoCycle , ruleNoon , ruleNossaSenhoraAparecida , ruleNow , ruleCycleAntesDeTime , ruleCyclePassado , rulePassadoCycle , rulePartofdayDessaSemana , rulePassadosNCycle , ruleNCyclePassados , ruleProclamaoDaRepblica , ruleProximasNCycle , ruleRightNow , ruleSHourminTimeofday , ruleSHourmintimeofday , ruleSTimeofday , ruleSeason , ruleSeason2 , ruleSeason3 , ruleSeason4 , ruleTheDayAfterTomorrow , ruleTheDayBeforeYesterday , ruleThisPartofday , ruleThisTime , ruleThisnextDayofweek , ruleTimeofdayAmpm , ruleTimeofdayHoras , ruleTimeofdayLatent , ruleTimeofdayPartofday , ruleTiradentes , ruleTomorrow , ruleTwoTimeTokensSeparatedBy , ruleTwoTimeTokensSeparatedBy2 , ruleUltimoTime , ruleVesperaDeAnoNovo , ruleWeekend , ruleYear , ruleYearLatent , ruleYearLatent2 , ruleYesterday , ruleYyyymmdd , ruleTimezone , ruleCycleOrdinalOfTime , ruleCycleOrdinalTime , ruleCycleTheOrdinalOfTime , ruleOrdinalTrimestre , ruleTheOrdinalTrimestre , ruleOrdinalTrimestreYear , ruleLastCycleOfTime , ruleLastCycleTime , ruleIntervalFromMonthDDDDOf , ruleIntervalDDDDMonthOf , ruleIntervalFromMonthDDDD , ruleIntervalDDDDMonth , ruleOrdinalCycleOfYearOrdinalCycleOfYear , ruleOrdinalCycleYearOrdinalCycleYear ] ++ ruleMonths ++ ruleDaysOfWeek