From 77b02544fb91a658346f25019cbf2a21b79f9081 Mon Sep 17 00:00:00 2001 From: aarne Date: Fri, 25 Feb 2011 15:44:25 +0000 Subject: [PATCH] simple grammar for dates --- examples/dates/Dates.gf | 32 ++++++++++++++++ examples/dates/DatesEng.gf | 66 ++++++++++++++++++++++++++++++++ examples/dates/DatesFin.gf | 78 ++++++++++++++++++++++++++++++++++++++ examples/dates/DatesFre.gf | 73 +++++++++++++++++++++++++++++++++++ examples/dates/DatesSwe.gf | 73 +++++++++++++++++++++++++++++++++++ 5 files changed, 322 insertions(+) create mode 100644 examples/dates/Dates.gf create mode 100644 examples/dates/DatesEng.gf create mode 100644 examples/dates/DatesFin.gf create mode 100644 examples/dates/DatesFre.gf create mode 100644 examples/dates/DatesSwe.gf diff --git a/examples/dates/Dates.gf b/examples/dates/Dates.gf new file mode 100644 index 000000000..9ac664a1c --- /dev/null +++ b/examples/dates/Dates.gf @@ -0,0 +1,32 @@ +abstract Dates = { + +flags startcat = Date ; + +cat + Date ; Year ; Month ; Day ; Time ; Hour ; Minute ; Weekday ; Ampm ; + +fun + DFull : Year -> Month -> Day -> Weekday -> Time -> Date ; + + MkYear : Int -> Year ; + + MJan, MFeb, MMar, MApr, MMay, MJun, MJul, MAug, MSep, MOct, MNov, MDec : Month ; + + MkDay : Int -> Day ; + + MkTime : Ampm -> Hour -> Minute -> Time ; + + H01, H02, H03, H04, H05, H06, H07, H08, H09, H10, H11, H12 : Hour ; + + MkMinute : Int -> Minute ; + + WSun, WMon, WTue, WWed, WThu, WFri, WSat : Weekday ; + + AM, PM : Ampm ; + +-- noncanonical ways + + DToday, DYesterday, DTomorrow : Time -> Date ; + +} + diff --git a/examples/dates/DatesEng.gf b/examples/dates/DatesEng.gf new file mode 100644 index 000000000..2113c11dd --- /dev/null +++ b/examples/dates/DatesEng.gf @@ -0,0 +1,66 @@ +concrete DatesEng of Dates = open Prelude in { + +lincat + Date, Year, Month, Day, Time, Hour, Minute, Weekday, Ampm = Str ; + +lin + DFull y m d w t = opts (opts "on" ++ w ++ comma) ++ opts (bothWays m d ++ opts comma) ++ opts (y ++ opts comma) ++ opts ("at" ++ t) ; + + MkYear i = i.s ; + + MJan = "January" ; + MFeb = "February" ; + MMar = "March" ; + MApr = "April" ; + MMay = "May" ; + MJun = "June" ; + MJul = "July" ; + MAug = "August" ; + MSep = "September" ; + MOct = "October" ; + MNov = "November" ; + MDec = "December" ; + + MkDay i = i.s ; + + MkTime ap h m = h ++ opts (dot ++ m) ++ opts ap ; + + H01 = "1" ; + H02 = "2" ; + H03 = "3" ; + H04 = "4" ; + H05 = "5" ; + H06 = "6" ; + H07 = "7" ; + H08 = "8" ; + H09 = "9" ; + H10 = "10" ; + H11 = "11" ; + H12 = "12" ; + + MkMinute i = i.s ; + + WSun = "Sunday" ; + WMon = "Monday" ; + WTue = "Tuesday" ; + WWed = "Wednesday" ; + WThu = "Thursday" ; + WFri = "Friday" ; + WSat = "Saturday" ; + + AM = "a.m." ; + PM = "p.m." ; + +oper + opts = optStr ; + dot = "." ; + comma = "," ; + +lin + DToday t = "today" ++ opts ("at" ++ t) ; + DTomorrow t = "tomorrow" ++ opts ("at" ++ t) ; + DYesterday t = "yesterday" ++ opts ("at" ++ t) ; + + +} + diff --git a/examples/dates/DatesFin.gf b/examples/dates/DatesFin.gf new file mode 100644 index 000000000..ce37e577a --- /dev/null +++ b/examples/dates/DatesFin.gf @@ -0,0 +1,78 @@ +concrete DatesFin of Dates = open Prelude in { + +flags coding = utf8 ; + +lincat + Date, Year, Day, Time, Minute = Str ; + Month, Weekday = Case => Str ; + Hour = PAMPM => Str ; + Ampm = {s : Str ; p : PAMPM} ; + +lin + DFull y m d w t = (opts (w ! Nom) | (w ! Ess)) ++ opts (d ++ dot ++ (m ! Part)) ++ opts (opts "vuonna" ++ y) ++ opts (klo ++ t) ; + + MkYear i = i.s ; + + MJan = mkNoun "tammikuu" ; + MFeb = mkNoun "helmikuu" ; + MMar = mkNoun "maaliskuu" ; + MApr = mkNoun "huhtikuu" ; + MMay = mkNoun "toukokuu" ; + MJun = mkNoun "kesäkuu" ; + MJul = mkNoun "heinäkuu" ; + MAug = mkNoun "elokuu" ; + MSep = mkNoun "syyskuu" ; + MOct = mkNoun "lokakuu" ; + MNov = mkNoun "marraskuu" ; + MDec = mkNoun "joulukuu" ; + + MkDay i = i.s ; + + MkTime ap h m = h ! ap.p ++ opts (dot ++ m) ++ ap.s ; + + H01 = ampm "1" "13" ; + H02 = ampm "2" "14" ; + H03 = ampm "3" "15" ; + H04 = ampm "4" "16" ; + H05 = ampm "5" "17" ; + H06 = ampm "6" "18" ; + H07 = ampm "7" "19" ; + H08 = ampm "8" "20" ; + H09 = ampm "9" "21" ; + H10 = ampm "10" "22" ; + H11 = ampm "11" "23" ; + H12 = ampm "0" "12" ; -- 12.01 a.m. = 0.01 ; 12.01 p.m. = 13.01 + + MkMinute i = i.s ; + + WSun = mkNoun "sunnuntai" ; + WMon = mkNoun "maanantai" ; + WTue = mkNoun "tiistai" ; + WWed = mkNoun "keskiviikko" ; + WThu = mkNoun "torstai" ; + WFri = mkNoun "perjantai" ; + WSat = mkNoun "lauantai" ; + + AM = {s = [] ; p = PAM} ; + PM = {s = [] ; p = PPM} ; + +oper + opts = optStr ; + dot = "." ; + comma = "," ; + klo = "klo" | "kello" ; + + ampm : Str -> Str -> PAMPM => Str = \a,p -> table {PAM => a ; PPM => p} ; + mkNoun : Str -> Case => Str = \w -> table {Nom => w ; Part => w + "ta" ; Ess => w ++ "na"} ; + +param + PAMPM = PAM | PPM ; + Case = Nom | Part | Ess ; + +lin + DToday t = "tänään" ++ opts (klo ++ t) ; + DTomorrow t = "huomenna" ++ opts (klo ++ t) ; + DYesterday t = "eilen" ++ opts (klo ++ t) ; + +} + diff --git a/examples/dates/DatesFre.gf b/examples/dates/DatesFre.gf new file mode 100644 index 000000000..7adad70db --- /dev/null +++ b/examples/dates/DatesFre.gf @@ -0,0 +1,73 @@ +concrete DatesFre of Dates = open Prelude in { + +flags coding = utf8 ; + +lincat + Date, Year, Month, Day, Time, Minute, Weekday = Str ; Hour = PAMPM => Str ; Ampm = {s : Str ; p : PAMPM} ; + +lin + DFull y m d w t = opts w ++ opts ("le" ++ d ++ m) ++ opts (opts "en" ++ y) ++ opts (klo ++ t) ; + + MkYear i = i.s ; + + MJan = "janvier" ; + MFeb = "février" ; + MMar = "mars" ; + MApr = "avril" ; + MMay = "mai" ; + MJun = "juin" ; + MJul = "juillet" ; + MAug = "août" ; + MSep = "septembre" ; + MOct = "octobre" ; + MNov = "novembre" ; + MDec = "décembre" ; + + MkDay i = i.s ; + + MkTime ap h m = h ! ap.p ++ opts ("h" ++ m) ++ ap.s ; + + H01 = ampm "1" "13" ; + H02 = ampm "2" "14" ; + H03 = ampm "3" "15" ; + H04 = ampm "4" "16" ; + H05 = ampm "5" "17" ; + H06 = ampm "6" "18" ; + H07 = ampm "7" "19" ; + H08 = ampm "8" "20" ; + H09 = ampm "9" "21" ; + H10 = ampm "10" "22" ; + H11 = ampm "11" "23" ; + H12 = ampm "0" "12" ; -- 12.01 a.m. = 0.01 ; 12.01 p.m. = 13.01 + + MkMinute i = i.s ; + + WSun = "dimanche" ; + WMon = "lundi" ; + WTue = "mardi" ; + WWed = "mercredi" ; + WThu = "jeudi" ; + WFri = "vendredi" ; + WSat = "samedi" ; + + AM = {s = [] ; p = PAM} ; + PM = {s = [] ; p = PPM} ; + +oper + opts = optStr ; + dot = "." ; + comma = "," ; + klo = "à" ; + + ampm : Str -> Str -> PAMPM => Str = \a,p -> table {PAM => a ; PPM => p} ; + +param + PAMPM = PAM | PPM ; + +lin + DToday t = "aujourd'hui" ++ opts (klo ++ t) ; + DTomorrow t = "demain" ++ opts (klo ++ t) ; + DYesterday t = "hier" ++ opts (klo ++ t) ; + +} + diff --git a/examples/dates/DatesSwe.gf b/examples/dates/DatesSwe.gf new file mode 100644 index 000000000..d40ca201d --- /dev/null +++ b/examples/dates/DatesSwe.gf @@ -0,0 +1,73 @@ +concrete DatesSwe of Dates = open Prelude in { + +flags coding = utf8 ; + +lincat + Date, Year, Month, Day, Time, Minute, Weekday = Str ; Hour = PAMPM => Str ; Ampm = {s : Str ; p : PAMPM} ; + +lin + DFull y m d w t = opts (opts "på" ++ w) ++ opts ("den" ++ d ++ m) ++ opts (opts "år" ++ y) ++ opts (klo ++ t) ; + + MkYear i = i.s ; + + MJan = "januari" ; + MFeb = "februari" ; + MMar = "mars" ; + MApr = "april" ; + MMay = "maj" ; + MJun = "juni" ; + MJul = "juli" ; + MAug = "augusti" ; + MSep = "september" ; + MOct = "oktober" ; + MNov = "november" ; + MDec = "december" ; + + MkDay i = i.s ; + + MkTime ap h m = h ! ap.p ++ opts (dot ++ m) ++ ap.s ; + + H01 = ampm "1" "13" ; + H02 = ampm "2" "14" ; + H03 = ampm "3" "15" ; + H04 = ampm "4" "16" ; + H05 = ampm "5" "17" ; + H06 = ampm "6" "18" ; + H07 = ampm "7" "19" ; + H08 = ampm "8" "20" ; + H09 = ampm "9" "21" ; + H10 = ampm "10" "22" ; + H11 = ampm "11" "23" ; + H12 = ampm "0" "12" ; -- 12.01 a.m. = 0.01 ; 12.01 p.m. = 13.01 + + MkMinute i = i.s ; + + WSun = "söndag" ; + WMon = "måndag" ; + WTue = "tisdag" ; + WWed = "onsdag" ; + WThu = "torsdag" ; + WFri = "fredag" ; + WSat = "lördag" ; + + AM = {s = [] ; p = PAM} ; + PM = {s = [] ; p = PPM} ; + +oper + opts = optStr ; + dot = "." ; + comma = "," ; + klo = "kl." | "klockan" ; + + ampm : Str -> Str -> PAMPM => Str = \a,p -> table {PAM => a ; PPM => p} ; + +param + PAMPM = PAM | PPM ; + +lin + DToday t = "idag" ++ opts (klo ++ t) ; + DTomorrow t = "imorgon" ++ opts (klo ++ t) ; + DYesterday t = "igår" ++ opts (klo ++ t) ; + +} +