summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grammars/video/Channel/channel.Eng.gf27
-rw-r--r--grammars/video/Channel/channel.Prolog.gf20
-rw-r--r--grammars/video/Channel/channel.gf23
-rw-r--r--grammars/video/Channel/channelProlog.gf22
-rw-r--r--grammars/video/Channel/channelRes.Abs.gf29
-rw-r--r--grammars/video/Channel/channelRes.Prolog.gf27
-rw-r--r--grammars/video/Channel/channelResSwe.gf26
-rw-r--r--grammars/video/Channel/channelSwe.gf20
-rw-r--r--grammars/video/Channel/date.Swe.gf56
-rw-r--r--grammars/video/README53
-rw-r--r--grammars/video/Shared/general.Prolog.gf50
-rw-r--r--grammars/video/Shared/general.gf51
-rw-r--r--grammars/video/Shared/generalProlog.gf43
-rw-r--r--grammars/video/Shared/generalSwe.gf43
-rw-r--r--grammars/video/Shared/prologResource.gf19
-rw-r--r--grammars/video/Shared/specific.gf29
-rw-r--r--grammars/video/Shared/specificProlog.gf22
-rw-r--r--grammars/video/Shared/specificSwe.gf20
-rw-r--r--grammars/video/System/genSystem.gf37
-rw-r--r--grammars/video/System/genSystemProlog.gf32
-rw-r--r--grammars/video/System/genSystemSwe.gf32
-rw-r--r--grammars/video/System/general.Prolog.gf32
-rw-r--r--grammars/video/System/re2specific.Swe.gf60
-rw-r--r--grammars/video/System/specSystem.gf59
-rw-r--r--grammars/video/System/specSystemProlog.gf45
-rw-r--r--grammars/video/System/specSystemSwe.gf49
-rw-r--r--grammars/video/System/specific.Prolog.gf46
-rw-r--r--grammars/video/Time/time.Catalan.gf135
-rw-r--r--grammars/video/Time/time.Eng.gf130
-rw-r--r--grammars/video/Time/time.Prolog.gf110
-rw-r--r--grammars/video/Time/time.Symb.gf127
-rw-r--r--grammars/video/Time/time.gf106
-rw-r--r--grammars/video/Time/timeProlog.gf103
-rw-r--r--grammars/video/Time/timeResSwe.gf7
-rw-r--r--grammars/video/Time/timeSwe.gf149
-rw-r--r--grammars/video/User/genUser.gf7
-rw-r--r--grammars/video/User/genUserProlog.gf8
-rw-r--r--grammars/video/User/genUserSwe.gf8
-rw-r--r--grammars/video/User/general.Prolog.gf6
-rw-r--r--grammars/video/User/specUser.gf36
-rw-r--r--grammars/video/User/specUserProlog.gf68
-rw-r--r--grammars/video/User/specUserSwe.gf35
-rw-r--r--grammars/video/User/specific.Prolog.gf68
-rw-r--r--grammars/video/Weekday/weekday.Eng.gf12
-rw-r--r--grammars/video/Weekday/weekday.Prolog.gf13
-rw-r--r--grammars/video/Weekday/weekday.gf15
-rw-r--r--grammars/video/Weekday/weekdayProlog.gf14
-rw-r--r--grammars/video/Weekday/weekdaySwe.gf12
-rw-r--r--grammars/video/all.gf13
-rw-r--r--grammars/video/allProlog.gf5
-rw-r--r--grammars/video/allSwe.gf9
-rw-r--r--grammars/video/icm100ResSwe.gf30
-rw-r--r--grammars/video/systemSwe.gf4
-rw-r--r--src/GF/Compile/Compile.hs5
-rw-r--r--src/Makefile9
55 files changed, 2212 insertions, 4 deletions
diff --git a/grammars/video/Channel/channel.Eng.gf b/grammars/video/Channel/channel.Eng.gf
new file mode 100644
index 000000000..d0e0dd103
--- /dev/null
+++ b/grammars/video/Channel/channel.Eng.gf
@@ -0,0 +1,27 @@
+---File name channel.Eng.gf
+
+include channel.Abs.gf ;
+
+
+lin
+channel0 = {s = (variants {["0"]})} ;
+channel1 = {s = (variants {["1"];["channel one"];["ettan"]})} ;
+channel2 = {s = (variants {["2"];["channel two"];["tvåan"]})} ;
+channel3 = {s = (variants {["3"];["channel three"];["trean"]})} ;
+channel4 = {s = (variants {["3"];["channel four"];["trean"]})} ;
+channel5 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel6 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel7 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel8 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel9 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel10 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel11 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel12 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel13 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel14 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel15 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel16 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel17 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel18 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+channel19 = {s = (variants {["3"];["channel tre"];["trean"]})} ;
+
diff --git a/grammars/video/Channel/channel.Prolog.gf b/grammars/video/Channel/channel.Prolog.gf
new file mode 100644
index 000000000..532538559
--- /dev/null
+++ b/grammars/video/Channel/channel.Prolog.gf
@@ -0,0 +1,20 @@
+-- File namne channel.Prolog.gf
+
+include channel.Abs.gf ;
+pattern
+--channel0 = "0" ;
+channel1 = "svt1" ;
+channel2 = "svt2" ;
+channel3 = "tv3" ;
+channel4 = "tv4" ;
+channel5 = "tv5" ;
+channel6 = "tve" ;
+channel7 = "raiuno" ;
+channel8 = "sat1" ;
+channel9 = "cnn" ;
+channel10 = "bbcworld" ;
+channel11 = "tvpolonia" ;
+channel12 = "dr1" ;
+channel13 = "dr2" ;
+channel14 = "nrk1" ;
+channel15 = "nrk2" ; \ No newline at end of file
diff --git a/grammars/video/Channel/channel.gf b/grammars/video/Channel/channel.gf
new file mode 100644
index 000000000..204860114
--- /dev/null
+++ b/grammars/video/Channel/channel.gf
@@ -0,0 +1,23 @@
+abstract channel = {
+
+cat
+Channel ;
+
+fun
+--channel0 : Channel ;
+channel1 : Channel ;
+channel2 : Channel ;
+channel3 : Channel ;
+channel4 : Channel ;
+channel5 : Channel ;
+channel6 : Channel ;
+channel7 : Channel ;
+channel8 : Channel ;
+channel9 : Channel ;
+channel10 : Channel ;
+channel11 : Channel ;
+channel12 : Channel ;
+channel13 : Channel ;
+channel14 : Channel ;
+channel15 : Channel ;
+}
diff --git a/grammars/video/Channel/channelProlog.gf b/grammars/video/Channel/channelProlog.gf
new file mode 100644
index 000000000..4f5e73f6e
--- /dev/null
+++ b/grammars/video/Channel/channelProlog.gf
@@ -0,0 +1,22 @@
+-- File namne channel.Prolog.gf
+
+concrete channelProlog of channel = {
+
+pattern
+--channel0 = "0" ;
+channel1 = "svt1" ;
+channel2 = "svt2" ;
+channel3 = "tv3" ;
+channel4 = "tv4" ;
+channel5 = "tv5" ;
+channel6 = "tve" ;
+channel7 = "raiuno" ;
+channel8 = "sat1" ;
+channel9 = "cnn" ;
+channel10 = "bbcworld" ;
+channel11 = "tvpolonia" ;
+channel12 = "dr1" ;
+channel13 = "dr2" ;
+channel14 = "nrk1" ;
+channel15 = "nrk2" ;
+}
diff --git a/grammars/video/Channel/channelRes.Abs.gf b/grammars/video/Channel/channelRes.Abs.gf
new file mode 100644
index 000000000..b07fb82f8
--- /dev/null
+++ b/grammars/video/Channel/channelRes.Abs.gf
@@ -0,0 +1,29 @@
+---File name channelRes.Abs.gf
+
+ include /users/ling/karinc/GF/Grammars/resource/res.Types.gf ;
+
+cat
+Channel ;
+
+fun
+
+channel0 : Channel ;
+channel1 : Channel ;
+channel2 : Channel ;
+channel3 : Channel ;
+channel4 : Channel ;
+channel5 : Channel ;
+channel6 : Channel ;
+channel7 : Channel ;
+channel8 : Channel ;
+channel9 : Channel ;
+channel10 : Channel ;
+channel11 : Channel ;
+channel12 : Channel ;
+channel13 : Channel ;
+channel14 : Channel ;
+channel15 : Channel ;
+channel16 : Channel ;
+channel17 : Channel ;
+channel18 : Channel ;
+channel19 : Channel ; \ No newline at end of file
diff --git a/grammars/video/Channel/channelRes.Prolog.gf b/grammars/video/Channel/channelRes.Prolog.gf
new file mode 100644
index 000000000..3900cbf36
--- /dev/null
+++ b/grammars/video/Channel/channelRes.Prolog.gf
@@ -0,0 +1,27 @@
+-- File name channelRes.Prolog.gf
+
+include
+ /users/ling/karinc/GF/GFSommar/Video/VideoK/Channel/channelRes.Abs.gf ;
+
+pattern
+channel0 = "0" ;
+channel1 = "1" ;
+channel2 = "2" ;
+channel3 = "3" ;
+channel4 = "4" ;
+channel5 = "5" ;
+channel6 = "6" ;
+channel7 = "7" ;
+channel8 = "8" ;
+channel9 = "9" ;
+channel10 = "10" ;
+channel11 = "11" ;
+channel12 = "12" ;
+channel13 = "13" ;
+channel14 = "14" ;
+channel15 = "15" ;
+channel16 = "16" ;
+channel17 = "17" ;
+channel18 = "18" ;
+channel19 = "19" ;
+
diff --git a/grammars/video/Channel/channelResSwe.gf b/grammars/video/Channel/channelResSwe.gf
new file mode 100644
index 000000000..71693325c
--- /dev/null
+++ b/grammars/video/Channel/channelResSwe.gf
@@ -0,0 +1,26 @@
+concrete channelResSwe of channel = open ResourceSwe, ParadigmsSwe in {
+
+lincat Channel = PN ;
+
+lin
+channel0 = pnReg (variants {["Nollan"];["Bollan"]}) utrum nonmasculine ;
+channel1 = pnReg (variants {["s,v,t,ett"];["t,v,ett"];["kanal ett"];["ettan"]}) utrum nonmasculine ;
+channel2 = pnReg (variants {["s v t två"];["t v två"];["kanal två"];["tvåan"]}) utrum nonmasculine ;
+channel3 = pnReg (variants {["t v tre"];["kanal tre"];["trean"]}) utrum nonmasculine ;
+channel4 = pnReg (variants {["t v fyra"];["fyran"]}) utrum nonmasculine ;
+channel5 = pnReg (variants {["t v fem"];["femman"]}) utrum nonmasculine ;
+channel6 = pnReg (variants {["t v e"]}) utrum nonmasculine ;
+channel7 = pnReg (variants {["rai uno"]}) utrum nonmasculine ;
+channel8 = pnReg (variants {["sat ains"]}) utrum nonmasculine ;
+channel9 = pnReg (variants {["c n n"];["si n n"]}) utrum nonmasculine ;
+channel10 = pnReg (variants {["b b c world"]}) utrum nonmasculine ;
+channel11 = pnReg (variants {["t v polonia"];["polonia"]}) utrum nonmasculine ;
+channel12 = pnReg (variants {["d r ett"]}) utrum nonmasculine ;
+channel13 = pnReg (variants {["d r två"]}) utrum nonmasculine ;
+channel14 = pnReg (variants {["n r k ett"]}) utrum nonmasculine ;
+channel15 = pnReg (variants {["n r k två"]}) utrum nonmasculine ;
+channel16 = pnReg (variants {["kanal X"];["Xan"]}) utrum nonmasculine ;
+channel17 = pnReg (variants {["kanal X"];["Xan"]}) utrum nonmasculine ;
+channel18 = pnReg (variants {["kanal X"];["Xan"]}) utrum nonmasculine ;
+channel19 = pnReg (variants {["kanal X"];["Xan"]}) utrum nonmasculine ;
+}
diff --git a/grammars/video/Channel/channelSwe.gf b/grammars/video/Channel/channelSwe.gf
new file mode 100644
index 000000000..3e4ee44ac
--- /dev/null
+++ b/grammars/video/Channel/channelSwe.gf
@@ -0,0 +1,20 @@
+concrete channelSwe of channel = {
+lin
+
+--channel0 = {s = (variants {["noll"]})} ;
+channel1 = {s = (variants {["s v t ett"];["t v ett"];["kanal ett"];["ettan"]})} ;
+channel2 = {s = (variants {["s v t två"];["t v två"];["kanal två"];["tvåan"]})} ;
+channel3 = {s = (variants {["t v tre"];["kanal tre"];["trean"]})} ;
+channel4 = {s = (variants {["t v fyra"];["fyran"]})} ;
+channel5 = {s = (variants {["t v fem"];["kanal fem"];["femman"]})} ;
+channel6 = {s = (variants {["t v espanja"];["t v e"]})} ;
+channel7 = {s = (variants {["rai uno"]})} ;
+channel8 = {s = (variants {["sat ains"]})} ;
+channel9 = {s = (variants {["c n n"];["si n n"]})} ;
+channel10 = {s = (variants {["b b c world"];["bi bi si world"];["bi bi si"];["b b c"]})} ;
+channel11 = {s = (variants {["t v polonia"];["polonia"]})} ;
+channel12 = {s = (variants {["d r ett"]})} ;
+channel13 = {s = (variants {["d r två"]})} ;
+channel14 = {s = (variants {["n r k ett"]})} ;
+channel15 = {s = (variants {["n r k två"]})} ;
+}
diff --git a/grammars/video/Channel/date.Swe.gf b/grammars/video/Channel/date.Swe.gf
new file mode 100644
index 000000000..87d887a9a
--- /dev/null
+++ b/grammars/video/Channel/date.Swe.gf
@@ -0,0 +1,56 @@
+pattern
+today = "today" ;
+january = "01" ;
+february = "02" ;
+march = "03" ;
+april = "04" ;
+may = "05" ;
+june = "06" ;
+july = "07" ;
+august = "08" ;
+september = "09" ;
+october = "10" ;
+november = "11" ;
+december = "12" ;
+
+day1 = "01" ;
+day2 = "02" ;
+day3 = "03" ;
+day4 = "04" ;
+day5 = "05" ;
+day6 = "06" ;
+day7 = "07" ;
+day8 = "08" ;
+day9 = "09" ;
+day10 = "10" ;
+day11 = "11" ;
+day12 = "12" ;
+day13 = "13" ;
+day14 = "14" ;
+day15 = "15" ;
+day16 = "16" ;
+day17 = "17" ;
+day18 = "18" ;
+day19 = "19" ;
+day20 = "20" ;
+day21 = "21" ;
+day22 = "22" ;
+day23 = "23" ;
+day24 = "24" ;
+day25 = "25" ;
+day26 = "26" ;
+day27 = "27" ;
+day28 = "28" ;
+day29 = "29" ;
+day30 = "30" ;
+day31 = "31" ;
+
+lin
+month29 m = {s = m.s} ;
+month30 m = {s = m.s} ;
+month31 m = {s = m.s} ;
+date29 d m = {s = d.s ++ m.s} ;
+date30 d m = {s = d.s ++ m.s} ;
+date3031 d m = {s = d.s ++ m.s} ;
+date31 d m = {s = d.s ++ m.s} ;
+date d = {s = d.s} ;
diff --git a/grammars/video/README b/grammars/video/README
new file mode 100644
index 000000000..796a2c08a
--- /dev/null
+++ b/grammars/video/README
@@ -0,0 +1,53 @@
+Video dialogue grammars by Karin Cavallin.
+
+Reconstructed in GF 2 with multiple inheritance. AR 16/9/2004
+
+Example usage (test Swedish generation and parsing, and Prolog
+generation)
+
+ > i allSwe.gf
+ > i allProlog.gf
+
+ > gr -cat=DMove | l -tr -lang=allSwe | p -cat=DMove -lang=allSwe | l -lang=allProlog
+ vill du använda svenska eller engelska
+ ask ([language (X)])
+
+The intended use of that grammar is in dialogue systems to program a
+video recorder. Queries in Swedish are translated to Prolog.
+
+The original grammar is written in GF 1.2 and includes. There is a
+very nice modular structure, which could not be reproduced with the
+single inheritance straightjacket of GF 2.0. But now we can finally
+do this again!
+
+
+Map of abstract syntax inheritances.
+
+ all
+ / \
+ / \
+ specUser specSystem
+ / \ / \
+ genUser specific genSystem
+ | / | | \ |
+ | / | | \ |
+ | / channel time weekday |
+ | | |
+ | | |
+ -----general ------------------
+
+
+The map was obtained by:
+
+grep abstract *.gf */*.gf
+
+all.gf:abstract all = specUser,specSystem ** {
+Channel/channel.gf:abstract channel = {
+Shared/general.gf:abstract general = {
+Shared/specific.gf:abstract specific = general, weekday, time, channel ** {
+System/genSystem.gf:abstract genSystem = general ** {
+System/specSystem.gf:abstract specSystem = specific, genSystem ** {
+Time/time.gf:abstract time = {
+User/genUser.gf:abstract genUser = general ** {
+User/specUser.gf:abstract specUser = specific, genUser ** {
+Weekday/weekday.gf:abstract weekday = {
diff --git a/grammars/video/Shared/general.Prolog.gf b/grammars/video/Shared/general.Prolog.gf
new file mode 100644
index 000000000..322c805b4
--- /dev/null
+++ b/grammars/video/Shared/general.Prolog.gf
@@ -0,0 +1,50 @@
+-- File name Shared/general.Prolog.gf
+include
+ general.Abs.gf ;
+
+flags lexer=codelit ; unlexer=codelit ; startcat=DMoveList ;
+
+
+oper
+app : Str -> Str -> Str =
+ \pred -> \arg ->
+ pred ++ "(" ++ arg ++ ")" ;
+appHakeOne : Str -> Str =
+ \arg ->
+ "["++ arg ++ "]" ;
+
+
+lin
+dmoves dm = {s = appHakeOne dm.s };
+dmoves1 dm = {s = dm.s };
+dmoves2 dm dms = {s = dm.s ++ "," ++ dms.s };
+
+lin
+answer p = {s = app "answer" p.s};
+--request a = {s = app "request" a.s };
+
+--- Answers
+propans a = {s = a.s} ;
+negpropans a = {s = app "not" a.s} ;
+shortans a = {s = a.s} ;
+negShortAns a = {s = a.s} ;
+
+negprop n p = {s = n.s ++ p.s} ;
+
+pattern
+neg = [] ;
+
+pattern
+----Short answers
+yes = "yes" ;
+no = "no";
+english = "english" ; ----???
+swedish = "swedish" ; ----???
+
+lin
+indShortAns a = {s = a.s} ;
+not n = {s = n.s} ;
+
+--avsluta??
+--börja om
+top = { s = "top"} ;
diff --git a/grammars/video/Shared/general.gf b/grammars/video/Shared/general.gf
new file mode 100644
index 000000000..98922c8c6
--- /dev/null
+++ b/grammars/video/Shared/general.gf
@@ -0,0 +1,51 @@
+abstract general = {
+
+cat
+Action ;
+DMove ;
+DMoves ;
+DMoveList ;
+
+Ind ;
+Prop ;
+
+fun
+--- DMove
+dmoves : DMoves -> DMoveList ;
+dmoves1 : DMove -> DMoves ;
+dmoves2 : DMove -> DMoves -> DMove ;
+
+-- File name User/general.Abs.gf
+
+cat
+Answer ;
+ShortAns ;
+NegShortAns ;
+NegProp ;
+Neg ;
+
+fun
+answer : Answer -> DMove ;
+--request : Action -> DMove ;
+
+--- Answers
+propans : Prop -> Answer ;
+negpropans : NegProp -> Answer ;
+shortans : ShortAns -> Answer ;
+negShortAns : NegShortAns -> Answer ;
+
+negprop : Neg -> Prop -> NegProp ;
+neg : Neg ;
+
+--Short answers
+swedish : ShortAns ;
+english : ShortAns ;
+yes : ShortAns ;
+no : NegShortAns ;
+indShortAns : Ind -> ShortAns ;
+not : ShortAns -> NegShortAns ;
+
+--avsluta??
+--börja om
+top : Action ;
+}
diff --git a/grammars/video/Shared/generalProlog.gf b/grammars/video/Shared/generalProlog.gf
new file mode 100644
index 000000000..907a6b787
--- /dev/null
+++ b/grammars/video/Shared/generalProlog.gf
@@ -0,0 +1,43 @@
+-- File name Shared/general.Prolog.gf
+
+concrete generalProlog of general = open prologResource in {
+
+flags lexer=codelit ; unlexer=codelit ; startcat=DMoveList ;
+
+
+
+lin
+dmoves dm = {s = appHakeOne dm.s };
+dmoves1 dm = {s = dm.s };
+dmoves2 dm dms = {s = dm.s ++ "," ++ dms.s };
+
+lin
+answer p = {s = app "answer" p.s};
+--request a = {s = app "request" a.s };
+
+--- Answers
+propans a = {s = a.s} ;
+negpropans a = {s = app "not" a.s} ;
+shortans a = {s = a.s} ;
+negShortAns a = {s = a.s} ;
+
+negprop n p = {s = n.s ++ p.s} ;
+
+pattern
+neg = [] ;
+
+pattern
+----Short answers
+yes = "yes" ;
+no = "no";
+english = "english" ; ----???
+swedish = "swedish" ; ----???
+
+lin
+indShortAns a = {s = a.s} ;
+not n = {s = n.s} ;
+
+--avsluta??
+--börja om
+top = { s = "top"} ;
+} \ No newline at end of file
diff --git a/grammars/video/Shared/generalSwe.gf b/grammars/video/Shared/generalSwe.gf
new file mode 100644
index 000000000..b8e0c8f0f
--- /dev/null
+++ b/grammars/video/Shared/generalSwe.gf
@@ -0,0 +1,43 @@
+concrete generalSwe of general = {
+
+flags lexer=codelit ; unlexer=codelit ; startcat=DMoveList ;
+
+
+lincat DMove = {s : Str} ;
+
+lin
+dmoves dm = {s = dm.s };
+dmoves1 dm = {s = dm.s };
+dmoves2 dm dms = {s = dm.s ++ "," ++ dms.s };
+lin
+
+answer a = {s = a.s } ;
+
+
+--- Answers
+propans a = {s = a.s} ;
+negpropans a = {s = a.s} ;
+shortans a = {s = a.s} ;
+negShortAns a = {s = a.s} ;
+
+negprop n p = {s= n.s ++ p.s} ;
+
+pattern
+neg = "inte" ;
+
+pattern
+--Short answers
+swedish = "svenska" ;
+english = "engelska" ;
+yes = (variants {"ja" ; "jajamensan" ; "japp"}) ;
+no = "nej";
+
+lin
+indShortAns a = {s = a.s} ;
+not n = {s = n.s} ;
+
+--avsluta??
+--börja om
+-- variants? från början etc?
+top = { s = ["börja om"]} ;
+}
diff --git a/grammars/video/Shared/prologResource.gf b/grammars/video/Shared/prologResource.gf
new file mode 100644
index 000000000..a527500e1
--- /dev/null
+++ b/grammars/video/Shared/prologResource.gf
@@ -0,0 +1,19 @@
+resource prologResource = {
+
+oper
+app : Str -> Str -> Str =
+ \pred -> \arg ->
+ pred ++ "(" ++ arg ++ ")" ;
+appHakeOne : Str -> Str =
+ \arg ->
+ "["++ arg ++ "]" ;
+oper
+--with single quotes
+--app2 : Str -> Str -> Str -> Str = \pred -> \argH -> \argM -> pred ++ "(" ++ "'" ++ argH ++ ":" ++ argM ++ "'" ++ ")" ;
+--without single quotes
+--app2 : Str -> Str -> Str -> Str = \pred -> \argH -> \argM -> pred ++ "(" ++ argH ++ ":" ++ argM ++ ")" ;
+
+app3 : Str -> Str -> Str = \argH -> \argM -> argH ++ ":" ++ argM ;
+
+
+}
diff --git a/grammars/video/Shared/specific.gf b/grammars/video/Shared/specific.gf
new file mode 100644
index 000000000..424b1023e
--- /dev/null
+++ b/grammars/video/Shared/specific.gf
@@ -0,0 +1,29 @@
+abstract specific = general, weekday, time, channel ** {
+
+cat
+StartTime ;
+EndTime ;
+ChToStore ;
+WdToStore ;
+
+cat
+DelAction ;
+
+fun
+--- Inds
+indTime : Time -> Ind;
+indChannel : Channel -> Ind;
+indWeekday : Weekday -> Ind;
+
+fun
+delAction : DelAction -> Action ;
+delete_rec_job : DelAction ;
+
+fun
+startTimeToStore : Time -> StartTime ;
+endTimeToStore : Time -> EndTime ;
+channelToStore : Channel -> ChToStore ;
+weekdayToStore : Weekday -> WdToStore ;
+
+vcr_add_rec_job_no_args : Action ; ---- moved from specUser and specSystem
+}
diff --git a/grammars/video/Shared/specificProlog.gf b/grammars/video/Shared/specificProlog.gf
new file mode 100644
index 000000000..8ca76dbed
--- /dev/null
+++ b/grammars/video/Shared/specificProlog.gf
@@ -0,0 +1,22 @@
+-- File name Shared/specific.Prolog.gf
+
+concrete specificProlog of specific =
+ generalProlog, weekdayProlog, channelProlog, timeProlog **
+ open prologResource in {
+
+lin
+indTime t = {s = t.s} ;
+indChannel c = {s = c.s} ;
+indWeekday w = {s = w.s} ;
+
+delete_rec_job = {s = "delete_rec_job"} ;
+delAction dact = {s = dact.s };
+
+
+startTimeToStore st = {s = app "start_time_to_store" st.s } ;
+endTimeToStore et = {s = app "stop_time_to_store" et.s } ;
+channelToStore ch = {s = app "channel_to_store" ch.s } ;
+weekdayToStore wd = {s = app "weekday_to_store" wd.s } ;
+
+vcr_add_rec_job_no_args = {s = ["add_rec_job"]} ; -- hack!!!
+}
diff --git a/grammars/video/Shared/specificSwe.gf b/grammars/video/Shared/specificSwe.gf
new file mode 100644
index 000000000..2361a0c5e
--- /dev/null
+++ b/grammars/video/Shared/specificSwe.gf
@@ -0,0 +1,20 @@
+--# -path=.:../Time:../Channel:../Weekday
+
+concrete specificSwe of specific = generalSwe, weekdaySwe, timeSwe, channelSwe ** {
+
+lin
+indTime t = {s = t.s} ;
+indChannel c = {s = c.s} ;
+indWeekday w = {s = w.s} ;
+
+delete_rec_job = {s = ["ta bort inspelning"]} ;
+delAction dact = {s = dact.s };
+
+
+startTimeToStore st = {s = "från" ++ st.s } ;
+endTimeToStore et = {s = "till" ++ et.s } ;
+channelToStore ch = {s = "på" ++ ch.s } ;
+weekdayToStore wd = {s = "på" ++ wd.s } ;
+
+vcr_add_rec_job_no_args = {s = ["spela in"]} ; ----
+}
diff --git a/grammars/video/System/genSystem.gf b/grammars/video/System/genSystem.gf
new file mode 100644
index 000000000..d25fb0fee
--- /dev/null
+++ b/grammars/video/System/genSystem.gf
@@ -0,0 +1,37 @@
+-- general.Abs.gf
+
+abstract genSystem = general ** {
+
+
+cat
+Empty ; -- whatever this is good for?
+Question ;
+YNQuestion ;
+WHQuestion ;
+AltQuestion ;
+PropQ ;
+
+
+fun
+greet : DMove ; -- "Welcome"
+quit : DMove ; -- "Goodbye"
+
+ask : Question -> DMove ;
+
+--- Language
+change_language : Action ;
+language_alt : Question ;
+
+--- Actions
+actionQ : WHQuestion ;
+
+--- Questions
+whQuestion : WHQuestion -> Question ;
+altQuestion : YNQuestion -> YNQuestion -> AltQuestion ;
+
+--- Issue
+issue : Question -> PropQ ;
+
+--- Lists
+nil : Empty ;
+}
diff --git a/grammars/video/System/genSystemProlog.gf b/grammars/video/System/genSystemProlog.gf
new file mode 100644
index 000000000..511c80b7e
--- /dev/null
+++ b/grammars/video/System/genSystemProlog.gf
@@ -0,0 +1,32 @@
+-- File name system.Prolog.gf
+
+concrete genSystemProlog of genSystem = generalProlog **
+ open prologResource in {
+
+
+pattern
+greet = "greet" ;
+quit = "quit" ;
+
+lin
+ask q = {s = app "ask" q.s} ;
+
+lin
+---Language
+change_language = {s = "change_language"} ;
+language_alt = {s = "[" ++ "language" ++ "(" ++ "X" ++ ")" ++ "]" } ; -- hack!
+
+---Actions
+pattern
+actionQ = "action" ;
+
+lin
+whQuestion f = {s = "X" ++ "^" ++ app f.s "X"} ;
+altQuestion a1 a2 = {s = a1.s ++ a2.s};
+
+--- Issue
+issue i = {s = app "issue" i.s} ;
+
+pattern
+nil = "[]" ;
+}
diff --git a/grammars/video/System/genSystemSwe.gf b/grammars/video/System/genSystemSwe.gf
new file mode 100644
index 000000000..8b9a93b0d
--- /dev/null
+++ b/grammars/video/System/genSystemSwe.gf
@@ -0,0 +1,32 @@
+-- File name System/general.Swe.gf
+
+concrete genSystemSwe of genSystem = generalSwe ** open icm100ResSwe in {
+
+---- flags lexer=codelit ; unlexer=codelit ; startcat=DMoveList ;
+
+pattern
+greet = ["Välkommen till videobandspelaren"] ;
+quit = "hejdå" ;
+
+lin
+ask a = {s = a.s} ;
+
+lin
+---Language
+change_language = {s = "byt" ++ "språk"} ;
+language_alt = {s = ["vill du använda svenska eller engelska"]} ;
+
+---Actions
+lin
+actionQ = {s = "Vad" ++ "kan" ++ "jag" ++ "stå" ++ "till" ++ "tjänst" ++ "med"} ;
+
+lin
+whQuestion w = {s = w.s };
+altQuestion a1 a2 = {s = "vill" ++ "du" ++ "spela" ++ "in" ++ a1.s ++ "eller" ++ a2.s};
+
+--- Issue
+issue i = {s = i.s} ;
+
+pattern
+nil = "[]" ;
+} \ No newline at end of file
diff --git a/grammars/video/System/general.Prolog.gf b/grammars/video/System/general.Prolog.gf
new file mode 100644
index 000000000..942d43e9c
--- /dev/null
+++ b/grammars/video/System/general.Prolog.gf
@@ -0,0 +1,32 @@
+-- File name system.Prolog.gf
+
+include
+ general.Abs.gf ;
+ ../icm100.Prolog.gf ;
+
+
+pattern
+greet = "greet" ;
+quit = "quit" ;
+
+lin
+ask q = {s = app "ask" q.s} ;
+
+lin
+---Language
+change_language = {s = "change_language"} ;
+language_alt = {s = "[" ++ "language" ++ "(" ++ "X" ++ ")" ++ "]" } ; -- hack!
+
+---Actions
+pattern
+actionQ = "action" ;
+
+lin
+whQuestion f = {s = "X" ++ "^" ++ app f.s "X"} ;
+altQuestion a1 a2 = {s = a1.s ++ a2.s};
+
+--- Issue
+issue i = {s = app "issue" i.s} ;
+
+pattern
+nil = "[]" ; \ No newline at end of file
diff --git a/grammars/video/System/re2specific.Swe.gf b/grammars/video/System/re2specific.Swe.gf
new file mode 100644
index 000000000..664f3ef95
--- /dev/null
+++ b/grammars/video/System/re2specific.Swe.gf
@@ -0,0 +1,60 @@
+-- File name System/specific.Swe.gf
+
+include
+ specific.Abs.gf ;
+
+lin
+-- Confirm recording job
+confirmRecJob act = {s = ["bekräftar"] ++ act.s } ;
+-- programmet är inspelat -- spela in
+-- inspelningen är tillagd -- lägga till
+-- programmet är borttaget -- ta bort
+
+q_lambdaActionDel dact = {s = ["vilket programnummer vill du ta bort"]};
+
+
+
+vcr_add_rec_job_no_args = {s = ["spela in"]} ; -- hack!!!
+
+
+
+--- Time in question
+startTimeToStoreQ st = {s = "från" ++ st.s } ;
+-- prep Time
+endTimeToStoreQ et = {s = "till" ++ et.s } ;
+-- prep Time
+
+--- Channel and Weekday in question
+channelToStoreQ ch = {s = "på" ++ ch.s } ;
+-- prep Channel
+weekdayToStoreQ wd = {s = "på" ++ wd.s } ;
+--prep Weekday
+
+
+--- WHQuestions --- Lambdas
+q_lambdaWeekday wdts = {s = ["vilken dag vill du spela in på"]};
+q_lambdaChannel chts = {s = ["vilken kanal vill du spela in från"]};
+q_lambdaStartTime stts = {s = ["vilken tid vill du påbörja inspelningen"]};
+q_lambdaEndTime etts = {s = ["vilken tid vill du avsluta inspelningen"]};
+
+
+
+--- Constructions for ynquestions
+lin
+ynQuST y = {s = y.s} ;
+ynQuET y = {s = y.s} ;
+ynQuCH y = {s = y.s} ;
+ynQuWD y = {s = y.s} ;
+
+lin
+--- Props
+startTimeToStoreProp st = {s = st.s } ;
+endTimeToStoreProp et = {s = et.s } ;
+channelToStoreProp chst = {s = chst.s } ;
+weekdayToStoreProp wdts = {s = wdts.s } ;
+
+channelListing chs = {s = chs.s } ;
+channels1 ch = {s = ch.s } ;
+channels2 ch chs = {s = ch.s ++ "," ++ chs.s } ;
+channelListAction ch = {s = ch.s } ;
+channelListActionDMove ch = {s = ch.s } ; \ No newline at end of file
diff --git a/grammars/video/System/specSystem.gf b/grammars/video/System/specSystem.gf
new file mode 100644
index 000000000..0b5f6957e
--- /dev/null
+++ b/grammars/video/System/specSystem.gf
@@ -0,0 +1,59 @@
+-- File name System/specific.Abs.gf
+
+abstract specSystem = specific, genSystem ** {
+
+cat
+StartTimeQ ;
+EndTimeQ ;
+ChToStoreQ ;
+WdToStoreQ ;
+
+fun
+confirmRecJob : Action -> DMove;
+---- vcr_add_rec_job_no_args : Action ; -- spela in! moved to specific
+
+q_lambdaActionDel : DelAction -> WHQuestion ;
+
+-- Time in question
+startTimeToStoreQ : Time -> StartTimeQ ;
+endTimeToStoreQ : Time -> EndTimeQ ;
+
+--- Channel and Weekday in question
+channelToStoreQ : Channel -> ChToStoreQ ;
+weekdayToStoreQ : Weekday -> WdToStoreQ ;
+
+--- WHQuestions --- Lambdas
+q_lambdaStartTime : StartTime -> WHQuestion ;
+q_lambdaEndTime : EndTime -> WHQuestion ;
+q_lambdaWeekday : WdToStore -> WHQuestion ;
+q_lambdaChannel : ChToStore -> WHQuestion ;
+
+
+--- Constructions for ynquestions
+ynQuST : StartTimeQ -> YNQuestion ;
+ynQuET : EndTimeQ -> YNQuestion ;
+ynQuCH : ChToStoreQ -> YNQuestion ;
+ynQuWD: WdToStoreQ -> YNQuestion ;
+
+
+--- Props
+startTimeToStoreProp : StartTime -> Prop ;
+endTimeToStoreProp : EndTime -> Prop ;
+channelToStoreProp : ChToStore -> Prop ;
+weekdayToStoreProp : WdToStore -> Prop ;
+
+
+cat
+ChannelList ;
+Channels ;
+ChannelAction ;
+
+fun
+channelListing : Channels -> ChannelList ;
+channels1 : Channel -> Channels ;
+channels2 : Channel -> Channels -> Channel ;
+channelListAction : ChannelList -> ChannelAction ;
+--channelListAction : ChannelList -> DMove ;
+channelListActionDMove : ChannelAction -> DMove ;
+
+}
diff --git a/grammars/video/System/specSystemProlog.gf b/grammars/video/System/specSystemProlog.gf
new file mode 100644
index 000000000..6ee65c4e3
--- /dev/null
+++ b/grammars/video/System/specSystemProlog.gf
@@ -0,0 +1,45 @@
+-- File name System/specific.Prolog.gf
+
+concrete specSystemProlog of specSystem = genSystemProlog, specificProlog **
+ open prologResource in {
+
+lin
+-- Confirm recording job
+confirmRecJob act = {s = app "confirm" act.s } ;
+
+q_lambdaActionDel dact = {s = ["rec_job_to_delete"]} ;
+
+--- Time in question
+startTimeToStoreQ st = {s = app "start_time_to_store" st.s } ;
+endTimeToStoreQ et = {s = app "stop_time_to_store" et.s } ;
+
+--- Channel and Weekday in question
+channelToStoreQ ch = {s = app "channel_to_store" ch.s } ;
+weekdayToStoreQ wd = {s = app "weekday_to_store" wd.s } ;
+
+--- WHQuestions --- Lambdas
+q_lambdaWeekday wdts = {s = ["weekday_to_store"]} ;
+q_lambdaChannel chts = {s = ["channel_to_store"]} ;
+q_lambdaStartTime stts = {s = ["start_time_to_store"]} ;
+q_lambdaEndTime etts = {s = ["stop_time_to_store"]} ;
+
+
+--- Constructions for ynquestions
+lin
+ynQuST y = {s = y.s} ;
+ynQuET y = {s = y.s} ;
+ynQuCH y = {s = y.s} ;
+ynQuWD y = {s = y.s} ;
+
+--- Props
+startTimeToStoreProp st = {s = st.s } ;
+endTimeToStoreProp et = {s = et.s } ;
+channelToStoreProp chst = {s = chst.s } ;
+weekdayToStoreProp wdts = {s = wdts.s } ;
+
+channelListing chs = {s = chs.s } ;
+channels1 ch = {s = ch.s } ;
+channels2 ch chs = {s = ch.s ++ "," ++ chs.s } ;
+channelListAction ch = {s = ch.s } ;
+channelListActionDMove ch = {s = ch.s } ;
+} \ No newline at end of file
diff --git a/grammars/video/System/specSystemSwe.gf b/grammars/video/System/specSystemSwe.gf
new file mode 100644
index 000000000..e2f59cb89
--- /dev/null
+++ b/grammars/video/System/specSystemSwe.gf
@@ -0,0 +1,49 @@
+--# -path=.:..:../Shared:../Weekday:../Time:../Channel
+
+-- File name System/specific.Swe.gf
+
+concrete specSystemSwe of specSystem = specificSwe, genSystemSwe ** {
+
+lin
+-- Confirm recording job
+confirmRecJob act = {s = ["bekräftar"] ++ act.s } ;
+
+q_lambdaActionDel dact = {s = ["vilket programnummer vill du ta bort"]};
+
+---- vcr_add_rec_job_no_args = {s = ["spela in"]} ; -- hack!!!
+
+--- Time in question
+startTimeToStoreQ st = {s = "från" ++ st.s } ;
+endTimeToStoreQ et = {s = "till" ++ et.s } ;
+
+--- Channel and Weekday in question
+channelToStoreQ ch = {s = "på" ++ ch.s } ;
+weekdayToStoreQ wd = {s = "på" ++ wd.s } ;
+
+--- WHQuestions --- Lambdas
+q_lambdaWeekday wdts = {s = ["vilken dag vill du spela in på"]};
+q_lambdaChannel chts = {s = ["vilken kanal vill du spela in från"]};
+q_lambdaStartTime stts = {s = ["vilken tid vill du påbörja inspelningen"]};
+q_lambdaEndTime etts = {s = ["vilken tid vill du avsluta inspelningen"]};
+
+
+--- Constructions for ynquestions
+lin
+ynQuST y = {s = y.s} ;
+ynQuET y = {s = y.s} ;
+ynQuCH y = {s = y.s} ;
+ynQuWD y = {s = y.s} ;
+
+lin
+--- Props
+startTimeToStoreProp st = {s = st.s } ;
+endTimeToStoreProp et = {s = et.s } ;
+channelToStoreProp chst = {s = chst.s } ;
+weekdayToStoreProp wdts = {s = wdts.s } ;
+
+channelListing chs = {s = chs.s } ;
+channels1 ch = {s = ch.s } ;
+channels2 ch chs = {s = ch.s ++ "," ++ chs.s } ;
+channelListAction ch = {s = ch.s } ;
+channelListActionDMove ch = {s = ch.s } ;
+}
diff --git a/grammars/video/System/specific.Prolog.gf b/grammars/video/System/specific.Prolog.gf
new file mode 100644
index 000000000..80f9d0764
--- /dev/null
+++ b/grammars/video/System/specific.Prolog.gf
@@ -0,0 +1,46 @@
+-- File name System/specific.Prolog.gf
+
+include
+ specific.Abs.gf ;
+
+lin
+-- Confirm recording job
+confirmRecJob act = {s = app "confirm" act.s } ;
+
+q_lambdaActionDel dact = {s = ["rec_job_to_delete"]} ;
+
+vcr_add_rec_job_no_args = {s = ["add_rec_job"]} ; -- hack!!!
+
+--- Time in question
+startTimeToStoreQ st = {s = app "start_time_to_store" st.s } ;
+endTimeToStoreQ et = {s = app "stop_time_to_store" et.s } ;
+
+--- Channel and Weekday in question
+channelToStoreQ ch = {s = app "channel_to_store" ch.s } ;
+weekdayToStoreQ wd = {s = app "weekday_to_store" wd.s } ;
+
+--- WHQuestions --- Lambdas
+q_lambdaWeekday wdts = {s = ["weekday_to_store"]} ;
+q_lambdaChannel chts = {s = ["channel_to_store"]} ;
+q_lambdaStartTime stts = {s = ["start_time_to_store"]} ;
+q_lambdaEndTime etts = {s = ["stop_time_to_store"]} ;
+
+
+--- Constructions for ynquestions
+lin
+ynQuST y = {s = y.s} ;
+ynQuET y = {s = y.s} ;
+ynQuCH y = {s = y.s} ;
+ynQuWD y = {s = y.s} ;
+
+--- Props
+startTimeToStoreProp st = {s = st.s } ;
+endTimeToStoreProp et = {s = et.s } ;
+channelToStoreProp chst = {s = chst.s } ;
+weekdayToStoreProp wdts = {s = wdts.s } ;
+
+channelListing chs = {s = chs.s } ;
+channels1 ch = {s = ch.s } ;
+channels2 ch chs = {s = ch.s ++ "," ++ chs.s } ;
+channelListAction ch = {s = ch.s } ;
+channelListActionDMove ch = {s = ch.s } ; \ No newline at end of file
diff --git a/grammars/video/Time/time.Catalan.gf b/grammars/video/Time/time.Catalan.gf
new file mode 100644
index 000000000..b987486cb
--- /dev/null
+++ b/grammars/video/Time/time.Catalan.gf
@@ -0,0 +1,135 @@
+-- Time grammar Catalan
+
+include time.Abs.gf ;
+
+lin
+
+hour0 = {s = refs "dotze" "una"} ;
+hour1 = {s = refs ["la una"] "dues"} ;
+hour2 = {s = refs "dues" "tres"} ;
+hour3 = {s = refs "tres" "quatre"} ;
+hour4 = {s = refs "quatre" "cinc"} ;
+hour5 = {s = refs "cinc" "sis"} ;
+hour6 = {s = refs "sis" "set"} ;
+hour7 = {s = refs "set" "vuit"} ;
+hour8 = {s = refs "vuit" "nou"} ;
+hour9 = {s = refs "nou" "deu"} ;
+hour10 = {s = refs "deu" "onze"} ;
+hour11 = {s = refs "onze" "dotze"} ;
+hour12 = {s = refs "dotze" "una" } ;
+hour13 = {s = refs "tretze" "dues" };
+hour14 = {s = refs "catorze" "tres" };
+hour15 = {s = refs "quinze" "quatre" };
+hour16 = {s = refs "setze" "cinc" };
+hour17 = {s = refs "disset" "sis" };
+hour18 = {s = refs "divuit" "set" };
+hour19 = {s = refs "dinou" "vuit" } ;
+hour20 = {s = refs "vint" "nou" } ;
+hour21 = {s = refs "vintiun_a" "deu" } ;
+hour22 = {s = refs "vintidues_dos" "onze" } ;
+hour23 = {s = refs "vintitres" "dotze" };
+
+pattern
+--Minutes
+minute0 = "zero" ;
+minute1 = "una" ;
+minute2 = "dues" ;
+minute3 = "tres" ;
+minute4 = "quatre" ;
+minute5 = "cinc" ;
+minute6 = "sis" ;
+minute7 = "set" ;
+minute8 = "vuit" ;
+minute9 = "nou" ;
+minute10 = "deu" ;
+minute11 = "onze" ;
+minute12 = "dotze" ;
+minute13 = "tretze" ;
+minute14 = "catorze" ;
+minute15 = "quinze" ;
+minute16 = "setze" ;
+minute17 = "disset" ;
+minute18 = "divuit" ;
+minute19 = "dinou" ;
+minute20 = "vint" ;
+minute21 = "vintiun_a" ;
+minute22 = "vintidues_dos" ;
+minute23 = "vintitres" ;
+minute24 = "vintiquatre" ;
+minute25 = "vinticinc" ;
+minute26 = "vintisis" ;
+minute27 = "vintiset" ;
+minute28 = "vintivuit" ;
+minute29 = "vintinou" ;
+minute30 = "trenta" ;
+minute31 = "trentauna" ;
+minute32 = "trentadues" ;
+minute33 = "trentatres" ;
+minute34 = "trentaquatre" ;
+minute35 = "trentacinc" ;
+minute36 = "trentasis" ;
+minute37 = "trentaset" ;
+minute38 = "trentavuit" ;
+minute39 = "trentanou" ;
+minute40 = "quaranta" ;
+minute41 = "quarantauna" ;
+minute42 = "quarantadues" ;
+minute43 = "quarantatres" ;
+minute44 = "quarantaquatre" ;
+minute45 = "quarantacinc" ;
+minute46 = "quarantasis" ;
+minute47 = "quarantaset" ;
+minute48 = "quarantavuit" ;
+minute49 = "quarantanou" ;
+minute50 = "cinquenta" ;
+minute51 = "cinquentauna" ;
+minute52 = "cinquentadues" ;
+minute53 = "cinquentatres" ;
+minute54 = "cinquentaquatre" ;
+minute55 = "cinquentacinc" ;
+minute56 = "cinquentasis" ;
+minute57 = "cinquentaset" ;
+minute58 = "cinquentavuit" ;
+minute59 = "cinquentanou" ;
+
+-- LexMinuteZero
+minuteZero = [] ;
+
+-- LexMinute
+minuteQuarter = "un" ++ "quart" ++ "de";
+minuteFive = "mig" ++ "quart" ++ "de";
+minuteTen = "cinc" ++ "minuts" ++ "per" ++ "a" ++ "un" ++ "quart" ++ "de";
+minuteTwenty = "un" ++ "quart" ++ "i" ++ "cinc" ++ "de";
+
+-- LexMinuteHalfFive
+minuteTwentyFive = "un" ++ "quart" ++ "i" ++ "deu" ++ "de";
+minuteThirtyFive = "dos" ++ "quarts" ++ "i" ++ "cinc" ++ "de";
+
+-- LexMinuteTo
+minuteQuarterTo = "tres" ++ "quarts" ++ "de" ;
+minuteFiveTo = "tres" ++ "quarts" ++ "i" ++ "deu" ++ "de";
+--minuteFiveTo = "cinc" ++ "minuts" ++ "per" ++ "a" ;
+minuteTenTo = "tres" ++ "quarts" ++ "i" ++ "cinc" ++ "de";
+minuteTwentyTo = "dos" ++ "quarts" ++ "i" ++ "deu" ++ "de";
+--minuteTwentyTo = "cinc" ++ "minuts" ++ "per" ++ "a" ++ "tres" ++ "quarts" ++ "de";
+
+-- LexMinuteHalf
+minuteHalf = "dos" ++ "quarts" ;
+
+-- Creates tables for each hour, consisting of
+-- Present hour - Formal, Next hour informal,
+-- (in catalan of the n:nd hour)
+param RefHour = ThisFormal | NextLex ;
+oper refs : Str -> Str -> RefHour => Str =
+ \x,y -> table {ThisFormal => x ; NextLex => y } ;
+
+lincat Hour = {s : RefHour => Str} ;
+
+lin
+time h m = {s = h.s ! ThisFormal ++ "i" ++ m.s} ;
+timeOnTheHour h m = {s = h.s ! ThisFormal ++ m.s } ;
+timePast h m = {s = m.s ++ h.s ! NextLex} ;
+timeTo h m = {s = m.s ++ h.s ! NextLex } ;
+timeHalf h m = {s = m.s ++ h.s ! NextLex } ;
+timeFiveToHalf h m = {s = m.s ++ h.s ! NextLex } ;
+timeFivePastHalf h m = {s = m.s ++ h.s ! NextLex } ; \ No newline at end of file
diff --git a/grammars/video/Time/time.Eng.gf b/grammars/video/Time/time.Eng.gf
new file mode 100644
index 000000000..04ee13c95
--- /dev/null
+++ b/grammars/video/Time/time.Eng.gf
@@ -0,0 +1,130 @@
+-- Time grammar English
+
+include time.Abs.gf ;
+
+
+lin
+hour0 = {s = refs ["null null"] (variants {["midnight"];["twelve"]}) "one"} ;
+hour1 = {s = refs "one" (variants {["one"];["one a.m"]}) "two"} ;
+hour2 = {s = refs "two" (variants {["two"];["two a.m"]}) "three"} ;
+hour3 = {s = refs "three" (variants {["three"];["three a.m"]}) "four"} ;
+hour4 = {s = refs "four" (variants {["four"];["four a.m"]}) "five"} ;
+hour5 = {s = refs "five" (variants {["five"];["five a.m"]}) "six"} ;
+hour6 = {s = refs "six" (variants {["six"];["six a.m"]}) "seven"} ;
+hour7 = {s = refs "seven" (variants {["seven"];["seven a.m"]}) "eight"} ;
+hour8 = {s = refs "eight" (variants {["eight"];["eight a.m"]}) "nine"} ;
+hour9 = {s = refs "nine" (variants {["nine"];["nine a.m"]}) "ten"} ;
+hour10 = {s = refs "ten" (variants {["ten"];["ten a.m"]}) "eleven"} ;
+hour11 = {s = refs "eleven" (variants {["eleven"];["eleven a.m"]}) "twelve"} ;
+hour12 = {s = refs "twelve" (variants {["twelve"];["twelve a.m"]}) "one" } ;
+hour13 = {s = refs "thirten" (variants {["one"];["one p.m"]}) "two" };
+hour14 = {s = refs "fourteen" (variants {["two"];["two p.m"]}) "three" } ;
+hour15 = {s = refs "fifteen" (variants {["three"];["three p.m"]}) "four" } ;
+hour16 = {s = refs "sixteen" (variants {["four"];["four p.m"]}) "five" } ;
+hour17 = {s = refs "seventeen" (variants {["five"];["five p.m"]}) "six" } ;
+hour18 = {s = refs "eighteen" (variants {["six"];["six p.m"]}) "seven" } ;
+hour19 = {s = refs "nineteen" (variants {["seven"];["seven p.m"]}) "eight" } ;
+hour20 = {s = refs "twenty" (variants {["eight"];["eight p.m"]}) "nine" } ;
+hour21 = {s = refs ["twenty one"] (variants {["nine"];["nine p.m"]}) "eight" } ;
+hour22 = {s = refs ["twenty two"] (variants {["ten"];["ten p.m"]}) "eleven" } ;
+hour23 = {s = refs ["twenty three"] (variants {["eleven"]}) (variants {["midnight"];["twelve"]})} ;
+
+
+lin
+
+minute0 = {s = mins (variants {["o'clock"];["sharp"];["hundred hours"]}) (variants{[""]}) (variants{})};
+minute1 = {s = mins ["oh one"] (variants{["one minute past"];["one past"]}) (variants{})};
+minute2 = {s = mins ["oh two"] (variants{["two minutes past"];["two past"]}) (variants{})};
+minute3 = {s = mins ["oh three"] (variants{["three minutes past"];["three past"]}) (variants{})};
+minute4 = {s = mins ["oh four"] (variants{["four minutes past"];["four past"]}) (variants{})};
+minute5 = {s = mins ["oh five"] (variants{["five minutes past"];["five past"]}) (variants{})};
+minute6 = {s = mins ["oh six"] (variants{["six minutes past"];["six past"]}) (variants{})};
+minute7 = {s = mins ["oh seven"] (variants{["seven minutes past"];["seven past"]}) (variants{})};
+minute8 = {s = mins ["oh eight"] (variants{["eight minutes past"];["eight past"]}) (variants{})};
+minute9 = {s = mins ["oh nine"] (variants{["nine minutes past"];["nine past"]}) (variants{})};
+
+minute10 = {s = mins ["ten"] (variants{["ten minutes past"];["ten past"]}) (variants{})};
+minute11 = {s = mins ["eleven"] (variants{["eleven minutes past"];["eleven past"]}) (variants{})};
+minute12 = {s = mins ["twelve"] (variants{["twelve minutes past"];["twelve past"]}) (variants{})};
+minute13 = {s = mins ["thirteen"] (variants{["thirteen minutes past"];["thirteen past"]}) (variants{})};
+minute14 = {s = mins ["fourteen"] (variants{["fourteen minutes past"];["fourteen past"]}) (variants{})};
+minute15 = {s = mins ["fifteen"] (variants{["fifteen minutes past"];["fifteen past"];["quarter past"];["a quarter past"]}) (variants{})};
+minute16 = {s = mins ["sixteen"] (variants{["sixteen minutes past"];["sixteen past"]}) (variants{})};
+minute17 = {s = mins ["seventeen"] (variants{["seventeen minutes past"];["seventeen past"]}) (variants{})};
+minute18 = {s = mins ["eightteen"] (variants{["eighteen minutes past"];["eighteen past"]}) (variants{})};
+minute19 = {s = mins ["nineteen"] (variants{["nineteen minutes past"];["nineteen past"]}) (variants{})};
+
+minute20 = {s = mins ["twenty"] (variants{["twenty minutes past"];["twenty past"]}) (variants{})};
+minute21 = {s = mins ["twenty one"] (variants{["twenty one minutes past"];["twenty one past"]}) (variants{})};
+minute22 = {s = mins ["twenty two"] (variants{["twenty two minutes past"];["twenty two past"]}) (variants{})};
+minute23 = {s = mins ["twenty three"] (variants{["twenty three minutes past"];["twenty three past"]}) (variants{})};
+minute24 = {s = mins ["twenty four"] (variants{["twenty four minutes past"];["twenty four past"]}) (variants{})};
+minute25 = {s = mins ["twenty five"] (variants{["twenty five minutes past"];["twenty two five past"]}) (variants{})};
+minute26 = {s = mins ["twenty six"] (variants{["twenty six minutes past"];["twenty six past"]}) (variants{})};
+minute27 = {s = mins ["twenty seven"] (variants{["twenty seven minutes past"];["twenty seven past"]}) (variants{})};
+minute28 = {s = mins ["twenty eight"] (variants{["twenty eight minutes past"];["twenty eight past"]}) (variants{})};
+minute29 = {s = mins ["twenty nine"] (variants{["twenty nine minutes past"];["twenty nine past"]}) (variants{})};
+
+minute30 = {s = mins ["thirty"] (variants{["thirty minutes past"];["thirty past"];["half past"]}) (variants{})};
+
+minute31 = {s = mins ["thirty one"] (variants{["one minute past half past????"]}) (variants{["twenty nine minutes to"];["twenty nine to"]})};
+minute32 = {s = mins ["thirty two"] (variants{}) (variants{["twenty eight minutes to"];["twenty eight to"]})};
+minute33 = {s = mins ["thirty three"] (variants{}) (variants{["twenty seven minutes to"];["twenty seven to"]})};
+minute34 = {s = mins ["thirty four"] (variants{}) (variants{["twenty six minutes to"];["twenty six to"]})};
+minute35 = {s = mins ["thirty five"] (variants{}) (variants{["twenty five minutes to"];["twenty five to"]})};
+minute36 = {s = mins ["thirty six"] (variants{}) (variants{["twenty four minutes to"];["twenty four to"]})};
+minute37 = {s = mins ["thirty seven"] (variants{}) (variants{["twenty three minutes to"];["twenty three to"]})};
+minute38 = {s = mins ["thirty eight"] (variants{}) (variants{["twenty two minutes to"];["twenty two to"]})};
+minute39 = {s = mins ["thirty nine"] (variants{}) (variants{["twenty one minutes to"];["twenty one to"]})};
+minute40 = {s = mins ["fourty"] (variants{}) (variants{["twenty minutes to"];["twenty to"]})};
+
+minute41 = {s = mins ["fourty one"] (variants{}) (variants{["nineteen minutes to"];["nineteen to"]})};
+minute42 = {s = mins ["fourty two"] (variants{}) (variants{["eightteen minutes to"];["eightteen to"]})};
+minute43 = {s = mins ["fourty three"] (variants{}) (variants{["seventeen minutes to"];["seventeen to"]})};
+minute44 = {s = mins ["fourty four"] (variants{}) (variants{["sixteen minutes to"];["sixteen to"]})};
+minute45 = {s = mins ["fourty five"] (variants{["three quarters past???"]}) (variants{["fifteen minutes to"];["fifteen to"]})};
+minute46 = {s = mins ["fourty six"] (variants{}) (variants{["fourteen minutes to"];["fourteen to"]})};
+minute47 = {s = mins ["fourty seven"] (variants{}) (variants{["thirteen minutes to"];["thirteen to"]})};
+minute48 = {s = mins ["fourty eight"] (variants{}) (variants{["twelve minutes to"];["twelve to"]})};
+minute49 = {s = mins ["fourty nine"] (variants{}) (variants{["eleven minutes to"];["eleven to"]})};
+minute50 = {s = mins ["fifty"] (variants{}) (variants{["ten minutes to"];["ten to"]})};
+
+minute51 = {s = mins ["fifty one"] (variants{}) (variants{["nine minutes to"];["nine to"]})};
+minute52 = {s = mins ["fifty two"] (variants{}) (variants{["eight minutes to"];["eight to"]})};
+minute53 = {s = mins ["fifty three"] (variants{}) (variants{["seven minutes to"];["seven to"]})};
+minute54 = {s = mins ["fifty four"] (variants{}) (variants{["six minutes to"];["six to"]})};
+minute55 = {s = mins ["fifty five"] (variants{}) (variants{["five minutes to"];["five to"]})};
+minute56 = {s = mins ["fifty six"] (variants{}) (variants{["four minutes to"];["four to"]})};
+minute57 = {s = mins ["fifty seven"] (variants{}) (variants{["three minutes to"];["three to"]})};
+minute58 = {s = mins ["fifty eight"] (variants{}) (variants{["two minutes to"];["two to"]})};
+minute59 = {s = mins ["fifty nine"] (variants{}) (variants{["one minute to"];["one to"]})};
+
+
+param RefHour = ThisFormal | ThisLex | NextLex ;
+oper refs : Str -> Str -> Str -> RefHour => Str =
+ \x,y,z -> table {ThisFormal => x ; ThisLex => y ; NextLex => z } ;
+
+lincat Hour = {s : RefHour => Str} ;
+lincat Minute = {s : MinMin => Str} ;
+
+param MinMin = Form | Past | To ;
+oper mins : Str -> Str -> Str -> MinMin => Str = \x,y,z -> table {Form => x ; Past => y ; To => z } ;
+--oper mins : Str -> Str -> Str -> MinMin => Str = \x,y,z -> table {Form => x ; Past => y ; To => z } ;
+-- jag vill ha en variantsexpanderare, tänk tänk
+--oper mins : Str -> Str -> Str -> MinMin => Str = \x,y,z -> table {Form => (variants{x}) ; Past => (variants{y}) ; To => (variants{z}) } ;
+-- Time expressions
+lin
+
+--timeFormal h m = {s = h.s ! ThisFormal ++ m.s ! Form} ;
+--timeInformal h m = {s = variants {
+ --m.s ! Past ++ h.s ! ThisLex ;
+ --m.s ! To ++ h.s ! NextLex
+ --}
+ --};
+
+time h m = {s = variants {
+ h.s ! ThisFormal ++ m.s ! Form ;
+ m.s ! Past ++ h.s ! ThisLex ;
+ m.s ! To ++ h.s ! NextLex
+ }
+ }; \ No newline at end of file
diff --git a/grammars/video/Time/time.Prolog.gf b/grammars/video/Time/time.Prolog.gf
new file mode 100644
index 000000000..564a12431
--- /dev/null
+++ b/grammars/video/Time/time.Prolog.gf
@@ -0,0 +1,110 @@
+-- Time grammar Prolog output notation
+
+include time.Abs.gf ;
+
+--flags lexer=codelit ; unlexer=codelit ; startcat=Time ;
+--flags lexer=code ; unlexer=code ; startcat=Time ;
+
+pattern
+
+hour0 = "00" ;
+hour1 = "01" ;
+hour2 = "02" ;
+hour3 = "03" ;
+hour4 = "04" ;
+hour5 = "05" ;
+hour6 = "06" ;
+hour7 = "07" ;
+hour8 = "08" ;
+hour9 = "09" ;
+hour10 = "10" ;
+hour11 = "11" ;
+hour12 = "12" ;
+hour13 = "13" ;
+hour14 = "14" ;
+hour15 = "15" ;
+hour16 = "16" ;
+hour17 = "17" ;
+hour18 = "18" ;
+hour19 = "19" ;
+hour20 = "20" ;
+hour21 = "21" ;
+hour22 = "22" ;
+hour23 = "23" ;
+
+--Minutes
+minute0 = "00" ;
+minute1 = "01" ;
+minute2 = "02" ;
+minute3 = "03" ;
+minute4 = "04" ;
+minute5 = "05" ;
+minute6 = "06" ;
+minute7 = "07" ;
+minute8 = "08" ;
+minute9 = "09" ;
+minute10 = "10" ;
+minute11 = "11" ;
+minute12 = "12" ;
+minute13 = "13" ;
+minute14 = "14" ;
+minute15 = "15" ;
+minute16 = "16" ;
+minute17 = "17" ;
+minute18 = "18" ;
+minute19 = "19" ;
+minute20 = "20" ;
+minute21 = "21" ;
+minute22 = "22" ;
+minute23 = "23" ;
+minute24 = "24" ;
+minute25 = "25" ;
+minute26 = "26" ;
+minute27 = "27" ;
+minute28 = "28" ;
+minute29 = "29" ;
+minute30 = "30" ;
+
+minute31 = "31" ;
+minute32 = "32" ;
+minute33 = "33" ;
+minute34 = "34" ;
+minute35 = "35" ;
+minute36 = "36" ;
+minute37 = "37" ;
+minute38 = "38" ;
+minute39 = "39" ;
+minute40 = "40" ;
+minute41 = "41" ;
+minute42 = "42" ;
+minute43 = "43" ;
+minute44 = "44" ;
+minute45 = "45" ;
+minute46 = "46" ;
+minute47 = "47" ;
+minute48 = "48" ;
+minute49 = "49" ;
+minute50 = "50" ;
+minute51 = "51" ;
+minute52 = "52" ;
+minute53 = "53" ;
+minute54 = "54" ;
+minute55 = "55" ;
+minute56 = "56" ;
+minute57 = "57" ;
+minute58 = "58" ;
+minute59 = "59" ;
+
+oper
+--with single quotes
+--app2 : Str -> Str -> Str -> Str = \pred -> \argH -> \argM -> pred ++ "(" ++ "'" ++ argH ++ ":" ++ argM ++ "'" ++ ")" ;
+--without single quotes
+--app2 : Str -> Str -> Str -> Str = \pred -> \argH -> \argM -> pred ++ "(" ++ argH ++ ":" ++ argM ++ ")" ;
+
+app3 : Str -> Str -> Str = \argH -> \argM -> argH ++ ":" ++ argM ;
+
+lin
+--timeFormal h m = {s = app2 "time" h.s m.s } ;
+--timeInformal h m = {s = app2 "time" h.s m.s } ;
+--time h m = {s = app2 "time" h.s m.s } ;
+time h m = {s = app3 h.s m.s } ; \ No newline at end of file
diff --git a/grammars/video/Time/time.Symb.gf b/grammars/video/Time/time.Symb.gf
new file mode 100644
index 000000000..81f877668
--- /dev/null
+++ b/grammars/video/Time/time.Symb.gf
@@ -0,0 +1,127 @@
+-- Time grammar Symbolic/Numerical
+
+include time.Abs.gf ;
+
+pattern
+
+hour0 = "00" ;
+hour1 = "01" ;
+hour2 = "02" ;
+hour3 = "03" ;
+hour4 = "04" ;
+hour5 = "05" ;
+hour6 = "06" ;
+hour7 = "07" ;
+hour8 = "08" ;
+hour9 = "09" ;
+hour10 = "10" ;
+hour11 = "11" ;
+hour12 = "12" ;
+hour13 = "13" ;
+hour14 = "14" ;
+hour15 = "15" ;
+hour16 = "16" ;
+hour17 = "17" ;
+hour18 = "18" ;
+hour19 = "19" ;
+hour20 = "20" ;
+hour21 = "21" ;
+hour22 = "22" ;
+hour23 = "23" ;
+
+--Minutes
+minute0 = "00" ;
+minute1 = "01" ;
+minute2 = "02" ;
+minute3 = "03" ;
+minute4 = "04" ;
+minute5 = "05" ;
+minute6 = "06" ;
+minute7 = "07" ;
+minute8 = "08" ;
+minute9 = "09" ;
+minute10 = "10" ;
+minute11 = "11" ;
+minute12 = "12" ;
+minute13 = "13" ;
+minute14 = "14" ;
+minute15 = "15" ;
+minute16 = "16" ;
+minute17 = "17" ;
+minute18 = "18" ;
+minute19 = "19" ;
+minute20 = "20" ;
+minute21 = "21" ;
+minute22 = "22" ;
+minute23 = "23" ;
+minute24 = "24" ;
+minute25 = "25" ;
+minute26 = "26" ;
+minute27 = "27" ;
+minute28 = "28" ;
+minute29 = "29" ;
+minute30 = "30" ;
+minute31 = "31" ;
+minute32 = "32" ;
+minute33 = "33" ;
+minute34 = "34" ;
+minute35 = "35" ;
+minute36 = "36" ;
+minute37 = "37" ;
+minute38 = "38" ;
+minute39 = "39" ;
+minute40 = "40" ;
+minute41 = "41" ;
+minute42 = "42" ;
+minute43 = "43" ;
+minute44 = "44" ;
+minute45 = "45" ;
+minute46 = "46" ;
+minute47 = "47" ;
+minute48 = "48" ;
+minute49 = "49" ;
+minute50 = "50" ;
+minute51 = "51" ;
+minute52 = "52" ;
+minute53 = "53" ;
+minute54 = "54" ;
+minute55 = "55" ;
+minute56 = "56" ;
+minute57 = "57" ;
+minute58 = "58" ;
+minute59 = "59" ;
+
+-- LexMinuteZero
+minuteZero = "00" ;
+
+--LexMinutePast
+minuteQuarter = "15" ;
+minuteFive = "05" ;
+minuteTen = "10" ;
+minuteTwenty = "20" ;
+--minuteTwentyFive = "25" ;
+
+--LexMinuteToHalf
+minuteTwentyFive = "25" ;
+
+--LexMinutePastHalf
+minuteThirtyFive = "35" ;
+
+--LexMinuteHalf
+minuteHalf = "30" ;
+
+--LexMinuteTo
+minuteQuarterTo = "45" ;
+minuteFiveTo = "55" ;
+minuteTenTo = "50" ;
+minuteTwentyTo = "40" ;
+--minuteTwentyFiveTo = "35" ;
+
+lin
+time h m = {s = h.s ++ m.s} ; -- 11 30
+timeOnTheHour h m = {s = h.s ++ m.s} ; -- 11 00
+timePast h m = {s = h.s ++ m.s} ; -- 11 10
+timeTo h m = {s = h.s ++ m.s} ; -- 10 50
+timeHalf h m = {s = h.s ++ m.s} ;
+timeFiveToHalf h m = {s = h.s ++ m.s } ;
+timeFivePastHalf h m = {s = h.s ++ m.s } ; \ No newline at end of file
diff --git a/grammars/video/Time/time.gf b/grammars/video/Time/time.gf
new file mode 100644
index 000000000..30023a0b4
--- /dev/null
+++ b/grammars/video/Time/time.gf
@@ -0,0 +1,106 @@
+-- Time grammar Abstract syntax
+
+abstract time = {
+cat
+
+-- Times
+Time ;
+Hour ;
+Minute ;
+
+fun
+-- Time
+hour0 : Hour ;
+hour1 : Hour ;
+hour2 : Hour ;
+hour3 : Hour ;
+hour4 : Hour ;
+hour5 : Hour ;
+hour6 : Hour ;
+hour7 : Hour ;
+hour8 : Hour ;
+hour9 : Hour ;
+hour10 : Hour ;
+hour11 : Hour ;
+hour12 : Hour ;
+hour13 : Hour ;
+hour14 : Hour ;
+hour15 : Hour ;
+hour16 : Hour ;
+hour17 : Hour ;
+hour18 : Hour ;
+hour19 : Hour ;
+hour20 : Hour ;
+hour21 : Hour ;
+hour22 : Hour ;
+hour23 : Hour ;
+
+-- Minutes
+minute0 : Minute ;
+minute1 : Minute ;
+minute2 : Minute ;
+minute3 : Minute ;
+minute4 : Minute ;
+minute5 : Minute ;
+minute6 : Minute ;
+minute7 : Minute ;
+minute8 : Minute ;
+minute9 : Minute ;
+minute10 : Minute ;
+minute11 : Minute ;
+minute12 : Minute ;
+minute13 : Minute ;
+minute14 : Minute ;
+minute15 : Minute ;
+minute16 : Minute ;
+minute17 : Minute ;
+minute18 : Minute ;
+minute19 : Minute ;
+minute20 : Minute ;
+minute21 : Minute ;
+minute22 : Minute ;
+minute23 : Minute ;
+minute24 : Minute ;
+minute25 : Minute ;
+minute26 : Minute ;
+minute27 : Minute ;
+minute28 : Minute ;
+minute29 : Minute ;
+minute30 : Minute ;
+minute31 : Minute ;
+minute32 : Minute ;
+minute33 : Minute ;
+minute34 : Minute ;
+minute35 : Minute ;
+minute36 : Minute ;
+minute37 : Minute ;
+minute38 : Minute ;
+minute39 : Minute ;
+minute40 : Minute ;
+minute41 : Minute ;
+minute42 : Minute ;
+minute43 : Minute ;
+minute44 : Minute ;
+minute45 : Minute ;
+minute46 : Minute ;
+minute47 : Minute ;
+minute48 : Minute ;
+minute49 : Minute ;
+minute50 : Minute ;
+minute51 : Minute ;
+minute52 : Minute ;
+minute53 : Minute ;
+minute54 : Minute ;
+minute55 : Minute ;
+minute56 : Minute ;
+minute57 : Minute ;
+minute58 : Minute ;
+minute59 : Minute ;
+
+-- Time expressions
+--timeFormal : Hour -> Minute -> Time ;
+--timeInformal : Hour -> Minute -> Time ;
+time : Hour -> Minute -> Time ;
+
+
+}
diff --git a/grammars/video/Time/timeProlog.gf b/grammars/video/Time/timeProlog.gf
new file mode 100644
index 000000000..8a791ae0b
--- /dev/null
+++ b/grammars/video/Time/timeProlog.gf
@@ -0,0 +1,103 @@
+-- Time grammar Prolog output notation
+
+concrete timeProlog of time = open prologResource in {
+
+--flags lexer=codelit ; unlexer=codelit ; startcat=Time ;
+--flags lexer=code ; unlexer=code ; startcat=Time ;
+
+pattern
+
+hour0 = "00" ;
+hour1 = "01" ;
+hour2 = "02" ;
+hour3 = "03" ;
+hour4 = "04" ;
+hour5 = "05" ;
+hour6 = "06" ;
+hour7 = "07" ;
+hour8 = "08" ;
+hour9 = "09" ;
+hour10 = "10" ;
+hour11 = "11" ;
+hour12 = "12" ;
+hour13 = "13" ;
+hour14 = "14" ;
+hour15 = "15" ;
+hour16 = "16" ;
+hour17 = "17" ;
+hour18 = "18" ;
+hour19 = "19" ;
+hour20 = "20" ;
+hour21 = "21" ;
+hour22 = "22" ;
+hour23 = "23" ;
+
+--Minutes
+minute0 = "00" ;
+minute1 = "01" ;
+minute2 = "02" ;
+minute3 = "03" ;
+minute4 = "04" ;
+minute5 = "05" ;
+minute6 = "06" ;
+minute7 = "07" ;
+minute8 = "08" ;
+minute9 = "09" ;
+minute10 = "10" ;
+minute11 = "11" ;
+minute12 = "12" ;
+minute13 = "13" ;
+minute14 = "14" ;
+minute15 = "15" ;
+minute16 = "16" ;
+minute17 = "17" ;
+minute18 = "18" ;
+minute19 = "19" ;
+minute20 = "20" ;
+minute21 = "21" ;
+minute22 = "22" ;
+minute23 = "23" ;
+minute24 = "24" ;
+minute25 = "25" ;
+minute26 = "26" ;
+minute27 = "27" ;
+minute28 = "28" ;
+minute29 = "29" ;
+minute30 = "30" ;
+
+minute31 = "31" ;
+minute32 = "32" ;
+minute33 = "33" ;
+minute34 = "34" ;
+minute35 = "35" ;
+minute36 = "36" ;
+minute37 = "37" ;
+minute38 = "38" ;
+minute39 = "39" ;
+minute40 = "40" ;
+minute41 = "41" ;
+minute42 = "42" ;
+minute43 = "43" ;
+minute44 = "44" ;
+minute45 = "45" ;
+minute46 = "46" ;
+minute47 = "47" ;
+minute48 = "48" ;
+minute49 = "49" ;
+minute50 = "50" ;
+minute51 = "51" ;
+minute52 = "52" ;
+minute53 = "53" ;
+minute54 = "54" ;
+minute55 = "55" ;
+minute56 = "56" ;
+minute57 = "57" ;
+minute58 = "58" ;
+minute59 = "59" ;
+
+lin
+--timeFormal h m = {s = app2 "time" h.s m.s } ;
+--timeInformal h m = {s = app2 "time" h.s m.s } ;
+--time h m = {s = app2 "time" h.s m.s } ;
+time h m = {s = app3 h.s m.s } ;
+}
diff --git a/grammars/video/Time/timeResSwe.gf b/grammars/video/Time/timeResSwe.gf
new file mode 100644
index 000000000..0f9ad0526
--- /dev/null
+++ b/grammars/video/Time/timeResSwe.gf
@@ -0,0 +1,7 @@
+resource timeResSwe = {
+param RefHour = ThisFormal | ThisLex | NextLex ;
+oper refs : Str -> Str -> Str -> RefHour => Str = \x,y,z -> table {ThisFormal => x ; ThisLex => y ; NextLex => z } ;
+param MinMin = Form | Past | To ;
+oper mins : Str -> Str -> Str -> MinMin => Str = \u,x,y -> table {Form => u ; Past => x ; To => y } ;
+
+}
diff --git a/grammars/video/Time/timeSwe.gf b/grammars/video/Time/timeSwe.gf
new file mode 100644
index 000000000..e9ea45e31
--- /dev/null
+++ b/grammars/video/Time/timeSwe.gf
@@ -0,0 +1,149 @@
+-- Time grammar Swedish
+
+concrete timeSwe of time = open timeResSwe in {
+
+lincat Time = {s : Str} ;
+
+--Hours
+lin
+-- Some of the time expressions is omitted because of the prolog in godis.
+-- hours after 13 and 00 are only interpreted as 13,14 etc when explicitly uttered,
+-- one o'clock is ONLY interpreted as 01:00, not 13:00.
+-- if someone needs the more elaborated forms of time use
+-- the commented lines, and comment the corresponding units.
+
+--hour0 = {s = refs (variants{["noll noll"];["noll"]}) "tolv" "ett"} ;
+hour0 = {s = refs (variants{["noll noll"];["noll"]})(variants{}) (variants{})} ;
+hour1 = {s = refs "ett" "ett" "två"} ;
+hour2 = {s = refs "två" "två" "tre"} ;
+hour3 = {s = refs "tre" "tre" "fyra"} ;
+hour4 = {s = refs "fyra" "fyra" "fem"} ;
+hour5 = {s = refs "fem" "fem" "sex"} ;
+hour6 = {s = refs "sex" "sex" "sju"} ;
+hour7 = {s = refs "sju" "sju" "åtta"} ;
+hour8 = {s = refs "åtta" "åtta" "nio"} ;
+hour9 = {s = refs "nio" "nio" "tio"} ;
+hour10 = {s = refs "tio" "tio" "elva"} ;
+hour11 = {s = refs "elva""elva" "tolv"} ;
+hour12 = {s = refs "tolv" "tolv" "ett" } ;
+
+--hour13 = {s = refs "tretton" "ett" "två" };
+--hour14 = {s = refs "fjorton" "två" "tre" };
+--hour15 = {s = refs "femton" "tre" "fyra" };
+--hour16 = {s = refs "sexton" "fyra" "fem" };
+--hour17 = {s = refs "sjutton" "fem" "sex" };
+--hour18 = {s = refs "arton" "sex" "sju" };
+--hour19 = {s = refs "nitton" "sju" "åtta" } ;
+--hour20 = {s = refs "tjugo" "åtta" "nio" } ;
+--hour21 = {s = refs ["tjugo ett"] "nio" "tio" } ;
+--hour22 = {s = refs ["tjugo två"] "tio" "elva" } ;
+--hour23 = {s = refs ["tjugo tre"] "elva" "tolv" };
+
+hour13 = {s = refs "tretton" (variants{})(variants{}) };
+hour14 = {s = refs "fjorton"(variants{})(variants{})};
+hour15 = {s = refs "femton"(variants{})(variants{})};
+hour16 = {s = refs "sexton"(variants{})(variants{})};
+hour17 = {s = refs "sjutton"(variants{})(variants{})};
+hour18 = {s = refs "arton"(variants{})(variants{})};
+hour19 = {s = refs "nitton"(variants{})(variants{})} ;
+hour20 = {s = refs "tjugo"(variants{})(variants{})} ;
+hour21 = {s = refs ["tjugo ett"](variants{})(variants{})} ;
+hour22 = {s = refs ["tjugo två"](variants{})(variants{})} ;
+hour23 = {s = refs ["tjugo tre"](variants{})(variants{})};
+
+
+--Minutes
+--0-9
+--minute0 = {s = mins (variants{["noll noll"]}) (variants{}) (variants{}) (variants{[""]})} ;
+minute0 = {s = mins ["noll noll"] (variants{[""]}) (variants{})} ;
+minute1 = {s = mins ["noll ett"] (variants {["ett över"] ; ["en minut över"]}) (variants{}) } ;
+minute2 = {s = mins ["noll två"] (variants {["två över"] ; ["två minuter över"]}) (variants{})} ;
+minute3 = {s = mins ["noll tre"] (variants { ["tre över"] ; ["tre minuter över"]}) (variants{})} ;
+minute4 = {s = mins ["noll fyra"] (variants { ["fyra över"] ; ["fyra minuter över"]}) (variants{})} ;
+minute5 = {s = mins ["noll fem"] (variants { ["fem över"] ; ["fem minuter över"]}) (variants{})} ;
+minute6 = {s = mins ["noll sex"] (variants { ["sex över"] ; ["sex minuter över"]}) (variants{})} ;
+minute7 = {s = mins ["noll sju"] (variants { ["sju över"] ; ["sju minuter över"]}) (variants{})} ;
+minute8 = {s = mins ["noll åtta"] (variants { ["åtta över"] ; ["åtta minuter över"]}) (variants{})} ;
+minute9 = {s = mins ["noll nio"] (variants { ["nio över"] ; ["nio minuter över"]}) (variants{})} ;
+
+--10-19
+minute10 = {s = mins ["tio"] (variants { ["tio över"] ; ["tio minuter över"]}) (variants{})} ;
+minute11 = {s = mins ["elva"] (variants { ["elva över"] ; ["elva minuter över"]}) (variants{})} ;
+minute12 = {s = mins ["tolv"] (variants { ["tolv över"] ; ["tolv minuter över"]}) (variants{})} ;
+minute13 = {s = mins ["tretton"] (variants { ["tretton över"] ; ["tretton minuter över"]}) (variants{})} ;
+minute14 = {s = mins ["fjorton"] (variants { ["fjorton över"] ; ["fjorton minuter över"]}) (variants{})} ;
+minute15 = {s = mins ["femton"] (variants { ["femton över"] ; ["femton minuter över"] ; ["kvart över"]}) (variants{})} ;
+minute16 = {s = mins ["sexton"] (variants { ["sexton över"] ; ["sexton minuter över"]}) (variants{})} ;
+minute17 = {s = mins ["sjutton"] (variants { ["sjutton över"] ; ["sjutton minuter över"]}) (variants{})} ;
+minute18 = {s = mins ["arton"] (variants { ["arton över"] ; ["arton minuter över"]}) (variants{})} ;
+minute19 = {s = mins ["nitton"] (variants { ["nitton över"] ; ["nitton minuter över"]}) (variants{})} ;
+
+--20-29
+minute20 = {s = mins ["tjugo"] (variants { ["tjugo över"] ; ["tjugo minuter över"]}) (variants {})} ;
+minute21 = {s = mins ["tjugo ett"] (variants { ["tjugo en över"] ;["tjugo ett över"] ; ["tjugo en minuter över"]}) (variants {}) } ;
+minute22 = {s = mins ["tjugo två"] (variants { ["tjugo två över"] ; ["tjugo två minuter över"]}) (variants {}) } ;
+minute23 = {s = mins ["tjugo tre"] (variants { ["tjugo tre över"] ; ["tjugo tre minuter över"]}) (variants {}) } ;
+minute24 = {s = mins ["tjugo fyra"] (variants { ["tjugo fyra över"] ; ["tjugo fyra minuter över"]}) (variants {["sex minuter i halv"];["sex i halv"]}) } ;
+minute25 = {s = mins ["tjugo fem"] (variants { ["tjugo fem över"] ; ["tjugo fem minuter över"]}) (variants {["fem minuter i halv"];["fem i halv"]}) } ;
+minute26 = {s = mins ["tjugo sex"] (variants { ["tjugo sex över"] ; ["tjugo sex minuter över"]}) (variants {["fyra minuter i halv"];["fyra i halv"]}) } ;
+minute27 = {s = mins ["tjugo sju"] (variants { ["tjugo sju över"] ; ["tjugo sju minuter över"]}) (variants {["tre minuter i halv"];["tre i halv"]}) } ;
+minute28 = {s = mins ["tjugo åtta"] (variants { ["tjugo åtta över"] ; ["tjugo åtta minuter över"]}) (variants {["två minuter i halv"];["två i halv"]}) } ;
+minute29 = {s = mins ["tjugo nio"] (variants { ["tjugo nio över"] ; ["tjugo nio minuter över"]}) (variants {["en minut i halv"];["en i halv"]}) } ;
+
+--30-39
+minute30 = {s = mins ["trettio"] (variants { ["trettio minuter över"]}) ["halv"] } ;
+minute31 = {s = mins ["trettio ett"] (variants { ["trettio en över"] ; ["trettio ett över"] ; ["trettio en minuter över"]}) (variants {["tjugo nio minuter i"];["tjugo nio i"];["en minut över halv"];["en över halv"]}) } ;
+minute32 = {s = mins ["trettio två"] (variants { ["trettio två över"] ; ["trettio två minuter över"]}) (variants {["tjugo åtta minuter i"];["tjugo åtta i"];["två minuter över halv"];["två över halv"]}) } ;
+minute33 = {s = mins ["trettio tre"] (variants { ["trettio tre över"] ; ["trettio tre minuter över"]}) (variants {["tjugo sju minuter i"];["tjugo sju i"];["tre minuter över halv"];["tre över halv"]}) } ;
+minute34 = {s = mins ["trettio fyra"] (variants { ["trettio fyra över"] ; ["trettio fyra minuter över"]}) (variants {["tjugosex minuter i"];["tjugosex i"];["fyra minuter över halv"];["fyra över halv"]}) } ;
+minute35 = {s = mins ["trettio fem"] (variants { ["trettio fem över"] ; ["trettio fem minuter över"]}) (variants {["tjugo fem minuter i"];["tjugo fem i"];["fem minuter över halv"]; ["fem över halv"]}) } ;
+minute36 = {s = mins ["trettio sex"] (variants { ["trettio sex över"] ; ["trettio sex minuter över"]}) (variants {["tjugo fyra minuter i"];["tjugo fyra i"];["sex minuter över halv"];["sex över halv"]}) } ;
+minute37 = {s = mins ["trettio sju"] (variants { ["trettio sju över"] ; ["trettio sju minuter över"]}) (variants {["tjugo tre minuter i"];["tjugo tre i"];["sju minuter över halv"];["sju över halv"]}) } ;
+minute38 = {s = mins ["trettio åtta"] (variants { ["trettio åtta över"] ; ["trettio åtta minuter över"]}) (variants {["tjugo två minuter i"];["tjugo två i"]}) } ;
+minute39 = {s = mins ["trettio nio"] (variants { ["trettio nio över"] ; ["trettio nio minuter över"]}) (variants {["tjugo en minuter i"];["tjugo en i"];["tjugo ett i"]}) } ;
+
+--40-49
+minute40 = {s = mins ["fyrtio"] (variants {}) (variants {["tjugo minuter i"];["tjugo i"]}) } ;
+minute41 = {s = mins ["fyrtio ett"] (variants {}) (variants {["nitton minuter i"];["nitton i"]}) } ;
+minute42 = {s = mins ["fyrtio två"] (variants {}) (variants {["arton minuter i"];["arton i"]}) } ;
+minute43 = {s = mins ["fyrtio tre"] (variants {}) (variants {["sjutton minuter i"];["sjutton i"]}) } ;
+minute44 = {s = mins ["fyrtio fyra"] (variants {}) (variants {["sexton minuter i"];["sexton i"]}) } ;
+minute45 = {s = mins (variants {["fyrtio fem"];["tre kvart"]}) (variants {}) (variants {["femton minuter i"];["femton i"];["kvart i"]}) } ;
+minute46 = {s = mins ["fyrtio sex"] (variants {}) (variants {["fjorton minuter i"];["fjorton i"]}) } ;
+minute47 = {s = mins ["fyrtio sju"] (variants {}) (variants {["tretton minuter i"];["tretton i"]}) } ;
+minute48 = {s = mins ["fyrtio åtta"] (variants {}) (variants {["tolv minuter i"];["tolv i"]}) } ;
+minute49 = {s = mins ["fyrtio nio"] (variants {}) (variants {["elva minuter i"];["elva i"]}) } ;
+
+--50-59
+minute50 = {s = mins ["femtio"] (variants {}) (variants {["tio minuter i"];["tio i"]}) } ;
+minute51 = {s = mins ["femtio ett"] (variants {}) (variants {["nio minuter i"];["nio i"]}) } ;
+minute52 = {s = mins ["femtio två"] (variants {}) (variants {["åtta minuter i"];["åtta i"]}) } ;
+minute53 = {s = mins ["femtio tre"] (variants {}) (variants {["sju minuter i"];["sju i"]}) } ;
+minute54 = {s = mins ["femtio fyra"] (variants {}) (variants {["sex minuter i"];["sex i"]}) } ;
+minute55 = {s = mins ["femtio fem"] (variants {}) (variants {["fem minuter i"];["fem i"]}) } ;
+minute56 = {s = mins ["femtio sex"] (variants {}) (variants {["fyra minuter i"];["fyra i"]}) } ;
+minute57 = {s = mins ["femtio sju"] (variants {}) (variants {["tre minuter i"];["tre i"]}) } ;
+minute58 = {s = mins ["femtio åtta"] (variants {}) (variants {["två minuter i"];["två i"]}) } ;
+minute59 = {s = mins ["femtio nio"] (variants {}) (variants {["en minut i"];["en i"];["ett i"]}) } ;
+
+lincat Hour = {s : RefHour => Str} ;
+
+lincat Minute = {s : MinMin => Str} ;
+
+-- Time expressions
+lin
+--timeDotty h m = {s = h.s ! ThisLex ++ m.s ! Dot };
+--timeInformal h m = {s = variants {
+ --m.s ! Past ++ h.s ! ThisLex ;
+ --m.s ! To ++ h.s ! NextLex
+ --}
+ --};
+--timeFormal h m = {s = h.s ! ThisFormal ++ m.s ! Form} ;
+time h m = {s = variants {
+ h.s ! ThisFormal ++ m.s ! Form ;
+ h.s ! ThisFormal ++ "och" ++ m.s ! Form ;
+ m.s ! Past ++ h.s ! ThisLex ;
+ m.s ! To ++ h.s ! NextLex
+ }
+ };
+}
diff --git a/grammars/video/User/genUser.gf b/grammars/video/User/genUser.gf
new file mode 100644
index 000000000..60afeafd6
--- /dev/null
+++ b/grammars/video/User/genUser.gf
@@ -0,0 +1,7 @@
+-- File name User/general.Abs.gf
+
+abstract genUser = general ** {
+
+fun
+request : Action -> DMove ;
+} \ No newline at end of file
diff --git a/grammars/video/User/genUserProlog.gf b/grammars/video/User/genUserProlog.gf
new file mode 100644
index 000000000..c1731a9ce
--- /dev/null
+++ b/grammars/video/User/genUserProlog.gf
@@ -0,0 +1,8 @@
+-- File name User/general.Prolog.gf
+--- the rest formarly known as User-general
+-- is now considered shared-general
+
+concrete genUserProlog of genUser = generalProlog ** open prologResource in {
+lin
+request a = {s = app "request" a.s };
+}
diff --git a/grammars/video/User/genUserSwe.gf b/grammars/video/User/genUserSwe.gf
new file mode 100644
index 000000000..d173d3711
--- /dev/null
+++ b/grammars/video/User/genUserSwe.gf
@@ -0,0 +1,8 @@
+-- File name User/general.Swe.gf
+
+concrete genUserSwe of genUser = generalSwe ** {
+
+lin
+
+request a = {s = a.s };
+}
diff --git a/grammars/video/User/general.Prolog.gf b/grammars/video/User/general.Prolog.gf
new file mode 100644
index 000000000..bb148a33e
--- /dev/null
+++ b/grammars/video/User/general.Prolog.gf
@@ -0,0 +1,6 @@
+-- File name User/general.Prolog.gf
+--- the rest formarly known as User-general
+-- is now considered shared-general
+
+lin
+request a = {s = app "request" a.s }; \ No newline at end of file
diff --git a/grammars/video/User/specUser.gf b/grammars/video/User/specUser.gf
new file mode 100644
index 000000000..00aa69a44
--- /dev/null
+++ b/grammars/video/User/specUser.gf
@@ -0,0 +1,36 @@
+-- File name User/specific.Abs.gf
+
+
+abstract specUser = specific, genUser ** {
+
+cat
+AnswerReq ;
+AnswerListReq ;
+Request ;
+
+fun
+--- Answers in request list
+vcr_add_rec_job_args4 : AnswerReq -> AnswerReq -> AnswerReq -> AnswerReq -> Action ;
+vcr_add_rec_job_args3 : AnswerReq -> AnswerReq -> AnswerReq -> Action ;
+vcr_add_rec_job_args2 : AnswerReq -> AnswerReq -> Action ;
+vcr_add_rec_job_args1 : AnswerReq -> Action ;
+---- vcr_add_rec_job_no_args : Action ; -- spela in! moved to specific
+
+fun
+--- Possible answers in request list
+startTimeToStoreReq : StartTime -> AnswerReq ;
+endTimeToStoreReq : EndTime -> AnswerReq ;
+channelToStoreReq : ChToStore -> AnswerReq ;
+weekdayToStoreReq : WdToStore -> AnswerReq ;
+
+--- AnswerList
+answerListReq4 : AnswerReq -> AnswerReq -> AnswerReq -> AnswerReq -> AnswerListReq ;
+answerListReq3 : AnswerReq -> AnswerReq -> AnswerReq -> AnswerListReq ;
+answerListReq2 : AnswerReq -> AnswerReq -> AnswerListReq ;
+answerListReq : AnswerListReq -> DMove;
+
+answerReq : AnswerReq -> Answer ;
+
+--requestChannelsDMove : Request -> DMove;
+requestChannels : Action ;
+}
diff --git a/grammars/video/User/specUserProlog.gf b/grammars/video/User/specUserProlog.gf
new file mode 100644
index 000000000..f586951ce
--- /dev/null
+++ b/grammars/video/User/specUserProlog.gf
@@ -0,0 +1,68 @@
+-- File name User/specific.Prolog.gf
+
+concrete specUserProlog of specUser = genUserProlog, specificProlog **
+ open prologResource in {
+
+
+
+--- Answers in request list
+lin
+vcr_add_rec_job_args4 chst wdts stts etts =
+ {s =
+ "add_rec_job" ++ "," ++
+ app "answer" chst.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ app "answer" stts.s ++ "," ++
+ "answer" ++ "(" ++ etts.s } ;
+
+vcr_add_rec_job_args3 chst wdts stts =
+ {s =
+ "add_rec_job" ++ "," ++
+ app "answer" chst.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ "answer" ++ "(" ++ stts.s} ;
+
+vcr_add_rec_job_args2 chst wdts = {s =
+ "add_rec_job" ++ "," ++
+ app "answer" chst.s ++ "," ++
+ "answer" ++ "(" ++ wdts.s } ;
+
+vcr_add_rec_job_args1 chst = {s =
+ "add_rec_job" ++ "," ++
+ "answer" ++ "(" ++ chst.s } ;
+
+---- vcr_add_rec_job_no_args = {s = "add_rec_job"} ; -- moved to specific
+
+
+
+--- Possible answers in request list
+startTimeToStoreReq v = {s= v.s} ;
+endTimeToStoreReq v = {s= v.s} ;
+channelToStoreReq v = {s= v.s} ;
+weekdayToStoreReq v = {s= v.s} ;
+
+--- AnswerList
+answerListReq4 chts wdts stts etts =
+ { s =
+ app "answer" chts.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ app "answer" stts.s ++ "," ++
+ app "answer" etts.s } ;
+
+answerListReq3 chts wdts stts =
+ { s =
+ app "answer" chts.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ app "answer" stts.s} ;
+
+answerListReq2 chts wdts =
+ { s =
+ app "answer" chts.s ++ "," ++
+ app "answer" wdts.s } ;
+
+answerListReq aL = {s = aL.s} ;
+
+answerReq v = {s= v.s} ;
+
+requestChannels = {s = ["list_channels"]} ;
+}
diff --git a/grammars/video/User/specUserSwe.gf b/grammars/video/User/specUserSwe.gf
new file mode 100644
index 000000000..cc3018c0a
--- /dev/null
+++ b/grammars/video/User/specUserSwe.gf
@@ -0,0 +1,35 @@
+--# -path=.:..:../Shared:../Weekday:../Time:../Channel
+
+-- File name User/specific.Swe.gf
+
+concrete specUserSwe of specUser = specificSwe, genUserSwe ** {
+
+lin
+--- Answers in request list
+vcr_add_rec_job_args4 chts wdts stts etts = {s =
+ ["spela in"] ++ stts.s ++ "," ++ etts.s ++ "," ++ wdts.s ++ "," ++ chts.s };
+vcr_add_rec_job_args3 chts wdts stts = {s =
+ ["spela in"] ++ chts.s ++ "," ++ wdts.s ++ "," ++ stts.s };
+vcr_add_rec_job_args2 chts wdts = {s =
+ ["spela in"] ++ chts.s ++ "," ++ wdts.s };
+vcr_add_rec_job_args1 chts = {s = ["spela in"] ++ chts.s } ;
+---- vcr_add_rec_job_no_args = {s = ["spela in"]} ;
+
+lin
+
+--- Possible answers in request list
+startTimeToStoreReq v = {s= v.s} ;
+endTimeToStoreReq v = {s= v.s} ;
+channelToStoreReq v = {s= v.s} ;
+weekdayToStoreReq v = {s= v.s} ;
+
+--- AnswerList
+answerListReq4 chts wdts stts etts = {s = stts.s ++ "," ++ etts.s ++ "," ++ wdts.s ++ "," ++ chts.s };
+answerListReq3 chts wdts stts = {s = chts.s ++ "," ++ wdts.s ++ "," ++ stts.s };
+answerListReq2 chts wdts = {s = chts.s ++ "," ++ wdts.s };
+answerListReq aL = {s = aL.s} ;
+
+answerReq v = {s= v.s} ;
+
+requestChannels = {s= (variants{["lista alla kanaler"];["vilka kanaler finns det"]})};
+}
diff --git a/grammars/video/User/specific.Prolog.gf b/grammars/video/User/specific.Prolog.gf
new file mode 100644
index 000000000..fb3dd07a8
--- /dev/null
+++ b/grammars/video/User/specific.Prolog.gf
@@ -0,0 +1,68 @@
+-- File name User/specific.Prolog.gf
+
+include
+ specific.Abs.gf ;
+ general.Prolog.gf ;
+
+
+
+--- Answers in request list
+lin
+vcr_add_rec_job_args4 chst wdts stts etts =
+ {s =
+ "add_rec_job" ++ "," ++
+ app "answer" chst.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ app "answer" stts.s ++ "," ++
+ "answer" ++ "(" ++ etts.s } ;
+
+vcr_add_rec_job_args3 chst wdts stts =
+ {s =
+ "add_rec_job" ++ "," ++
+ app "answer" chst.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ "answer" ++ "(" ++ stts.s} ;
+
+vcr_add_rec_job_args2 chst wdts = {s =
+ "add_rec_job" ++ "," ++
+ app "answer" chst.s ++ "," ++
+ "answer" ++ "(" ++ wdts.s } ;
+
+vcr_add_rec_job_args1 chst = {s =
+ "add_rec_job" ++ "," ++
+ "answer" ++ "(" ++ chst.s } ;
+
+vcr_add_rec_job_no_args = {s = "add_rec_job"} ;
+
+
+
+--- Possible answers in request list
+startTimeToStoreReq v = {s= v.s} ;
+endTimeToStoreReq v = {s= v.s} ;
+channelToStoreReq v = {s= v.s} ;
+weekdayToStoreReq v = {s= v.s} ;
+
+--- AnswerList
+answerListReq4 chts wdts stts etts =
+ { s =
+ app "answer" chts.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ app "answer" stts.s ++ "," ++
+ app "answer" etts.s } ;
+
+answerListReq3 chts wdts stts =
+ { s =
+ app "answer" chts.s ++ "," ++
+ app "answer" wdts.s ++ "," ++
+ app "answer" stts.s} ;
+
+answerListReq2 chts wdts =
+ { s =
+ app "answer" chts.s ++ "," ++
+ app "answer" wdts.s } ;
+
+answerListReq aL = {s = aL.s} ;
+
+answerReq v = {s= v.s} ;
+
+requestChannels = {s = ["list_channels"]} ;
diff --git a/grammars/video/Weekday/weekday.Eng.gf b/grammars/video/Weekday/weekday.Eng.gf
new file mode 100644
index 000000000..773f41380
--- /dev/null
+++ b/grammars/video/Weekday/weekday.Eng.gf
@@ -0,0 +1,12 @@
+---File name weekday.Eng.gf
+
+include weekday.Abs.gf ;
+
+pattern
+monday = "monday" ;
+tuesday = "tuesday" ;
+wednesday = "wednesday" ;
+thursday = "thursday" ;
+friday = "friday" ;
+saturday = "saturday" ;
+sunday = "sunday" ; \ No newline at end of file
diff --git a/grammars/video/Weekday/weekday.Prolog.gf b/grammars/video/Weekday/weekday.Prolog.gf
new file mode 100644
index 000000000..29018f420
--- /dev/null
+++ b/grammars/video/Weekday/weekday.Prolog.gf
@@ -0,0 +1,13 @@
+---File name weekday.Swe.gf
+
+include weekday.Abs.gf ;
+
+pattern
+--today = "today" ;
+monday = "monday" ;
+tuesday = "tuesday" ;
+wednesday = "wednesday" ;
+thursday = "thursday" ;
+friday = "friday" ;
+saturday = "saturday" ;
+sunday = "sunday" ; \ No newline at end of file
diff --git a/grammars/video/Weekday/weekday.gf b/grammars/video/Weekday/weekday.gf
new file mode 100644
index 000000000..1c37968e1
--- /dev/null
+++ b/grammars/video/Weekday/weekday.gf
@@ -0,0 +1,15 @@
+abstract weekday = {
+
+cat
+Weekday ;
+
+fun
+--today : Weekday ;
+monday : Weekday ;
+tuesday : Weekday ;
+wednesday : Weekday ;
+thursday : Weekday ;
+friday : Weekday ;
+saturday : Weekday ;
+sunday : Weekday ;
+} \ No newline at end of file
diff --git a/grammars/video/Weekday/weekdayProlog.gf b/grammars/video/Weekday/weekdayProlog.gf
new file mode 100644
index 000000000..ae824fce5
--- /dev/null
+++ b/grammars/video/Weekday/weekdayProlog.gf
@@ -0,0 +1,14 @@
+---File name weekday.Swe.gf
+
+concrete weekdayProlog of weekday = {
+
+pattern
+--today = "today" ;
+monday = "monday" ;
+tuesday = "tuesday" ;
+wednesday = "wednesday" ;
+thursday = "thursday" ;
+friday = "friday" ;
+saturday = "saturday" ;
+sunday = "sunday" ;
+}
diff --git a/grammars/video/Weekday/weekdaySwe.gf b/grammars/video/Weekday/weekdaySwe.gf
new file mode 100644
index 000000000..38afb73fb
--- /dev/null
+++ b/grammars/video/Weekday/weekdaySwe.gf
@@ -0,0 +1,12 @@
+concrete weekdaySwe of weekday = {
+
+pattern
+--today = "idag" ;
+monday = "måndag" ;
+tuesday = "tisdag" ;
+wednesday = "onsdag" ;
+thursday = "torsdag" ;
+friday = "fredag" ;
+saturday = "lördag" ;
+sunday = "söndag" ;
+}
diff --git a/grammars/video/all.gf b/grammars/video/all.gf
new file mode 100644
index 000000000..9fd96be95
--- /dev/null
+++ b/grammars/video/all.gf
@@ -0,0 +1,13 @@
+-- wrapper module containing both User's and System's grammars. AR 16/9/2004
+
+abstract all = specUser,specSystem ** {
+
+-- Suggestion: use different categories for system's and user's moves
+-- and bring them together only here; now both use DMove
+
+-- cat Move ;
+-- fun userMove : UMove -> Move ;
+-- fun systemMove : SMove -> Move ;
+
+} ;
+
diff --git a/grammars/video/allProlog.gf b/grammars/video/allProlog.gf
new file mode 100644
index 000000000..639106454
--- /dev/null
+++ b/grammars/video/allProlog.gf
@@ -0,0 +1,5 @@
+--# -path=.:Shared:Weekday:Time:Channel:User:System
+
+concrete allProlog of all = specUserProlog, specSystemProlog ** {
+
+}
diff --git a/grammars/video/allSwe.gf b/grammars/video/allSwe.gf
new file mode 100644
index 000000000..00098a1ff
--- /dev/null
+++ b/grammars/video/allSwe.gf
@@ -0,0 +1,9 @@
+--# -path=.:Shared:Weekday:Time:Channel:User:System
+
+concrete allSwe of all = specUserSwe, specSystemSwe ** {
+
+-- lincat Move = {s : Str} ;
+-- lin userMove m = {s = "Användaren:" ++ m.s} ;
+-- lin systemMove m = {s = "Systemet:" ++ m.s} ;
+
+}
diff --git a/grammars/video/icm100ResSwe.gf b/grammars/video/icm100ResSwe.gf
new file mode 100644
index 000000000..e43e26bf8
--- /dev/null
+++ b/grammars/video/icm100ResSwe.gf
@@ -0,0 +1,30 @@
+resource icm100ResSwe = {
+
+ param RefPol = Pos | Neg | Inter ;
+ param RefLev = Per | Sem | Und | Acc ;
+
+ oper ex1 : RefPol => RefLev => Str = table {
+ Pos => table {
+ Per => ["jag hörde"];
+ Sem => [""];
+ Und => [""];
+ Acc => ["okej"]
+ };
+
+ Neg => table {
+ Per => ["ursäkta jag hörde inte alls vad du sa"];
+ Sem => ["jag förstår inte vad du menar"];
+ Und => ["jag förstår inte riktigt vad du menar"];
+ Acc => ["tyvärr kan inte hantera"]
+ };
+
+ Inter => table {
+ Per => (variants{});
+ Sem => (variants{});
+-- Und => ["stämmer det"]; --hack!
+ Und => (variants{});
+ Acc => (variants{})
+ }
+ };
+
+} \ No newline at end of file
diff --git a/grammars/video/systemSwe.gf b/grammars/video/systemSwe.gf
new file mode 100644
index 000000000..dcf3e084e
--- /dev/null
+++ b/grammars/video/systemSwe.gf
@@ -0,0 +1,4 @@
+include Shared/specific.Swe.gf ;
+ Shared/general.Swe.gf ;
+ System/specific.Swe.gf ;
+ System/general.Swe.gf ; \ No newline at end of file
diff --git a/src/GF/Compile/Compile.hs b/src/GF/Compile/Compile.hs
index 8057904a8..b320a46f1 100644
--- a/src/GF/Compile/Compile.hs
+++ b/src/GF/Compile/Compile.hs
@@ -266,10 +266,11 @@ generateModuleCode opts path minfo@(name,info) = do
code <- return $ MkGFC.prCanonModInfo minfo'
return (gfcFile pname, code)
if isCompilable info && emit && nomulti
- then ioeIO $ writeFile file out >> putStr (" wrote file" +++ file)
- else ioeIO $ putStrFlush $ "no need to save module" +++ prt name
+ then ioeIO (writeFile file out) >> ioeIOIf (putStr (" wrote file" +++ file))
+ else ioeIOIf $ putStrFlush $ "no need to save module" +++ prt name
return minfo'
where
+ ioeIOIf = if oElem beSilent opts then (const (return ())) else ioeIO
emitsGFR m = isModRes m && isCompilable info
---- isModRes m || (isModCnc m && mstatus m == MSIncomplete)
isCompilable mi = case mi of
diff --git a/src/Makefile b/src/Makefile
index ce5873e52..cb7593c55 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,8 +4,7 @@ include config.mk
GHMAKE=$(GHC) --make
GHCXMAKE=ghcxmake
GHCFLAGS=-package lang -package util -fglasgow-exts $(CPPFLAGS) $(LDFLAGS)
-GHCOPTFLAGS=$(GHCFLAGS)
-##GHCOPTFLAGS=-O $(GHCFLAGS)
+GHCOPTFLAGS=-O $(GHCFLAGS)
GHCFUDFLAG=
JAVAFLAGS=-target 1.4 -source 1.4
@@ -29,6 +28,8 @@ BIN_DIST_DIR=$(DIST_DIR)-$(host)
all: unix
+temp: today noopt
+
unix: today nofud-links opt
windows: today nofud-links justwindows
@@ -41,6 +42,10 @@ opt:
$(GHMAKE) $(GHCOPTFLAGS) $(GHCINCLUDENOFUD) GF.hs -o gf
strip gf
mv gf ../bin/
+noopt:
+ $(GHMAKE) $(GHCFLAGS) $(GHCINCLUDENOFUD) GF.hs -o gf
+ strip gf
+ mv gf ../bin/
ghc: nofud