simple grammar for dates

This commit is contained in:
aarne
2011-02-25 15:44:25 +00:00
parent ffc78017b2
commit 804f7edddd
5 changed files with 322 additions and 0 deletions

32
examples/dates/Dates.gf Normal file
View File

@@ -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 ;
}

View File

@@ -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) ;
}

View File

@@ -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) ;
}

View File

@@ -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) ;
}

View File

@@ -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) ;
}