mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 13:09:33 -06:00
Compare commits
1066 Commits
remove-exa
...
majestic-m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac93f2dd10 | ||
|
|
a2d843f8ed | ||
|
|
61e95bcfeb | ||
|
|
c9b668a583 | ||
|
|
8cd0bb5ec1 | ||
|
|
a5fb51ff3d | ||
|
|
26069e7ffe | ||
|
|
d218c286eb | ||
|
|
900a0985a8 | ||
|
|
6b93c6fde4 | ||
|
|
60a578bd6f | ||
|
|
04dd99c56c | ||
|
|
d304e57b6e | ||
|
|
5bf0c9b7ad | ||
|
|
a044adfc8b | ||
|
|
695025d1a2 | ||
|
|
57b9080234 | ||
|
|
30e3e6ba52 | ||
|
|
2d3c390e7d | ||
|
|
9b591129ed | ||
|
|
8e03b63237 | ||
|
|
86246c6fb8 | ||
|
|
5ee960ed7c | ||
|
|
45ee985fda | ||
|
|
27f0ff14a3 | ||
|
|
a909a85537 | ||
|
|
c3eb6973f4 | ||
|
|
fc57f94e8a | ||
|
|
2686e63e58 | ||
|
|
6497a3dd95 | ||
|
|
3bdfe1a336 | ||
|
|
2a5434df96 | ||
|
|
a2e7d20b7a | ||
|
|
ead1160a75 | ||
|
|
f9c6e94672 | ||
|
|
8c721e063c | ||
|
|
1401a6d209 | ||
|
|
5e65db2e17 | ||
|
|
0977e9073f | ||
|
|
8d075b1d57 | ||
|
|
95c81ec2b7 | ||
|
|
62d5ed5b42 | ||
|
|
0e011955be | ||
|
|
71536e8e37 | ||
|
|
a27cf6a17b | ||
|
|
15e3ca9acd | ||
|
|
6a9254816d | ||
|
|
98f42051b1 | ||
|
|
dae39d8b10 | ||
|
|
0d43ec8971 | ||
|
|
16ee006735 | ||
|
|
db0cbf60cb | ||
|
|
db66144c25 | ||
|
|
e33d881ce8 | ||
|
|
fd6cd382c5 | ||
|
|
d9db0ef4a7 | ||
|
|
2a2d7269cf | ||
|
|
dc59d9f3f9 | ||
|
|
3c4e7dd20c | ||
|
|
1b3a197aac | ||
|
|
b7e7319542 | ||
|
|
869c5d094b | ||
|
|
93c2f47752 | ||
|
|
51954c60ea | ||
|
|
3c5741c846 | ||
|
|
94884ed59e | ||
|
|
6d898fc325 | ||
|
|
c1adbedc25 | ||
|
|
557cdb82a7 | ||
|
|
26be741dea | ||
|
|
ca2f2bfd89 | ||
|
|
634508eaa8 | ||
|
|
1f72ef77c4 | ||
|
|
7551926383 | ||
|
|
45db11b669 | ||
|
|
314db3ea7f | ||
|
|
e6960e30f6 | ||
|
|
c21627950a | ||
|
|
0708f6e0cc | ||
|
|
ad0832903a | ||
|
|
0fa739e6e3 | ||
|
|
0229329d7c | ||
|
|
6efb878c43 | ||
|
|
edd7081dea | ||
|
|
2137324f81 | ||
|
|
86326d282f | ||
|
|
fee186feca | ||
|
|
808e8db141 | ||
|
|
16eb5f1a89 | ||
|
|
28dd0eda22 | ||
|
|
0771906206 | ||
|
|
fcad8dd3e2 | ||
|
|
67f83ebf8a | ||
|
|
388829d63d | ||
|
|
9863f32d05 | ||
|
|
5334174923 | ||
|
|
2b725861fb | ||
|
|
8c3f9c8d73 | ||
|
|
7dafeee57b | ||
|
|
19251e5e61 | ||
|
|
af45e96108 | ||
|
|
38de1bf924 | ||
|
|
a7a20d72e7 | ||
|
|
455fd07e12 | ||
|
|
6d234a7d7e | ||
|
|
02d180ad88 | ||
|
|
8c04eed5c3 | ||
|
|
6c2d180544 | ||
|
|
d1e6b78a45 | ||
|
|
6ce619c146 | ||
|
|
2deae9d402 | ||
|
|
187ded6d3d | ||
|
|
6f94957857 | ||
|
|
561862e1bd | ||
|
|
07c3f4b88a | ||
|
|
4dcf43dbf3 | ||
|
|
97ca7b112c | ||
|
|
fbd0be2c3e | ||
|
|
b12e8a6969 | ||
|
|
809a02f3bc | ||
|
|
3716990b8d | ||
|
|
729a3102b4 | ||
|
|
28bb236248 | ||
|
|
1fce5144f8 | ||
|
|
4a0efda0e6 | ||
|
|
f82f19ba68 | ||
|
|
f83ea160da | ||
|
|
466fd4a7da | ||
|
|
c5b6432016 | ||
|
|
a46b91fe10 | ||
|
|
a2e4e74644 | ||
|
|
ad9fbdef6f | ||
|
|
eba37f5b09 | ||
|
|
d294033822 | ||
|
|
886592f345 | ||
|
|
ac304ccd7c | ||
|
|
dea2176115 | ||
|
|
3dc2af61a6 | ||
|
|
4719e509a5 | ||
|
|
d17ca06faf | ||
|
|
a9a8ed8bf3 | ||
|
|
fc12749124 | ||
|
|
2c01eab355 | ||
|
|
d72017409a | ||
|
|
90b7134eef | ||
|
|
d0ce218ae1 | ||
|
|
917c223db7 | ||
|
|
bd629452ac | ||
|
|
bdd84f10f9 | ||
|
|
139e851f22 | ||
|
|
0ff4b0079d | ||
|
|
00d5b238a3 | ||
|
|
c843cec096 | ||
|
|
3ee0d54878 | ||
|
|
5e46c27d86 | ||
|
|
2a3d5cc617 | ||
|
|
001e727c29 | ||
|
|
cb6d3c4a2d | ||
|
|
cfc1e15fcf | ||
|
|
bebd56438b | ||
|
|
a2102b43bd | ||
|
|
c4f739c754 | ||
|
|
18e54abf12 | ||
|
|
4611d831ff | ||
|
|
21ee96da9b | ||
|
|
b1fd1f1a5e | ||
|
|
bcbf9efa5f | ||
|
|
2d74fc4d64 | ||
|
|
e4b2f281d9 | ||
|
|
063c517f3c | ||
|
|
dd65f9f365 | ||
|
|
e11e775a96 | ||
|
|
74c63b196f | ||
|
|
58b8c2771e | ||
|
|
be43b0ba35 | ||
|
|
1d1d1aad81 | ||
|
|
04fcaaaac2 | ||
|
|
70566fc6d6 | ||
|
|
432bc26b23 | ||
|
|
60c9ab4c53 | ||
|
|
4af807c982 | ||
|
|
b4b8572af3 | ||
|
|
71dac482c8 | ||
|
|
6edf7e6405 | ||
|
|
7dba3465d0 | ||
|
|
e41feae82a | ||
|
|
44b5d0f870 | ||
|
|
6359537894 | ||
|
|
348c348e14 | ||
|
|
b583faa042 | ||
|
|
2e30c7f6cb | ||
|
|
a3203143ba | ||
|
|
ddb01b41be | ||
|
|
3f31d86d0d | ||
|
|
a8bda009a4 | ||
|
|
b393efff59 | ||
|
|
f456f09054 | ||
|
|
24a30b344e | ||
|
|
89e99d829c | ||
|
|
56d47ad561 | ||
|
|
c4fee30baf | ||
|
|
b408650125 | ||
|
|
fc268a16df | ||
|
|
a79fff548d | ||
|
|
3d0450cb2a | ||
|
|
e00be98ac6 | ||
|
|
238f01c9fc | ||
|
|
c6d6914688 | ||
|
|
9fe6ee3cce | ||
|
|
a7bf47cb87 | ||
|
|
3675e5cfc6 | ||
|
|
e82fb7f32f | ||
|
|
fd61a6c0d3 | ||
|
|
6ebb8e5fda | ||
|
|
05813384e0 | ||
|
|
22f62be511 | ||
|
|
be5751060a | ||
|
|
9e3d329528 | ||
|
|
a715d029f7 | ||
|
|
e78e9102be | ||
|
|
cf7673525f | ||
|
|
c5ce2fd4b7 | ||
|
|
d8a7aef46b | ||
|
|
7e747fbd17 | ||
|
|
3d25efd38a | ||
|
|
c83a31708d | ||
|
|
919fd5d83e | ||
|
|
5f5bd7a83b | ||
|
|
cb6d385fc0 | ||
|
|
6cb4bef521 | ||
|
|
f1e1564228 | ||
|
|
a7f00a4e84 | ||
|
|
375452063f | ||
|
|
08923a57b9 | ||
|
|
6cfa250b28 | ||
|
|
4e443374de | ||
|
|
ae0a6aa6b6 | ||
|
|
7f0eb34864 | ||
|
|
1b09e7293f | ||
|
|
678d244b21 | ||
|
|
2f51c8471c | ||
|
|
4739e3d779 | ||
|
|
8bc171d7a1 | ||
|
|
7c622d2621 | ||
|
|
2f9c784fed | ||
|
|
f7aad0c0e0 | ||
|
|
5eade6f111 | ||
|
|
a44787fc4e | ||
|
|
97c76a9030 | ||
|
|
28321cc023 | ||
|
|
175349175a | ||
|
|
1d0c4e7c39 | ||
|
|
0dae265b05 | ||
|
|
36ccb7ac8f | ||
|
|
6e4681d46b | ||
|
|
3d4c6031d8 | ||
|
|
9739344ca6 | ||
|
|
3b1907cd8c | ||
|
|
44ee5718e9 | ||
|
|
9d63c8a903 | ||
|
|
bcc33af36b | ||
|
|
c9b7f8e5ee | ||
|
|
2e846cdf59 | ||
|
|
f741bd9332 | ||
|
|
a843ddba55 | ||
|
|
8936e6211e | ||
|
|
31396e46e3 | ||
|
|
e1c23da0a6 | ||
|
|
2444302482 | ||
|
|
4ea4450481 | ||
|
|
e6d8b76dbf | ||
|
|
5b96ede199 | ||
|
|
1ec4949d90 | ||
|
|
29557ae61e | ||
|
|
691d3389f7 | ||
|
|
9cea2cc70e | ||
|
|
b7cddf206b | ||
|
|
d58c744361 | ||
|
|
a8efc61579 | ||
|
|
9a2d2b345d | ||
|
|
55d30d70f5 | ||
|
|
b4838649f5 | ||
|
|
2e0c93c594 | ||
|
|
4c5aad5883 | ||
|
|
fb2454767a | ||
|
|
4655c2663a | ||
|
|
7f7fe59fc0 | ||
|
|
d53b7587f5 | ||
|
|
3ecb937753 | ||
|
|
2daf9e2e19 | ||
|
|
e03df47911 | ||
|
|
6c06a9f295 | ||
|
|
3c8e96c3cd | ||
|
|
7b9f5144f9 | ||
|
|
6b359a6362 | ||
|
|
4a0b1f2f67 | ||
|
|
b1dd94e4b0 | ||
|
|
8061a9e82a | ||
|
|
901c3f9086 | ||
|
|
32f6691024 | ||
|
|
5f5b0caba5 | ||
|
|
0bf7522291 | ||
|
|
a7321a2e5a | ||
|
|
e0288f46dc | ||
|
|
02dc4e83c5 | ||
|
|
aecaa422ec | ||
|
|
b7bd5a4561 | ||
|
|
50e54d131b | ||
|
|
ff30169cbf | ||
|
|
3e4f2ba1a0 | ||
|
|
239fd02249 | ||
|
|
ad4600b5c4 | ||
|
|
5c5e26cc8d | ||
|
|
f25b518186 | ||
|
|
e9ec4cef67 | ||
|
|
3e7d80bf30 | ||
|
|
41ef5f9539 | ||
|
|
5271ddd10b | ||
|
|
8195f8b0cb | ||
|
|
684f85ff94 | ||
|
|
a00a7f4ba5 | ||
|
|
5982dbc146 | ||
|
|
9b2813f48a | ||
|
|
b28e891a6b | ||
|
|
59e54482a3 | ||
|
|
69f74944e2 | ||
|
|
0d9f2994a0 | ||
|
|
275addfcbe | ||
|
|
03f02ae5d2 | ||
|
|
fdaf19a5d4 | ||
|
|
91adc09b1f | ||
|
|
beab2ad899 | ||
|
|
bedb46527d | ||
|
|
0258a87257 | ||
|
|
ef0e831c9e | ||
|
|
8ec13b1030 | ||
|
|
07bda06fb2 | ||
|
|
d28c5a0377 | ||
|
|
8b8028bdfe | ||
|
|
9db352b2bb | ||
|
|
b627d4ceb0 | ||
|
|
0296f07651 | ||
|
|
6beac74265 | ||
|
|
221f0b7853 | ||
|
|
4fd70bc445 | ||
|
|
9e5823c350 | ||
|
|
2346abeedb | ||
|
|
3e7926f22d | ||
|
|
f35dff7c66 | ||
|
|
1749908f6c | ||
|
|
d8e1e2c37d | ||
|
|
8877243701 | ||
|
|
08bcd2f0b5 | ||
|
|
1bc0cfd025 | ||
|
|
21044264fa | ||
|
|
058526ec5d | ||
|
|
974e8b0835 | ||
|
|
bbe4682c3d | ||
|
|
2a8d4232ce | ||
|
|
352dedc26f | ||
|
|
7e35db47a6 | ||
|
|
edba4fda32 | ||
|
|
a8403d48fa | ||
|
|
3578355bd0 | ||
|
|
39f38ed0e2 | ||
|
|
01db0224be | ||
|
|
16dfcb938c | ||
|
|
0ece508716 | ||
|
|
72993a178a | ||
|
|
f2da618e5d | ||
|
|
c97b736a5b | ||
|
|
82ce76a2ce | ||
|
|
d2aec60612 | ||
|
|
ddfc599db3 | ||
|
|
cb30e176bd | ||
|
|
e477ce4b1f | ||
|
|
7a63ba34b4 | ||
|
|
c482d3466c | ||
|
|
4abe7836e0 | ||
|
|
2c1700776e | ||
|
|
a5008c2fe1 | ||
|
|
723bec1ba0 | ||
|
|
7b5669a333 | ||
|
|
91f183ca6a | ||
|
|
0187be04ff | ||
|
|
f70e1b8772 | ||
|
|
8d1cc22622 | ||
|
|
e7bd7d00b3 | ||
|
|
f3e579bbb1 | ||
|
|
11b630adc1 | ||
|
|
1088b4ef38 | ||
|
|
db8843c8bf | ||
|
|
bfd839b7b0 | ||
|
|
78d6282da2 | ||
|
|
cc8db24a46 | ||
|
|
72c51f4bf9 | ||
|
|
3a7743afad | ||
|
|
825e8447db | ||
|
|
2d6bcd1953 | ||
|
|
dc1644563f | ||
|
|
87f1e24384 | ||
|
|
36e87668e0 | ||
|
|
2d3aac5aa1 | ||
|
|
217e0d8cc6 | ||
|
|
75e19bbffa | ||
|
|
cc4a215f83 | ||
|
|
7d85d3ca9a | ||
|
|
e298410e57 | ||
|
|
5e320943c9 | ||
|
|
54421492b2 | ||
|
|
84789c9fbf | ||
|
|
17629e4821 | ||
|
|
a8b3537184 | ||
|
|
db1871cf55 | ||
|
|
4c6872615c | ||
|
|
8f0a1b8fee | ||
|
|
155657709a | ||
|
|
265f08d6ee | ||
|
|
e47042424e | ||
|
|
ecf309a28e | ||
|
|
d0a881f903 | ||
|
|
810640822d | ||
|
|
ed79955931 | ||
|
|
1867bfc8a1 | ||
|
|
6ef4f27d32 | ||
|
|
3ab07ec58f | ||
|
|
b8324fe3e6 | ||
|
|
8814fde817 | ||
|
|
375b3cf285 | ||
|
|
3c4f42db15 | ||
|
|
0474a37af6 | ||
|
|
e3498d5ead | ||
|
|
4c5927c98c | ||
|
|
bb51224e8e | ||
|
|
9533edc3ca | ||
|
|
4df8999ed5 | ||
|
|
7fdbf3f400 | ||
|
|
0d6c67f6b1 | ||
|
|
2610219f6a | ||
|
|
7674f078d6 | ||
|
|
c67fe05c08 | ||
|
|
7b9bb780a2 | ||
|
|
4f256447e2 | ||
|
|
dfa5b9276d | ||
|
|
667bfd30bd | ||
|
|
66ae31e99e | ||
|
|
a677f0373c | ||
|
|
13f845d127 | ||
|
|
aa530233fb | ||
|
|
45bc5595c0 | ||
|
|
6d12754e4f | ||
|
|
a09d9bd006 | ||
|
|
fffe3161d4 | ||
|
|
743f5e55d4 | ||
|
|
9e209bbaba | ||
|
|
a1594e6a69 | ||
|
|
06e0a986d1 | ||
|
|
6f2a4bcd2c | ||
|
|
f345f615f4 | ||
|
|
80d16fcf94 | ||
|
|
7faf8c9dad | ||
|
|
c2ffa6763b | ||
|
|
b3881570c7 | ||
|
|
bd270b05ff | ||
|
|
a1fd3ea142 | ||
|
|
cdbe73eb47 | ||
|
|
6077d5dd5b | ||
|
|
0954b4cbab | ||
|
|
f2e52d6f2c | ||
|
|
a2b23d5897 | ||
|
|
0886eb520d | ||
|
|
ef42216415 | ||
|
|
0c3ca3d79a | ||
|
|
e2e5033075 | ||
|
|
84b4b6fab9 | ||
|
|
5e052ff499 | ||
|
|
d2fb755fab | ||
|
|
1b66bf2773 | ||
|
|
1e3de38ac4 | ||
|
|
4e8859aa75 | ||
|
|
dff215504a | ||
|
|
173ab96839 | ||
|
|
dff1193f7b | ||
|
|
e1a40640cd | ||
|
|
be231584f6 | ||
|
|
12c564f97c | ||
|
|
09d772046e | ||
|
|
d53e1713c7 | ||
|
|
3df04295d9 | ||
|
|
b090e9b0ff | ||
|
|
5d7c687cb7 | ||
|
|
376b1234a2 | ||
|
|
71d99b9ecb | ||
|
|
a27b07542d | ||
|
|
78b73fba20 | ||
|
|
e5a2aed5b6 | ||
|
|
13575b093f | ||
|
|
32be75ca7d | ||
|
|
587004f985 | ||
|
|
4436cb101e | ||
|
|
0f5be0bbaa | ||
|
|
d5c6aec3ec | ||
|
|
0a70eca6e2 | ||
|
|
6efbd23c5c | ||
|
|
3a27fa0d39 | ||
|
|
1ba5449d21 | ||
|
|
cf9afa8f74 | ||
|
|
91d2ecf23c | ||
|
|
8206143328 | ||
|
|
5564a2f244 | ||
|
|
cf2eff3801 | ||
|
|
5a53a38247 | ||
|
|
02671cafd0 | ||
|
|
0a18688788 | ||
|
|
889be1ab8e | ||
|
|
65522a63c3 | ||
|
|
7065125e19 | ||
|
|
2c37e7dfad | ||
|
|
f505d88a8e | ||
|
|
b1ed63b089 | ||
|
|
f23031ea1d | ||
|
|
c3153134b7 | ||
|
|
fd4fb62b9e | ||
|
|
53c3afbd6f | ||
|
|
544b39a8a5 | ||
|
|
6179d79e72 | ||
|
|
ecb19013c0 | ||
|
|
c416571406 | ||
|
|
a1372040b4 | ||
|
|
67fcf21577 | ||
|
|
a7ab610f95 | ||
|
|
e5b8fa095b | ||
|
|
6beebbac2b | ||
|
|
95917a7715 | ||
|
|
de8b23c014 | ||
|
|
098541dda2 | ||
|
|
af87664d27 | ||
|
|
af1360d37e | ||
|
|
eeda03e9b0 | ||
|
|
7042768054 | ||
|
|
84fd431afd | ||
|
|
588cd6ddb1 | ||
|
|
437bd8e7f9 | ||
|
|
e56d1b2959 | ||
|
|
450368f9bb | ||
|
|
07fd41294a | ||
|
|
4729d22c36 | ||
|
|
60bc752a6f | ||
|
|
91278e2b4b | ||
|
|
9b4f2dd18b | ||
|
|
9dda5dfa8a | ||
|
|
2fd94f5f57 | ||
|
|
ba3e09cc38 | ||
|
|
8fbfc0b4a9 | ||
|
|
f9b8653ab2 | ||
|
|
173fca7f12 | ||
|
|
c6ff3e0c5e | ||
|
|
8a85dbc66f | ||
|
|
655173932e | ||
|
|
04f6f113f0 | ||
|
|
bac619f025 | ||
|
|
1a466c14c8 | ||
|
|
d77921005a | ||
|
|
2b6b315bd7 | ||
|
|
7f6bfa730b | ||
|
|
d6be4ec3b0 | ||
|
|
68ec61f44d | ||
|
|
491084e38e | ||
|
|
a7a6eb5581 | ||
|
|
4223935b12 | ||
|
|
8dc1ed83b6 | ||
|
|
8f3a7a3b6a | ||
|
|
921a8981fb | ||
|
|
169f2c786d | ||
|
|
629a574dfa | ||
|
|
6b7e9c8c7a | ||
|
|
78f42774da | ||
|
|
54c0949354 | ||
|
|
0632824b99 | ||
|
|
24bbeb31df | ||
|
|
70811d83be | ||
|
|
0ed6b726a2 | ||
|
|
88252cb107 | ||
|
|
cf6468a452 | ||
|
|
3e1c69da21 | ||
|
|
4bcde7d6a2 | ||
|
|
78c1c099df | ||
|
|
7501a7916e | ||
|
|
32f451f1d7 | ||
|
|
aad2ba61d4 | ||
|
|
9932b10bf1 | ||
|
|
f8da24c5ec | ||
|
|
951e439703 | ||
|
|
08e6aca83d | ||
|
|
301f23ac55 | ||
|
|
e36b7cb044 | ||
|
|
9131581f03 | ||
|
|
d79fa6d22b | ||
|
|
c8623e2be7 | ||
|
|
59dda75f16 | ||
|
|
cac65418ff | ||
|
|
e47ce2a28b | ||
|
|
9a697fbde4 | ||
|
|
43b06d5f53 | ||
|
|
ee6082d100 | ||
|
|
4d2218a0d1 | ||
|
|
af9c8ee553 | ||
|
|
3e20e735a3 | ||
|
|
0a0060373b | ||
|
|
12ece26409 | ||
|
|
424e6887b5 | ||
|
|
4987b70df7 | ||
|
|
a072b4688b | ||
|
|
0b3ae5aaa2 | ||
|
|
a48bbb3b13 | ||
|
|
131d196fad | ||
|
|
b0341ec42d | ||
|
|
293d05fde1 | ||
|
|
d39e4a22a8 | ||
|
|
8e9212d059 | ||
|
|
012541ff55 | ||
|
|
0d12c7101c | ||
|
|
6ee7c88f34 | ||
|
|
08af135653 | ||
|
|
37c63a0c22 | ||
|
|
d4ccd2848c | ||
|
|
6862098d8b | ||
|
|
40e5f90d56 | ||
|
|
3df552eb5d | ||
|
|
dbb0bcc5dd | ||
|
|
38facbc064 | ||
|
|
8cc901f334 | ||
|
|
8550f8deaf | ||
|
|
5a6acf1d47 | ||
|
|
a7ff2d0611 | ||
|
|
30bcafb76f | ||
|
|
ce9caa2726 | ||
|
|
b4ccca8c18 | ||
|
|
2dc11524fc | ||
|
|
76bec6d71e | ||
|
|
1740181daf | ||
|
|
2dc179239f | ||
|
|
9b02385e3e | ||
|
|
54e5fb6645 | ||
|
|
8ca4baf470 | ||
|
|
1f7584bf98 | ||
|
|
4364b1d9fb | ||
|
|
33aad1b8de | ||
|
|
dc6dd988bc | ||
|
|
ac81b418d6 | ||
|
|
feed61dd30 | ||
|
|
1c7c52da68 | ||
|
|
71b10672e8 | ||
|
|
687f56178e | ||
|
|
359f1509fa | ||
|
|
b1b3bc3360 | ||
|
|
9018eabb10 | ||
|
|
ed97a42fde | ||
|
|
f6eb94c33b | ||
|
|
6e2f34f4d0 | ||
|
|
13ec9ca888 | ||
|
|
24619bc3ee | ||
|
|
399974ebfb | ||
|
|
6836360e0c | ||
|
|
3844277a66 | ||
|
|
86729b3efc | ||
|
|
beb7599d33 | ||
|
|
7dc6717b5e | ||
|
|
1ff66006b8 | ||
|
|
db5ee0b66a | ||
|
|
7b4eeb368c | ||
|
|
f2e4b89a22 | ||
|
|
670a58e7e7 | ||
|
|
f3a8658cc1 | ||
|
|
bfb94d1e48 | ||
|
|
df77205c43 | ||
|
|
e41436eb14 | ||
|
|
2826061251 | ||
|
|
f56fbcf86e | ||
|
|
2c2bd158a6 | ||
|
|
d95b3efd6b | ||
|
|
db8b111e72 | ||
|
|
ab52572f44 | ||
|
|
6c54e5b63c | ||
|
|
8bcdeedba0 | ||
|
|
7d6a115cc1 | ||
|
|
127a1b2842 | ||
|
|
2fd1040724 | ||
|
|
340f8d9b93 | ||
|
|
9d8cd55cd5 | ||
|
|
150b592aa9 | ||
|
|
56f94da772 | ||
|
|
57ce76dbc1 | ||
|
|
2b23e0f27e | ||
|
|
57c1014e9f | ||
|
|
7268253f5a | ||
|
|
1234c715fc | ||
|
|
bca0691cb0 | ||
|
|
3de9c664fd | ||
|
|
f6560d309e | ||
|
|
254f03ecfe | ||
|
|
0bb02eeb51 | ||
|
|
bf21b4768c | ||
|
|
47dbf9ac27 | ||
|
|
90fc1d750e | ||
|
|
24beed9a95 | ||
|
|
23edeec5a9 | ||
|
|
542a41fb32 | ||
|
|
85ab6daaaa | ||
|
|
e351e7b79a | ||
|
|
05903b271c | ||
|
|
3bd1f01959 | ||
|
|
0581d6827e | ||
|
|
b8812b54b2 | ||
|
|
251845f83e | ||
|
|
7c478016d0 | ||
|
|
deddde953f | ||
|
|
e10bb790cb | ||
|
|
868566a319 | ||
|
|
aeabc955c8 | ||
|
|
030c3bfee9 | ||
|
|
c53353f087 | ||
|
|
f00f0cb0ef | ||
|
|
22d5f31d74 | ||
|
|
830dbe760d | ||
|
|
d7965d81b4 | ||
|
|
a2d7f1369c | ||
|
|
0cee82f715 | ||
|
|
7229033e42 | ||
|
|
8bc4cc7187 | ||
|
|
2b09e70b4a | ||
|
|
38f468eed3 | ||
|
|
88a73c1d9e | ||
|
|
77a2630ed9 | ||
|
|
f54e54123c | ||
|
|
2ac796dbbc | ||
|
|
33818076ff | ||
|
|
47d1da0845 | ||
|
|
8a052edca2 | ||
|
|
1360723137 | ||
|
|
4594c36cfb | ||
|
|
d8e88fd42a | ||
|
|
daa2145378 | ||
|
|
398c64734c | ||
|
|
eb185e5358 | ||
|
|
bb4ad9ec7f | ||
|
|
5777b85701 | ||
|
|
ab3c6ec4eb | ||
|
|
63a3a57620 | ||
|
|
aa9b4d06ba | ||
|
|
fff19f31af | ||
|
|
c47f2232c5 | ||
|
|
c802ec6022 | ||
|
|
b2e6d52509 | ||
|
|
383ff5e227 | ||
|
|
71a98cdf00 | ||
|
|
74f3f7a384 | ||
|
|
3fe8c3109f | ||
|
|
7abad1f4bf | ||
|
|
8d4eb9288a | ||
|
|
866e91c917 | ||
|
|
6f5e25d01d | ||
|
|
9ad7d25fb4 | ||
|
|
958da5e5e9 | ||
|
|
f31bccca1c | ||
|
|
bfcab16de6 | ||
|
|
de8cc02ba5 | ||
|
|
dbc7297d80 | ||
|
|
414c2a1a5f | ||
|
|
dca1fcd7fe | ||
|
|
c0714b7d33 | ||
|
|
a4e3bce6bb | ||
|
|
9a903c166f | ||
|
|
4414c3a9c8 | ||
|
|
11201d8645 | ||
|
|
5846622c4d | ||
|
|
d8e543a4e6 | ||
|
|
0a915199e8 | ||
|
|
165c5a6d9d | ||
|
|
0ad1c352fe | ||
|
|
48d3973daa | ||
|
|
9a1f982b14 | ||
|
|
e8653135d4 | ||
|
|
62bc78380e | ||
|
|
dda348776e | ||
|
|
65c810f085 | ||
|
|
b962bcd178 | ||
|
|
589c358389 | ||
|
|
57a1ea5b56 | ||
|
|
762d83c1f0 | ||
|
|
733fdac755 | ||
|
|
00e25d0ccb | ||
|
|
9806232532 | ||
|
|
88f76ef671 | ||
|
|
f22bd70585 | ||
|
|
3133900125 | ||
|
|
e15392e579 | ||
|
|
9604a6309c | ||
|
|
98a18843da | ||
|
|
61641e7a59 | ||
|
|
c50df37144 | ||
|
|
34fd18ea96 | ||
|
|
65024a0a55 | ||
|
|
4b67949d36 | ||
|
|
2ab9fee8e4 | ||
|
|
f4d9b534dc | ||
|
|
14f394c9e9 | ||
|
|
dbb09cc689 | ||
|
|
bb298fadbe | ||
|
|
f1f47f7281 | ||
|
|
fb1199c49c | ||
|
|
12e55c93c0 | ||
|
|
33aeb53f7a | ||
|
|
e6b33ac8b8 | ||
|
|
14e5528544 | ||
|
|
28f53e801a | ||
|
|
6f2b1a83b7 | ||
|
|
d3b501d35f | ||
|
|
95b3fb306f | ||
|
|
5b790b82c5 | ||
|
|
26361b3692 | ||
|
|
eece3e86b3 | ||
|
|
30eef61f0a | ||
|
|
c119d5e34b | ||
|
|
a33a84df3d | ||
|
|
8a419f66a6 | ||
|
|
29662350dc | ||
|
|
a27bcb8092 | ||
|
|
4d79aa8b19 | ||
|
|
084b345663 | ||
|
|
a0cfe09e09 | ||
|
|
b3c07d45b9 | ||
|
|
acb70ccc1b | ||
|
|
4a71464ca7 | ||
|
|
e993ae59f8 | ||
|
|
f12557acf8 | ||
|
|
9d3badd8b2 | ||
|
|
e2ddea6c7d | ||
|
|
59a6e3cfdd | ||
|
|
1e8d684f9a | ||
|
|
72cfc1f48a | ||
|
|
724bf67295 | ||
|
|
a7a592d93e | ||
|
|
d1bb1de87f | ||
|
|
394d033d19 | ||
|
|
cb678dfdc8 | ||
|
|
4161bbf0ec | ||
|
|
148590927c | ||
|
|
85a81ef741 | ||
|
|
3e662475ee | ||
|
|
b77626b802 | ||
|
|
12f2520b3c | ||
|
|
941b4ddf1f | ||
|
|
85f12a5544 | ||
|
|
81362ed7b7 | ||
|
|
12079550f8 | ||
|
|
1ceb8c0342 | ||
|
|
eab9fb88aa | ||
|
|
acd4a5e8cd | ||
|
|
a4b1fb03aa | ||
|
|
cb88b56016 | ||
|
|
ecf9b41db0 | ||
|
|
c5a75c482c | ||
|
|
32379a8d11 | ||
|
|
b56591c6b6 | ||
|
|
b94bb50ec9 | ||
|
|
e2395335cb | ||
|
|
2d9478b973 | ||
|
|
17e3f753fb | ||
|
|
498ad572ac | ||
|
|
bc61f8c191 | ||
|
|
d252cfd610 | ||
|
|
46a1bdc7ea | ||
|
|
18d0e1fad0 | ||
|
|
ab94e93b94 | ||
|
|
a229507392 | ||
|
|
6a9c917b29 | ||
|
|
9ba4a42426 | ||
|
|
bbd1c9147a | ||
|
|
4793d376d9 | ||
|
|
63606fd2d0 | ||
|
|
d6a1e87f4a | ||
|
|
ffcdaa921f | ||
|
|
f2e03bfc51 | ||
|
|
c89656f3ee | ||
|
|
c9b4318e9e | ||
|
|
1e43e7be4b | ||
|
|
44261b7582 | ||
|
|
b980bce334 | ||
|
|
bd7753db1a | ||
|
|
8c18d7162f | ||
|
|
ac039ec74f | ||
|
|
9f0ea19a1c | ||
|
|
8df2121650 | ||
|
|
8b9719bd2d | ||
|
|
b7249adf63 | ||
|
|
7a3efdfeb9 | ||
|
|
86066d4b12 | ||
|
|
af62a99bf5 | ||
|
|
ac1f304722 | ||
|
|
92720b92a4 | ||
|
|
078440ffbf | ||
|
|
68919a5e42 | ||
|
|
a5a019a124 | ||
|
|
61fe167392 | ||
|
|
fd29925173 | ||
|
|
bea6aa1d2d | ||
|
|
c628e11c01 | ||
|
|
61e7df4d1c | ||
|
|
de53a7c4db | ||
|
|
1e9188ea60 | ||
|
|
a55c7c7889 | ||
|
|
b3387e80e4 | ||
|
|
de0a997fcd | ||
|
|
0f53431221 | ||
|
|
099f2de5b4 | ||
|
|
2f2b39c5d2 | ||
|
|
f3d7d55752 | ||
|
|
2979864752 | ||
|
|
b11d7d93dc | ||
|
|
ba9aeb3322 | ||
|
|
8e2424af49 | ||
|
|
01b9e8da8d | ||
|
|
926a5cf414 | ||
|
|
21140fc0c0 | ||
|
|
3328279120 | ||
|
|
8cf4446e8c | ||
|
|
5b401f3880 | ||
|
|
b783299b73 | ||
|
|
0970d678cf | ||
|
|
bf17fa0bb2 | ||
|
|
0b3c278f49 | ||
|
|
c710bf0e84 | ||
|
|
eb46577f58 | ||
|
|
52f2739da1 | ||
|
|
fc37bc26cd | ||
|
|
bde1a6d586 | ||
|
|
25dc934871 | ||
|
|
2fdfef13d8 | ||
|
|
a928e4657e | ||
|
|
b6fd9a7744 | ||
|
|
64a2483b12 | ||
|
|
1d1e65185a | ||
|
|
c32cd7133f | ||
|
|
409731413e | ||
|
|
8a5e7fa25d | ||
|
|
e05c79a751 | ||
|
|
ef21d08225 | ||
|
|
f8346c4557 | ||
|
|
47ac01e4b9 | ||
|
|
a0c1da2548 | ||
|
|
951b884118 | ||
|
|
fc5c2b5a22 | ||
|
|
e4abff7725 | ||
|
|
a40130ddc4 | ||
|
|
71307d6518 | ||
|
|
fc1b51aa95 | ||
|
|
5fe963dd02 | ||
|
|
f32d222e71 | ||
|
|
a131b244df | ||
|
|
0accd97691 | ||
|
|
f8bd35543c | ||
|
|
a7b10ea936 | ||
|
|
7c97e5566d | ||
|
|
7288425daf | ||
|
|
260c0d07e0 | ||
|
|
26dabeab9b | ||
|
|
f7c2fb8a7d | ||
|
|
4bda53acb7 | ||
|
|
54204d2d95 | ||
|
|
9834b89a30 | ||
|
|
b3a2b53df2 | ||
|
|
77c0a8e100 | ||
|
|
86233e9c28 | ||
|
|
40e7544a2b | ||
|
|
61c1510620 | ||
|
|
eb22112178 | ||
|
|
083aa96e57 | ||
|
|
d82a53ebc6 | ||
|
|
5006b520d1 | ||
|
|
f78dfe80a2 | ||
|
|
44ac326da0 | ||
|
|
a8b23d52a8 | ||
|
|
d880a61857 | ||
|
|
7bd086ba19 | ||
|
|
ff0fe0a6c5 | ||
|
|
ef4df27d1b | ||
|
|
e9e2bd6b89 | ||
|
|
72a9eb0c8a | ||
|
|
b73f033b08 | ||
|
|
b974c09951 | ||
|
|
159b6ee331 | ||
|
|
3dec78c21c | ||
|
|
6ad9bf3dbf | ||
|
|
ee5ac81dfc | ||
|
|
1a842efeaf | ||
|
|
de005b9df3 | ||
|
|
52bc0f566e | ||
|
|
b509d08cbf | ||
|
|
fd0ee2756a | ||
|
|
34e89ac710 | ||
|
|
331d73b566 | ||
|
|
8d460ac402 | ||
|
|
5546c6d6da | ||
|
|
c380288db8 | ||
|
|
bd7bb9b34a | ||
|
|
18251e57a3 | ||
|
|
d06539c35c | ||
|
|
60738dda6d | ||
|
|
e628e3fe0f | ||
|
|
769743c5c0 | ||
|
|
1c75d417ee | ||
|
|
5c518de0f2 | ||
|
|
e6c2c844e9 | ||
|
|
883a7a95a1 | ||
|
|
831252eb81 | ||
|
|
fdc5659f80 | ||
|
|
4d34c7f66b | ||
|
|
f898c250ba | ||
|
|
5ef390f188 | ||
|
|
fa5c6a2949 | ||
|
|
d0bc368358 | ||
|
|
e0dca729d6 | ||
|
|
47c983c625 | ||
|
|
01f61c526f | ||
|
|
538fe5bddb | ||
|
|
f4052c8a5e | ||
|
|
e0a3b0030e | ||
|
|
b30456aa0c | ||
|
|
61c58316ea | ||
|
|
001d036a2c | ||
|
|
fe7d01f7e3 | ||
|
|
a7e43d872f | ||
|
|
d6fc50b40b | ||
|
|
9e02319b6d | ||
|
|
6278deb7a2 | ||
|
|
c6ec8cf302 | ||
|
|
07768ba4c4 | ||
|
|
e2401f32ca | ||
|
|
83abaa9b44 | ||
|
|
c7a14537c1 | ||
|
|
6352799ccb | ||
|
|
b1611eccd8 | ||
|
|
c8eb1010c5 | ||
|
|
14d35c8a31 | ||
|
|
9bf5c98509 | ||
|
|
8821f8baa8 | ||
|
|
8a45d23d63 | ||
|
|
cb0e919bf5 | ||
|
|
d1a435ad9d | ||
|
|
69ba677136 | ||
|
|
406eec6690 | ||
|
|
2f1ee094d2 | ||
|
|
390a6a04a1 | ||
|
|
37e0754cf0 | ||
|
|
a7b2f77227 | ||
|
|
9a7862ea9e | ||
|
|
914d54255f | ||
|
|
aea8548930 | ||
|
|
99dad48961 | ||
|
|
6a5053daeb | ||
|
|
5a2b200948 | ||
|
|
f7dc9a6eaf | ||
|
|
bf5abe2948 | ||
|
|
7867c8c828 | ||
|
|
632cd1e522 |
2
.ghci
2
.ghci
@@ -1,2 +1,2 @@
|
||||
:set -isrc/compiler -isrc/binary -isrc/runtime/haskell -isrc/server -isrc/server/transfer -idist/build/autogen -idist/build
|
||||
:set -isrc/compiler -isrc/binary -isrc/runtime/haskell -isrc/server -isrc/example-based -isrc/server/transfer -idist/build/autogen -idist/build
|
||||
:set -fwarn-unused-imports -optP-DSERVER_MODE -optP-DUSE_INTERRUPT -optP-DCC_LAZY -optP-include -optPdist/build/autogen/cabal_macros.h -odir dist/build/gf/gf-tmp -hidir dist/build/gf/gf-tmp -stubdir dist/build/gf/gf-tmp
|
||||
|
||||
96
.github/workflows/build-all-versions.yml
vendored
Normal file
96
.github/workflows/build-all-versions.yml
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
# Based on the template here: https://kodimensional.dev/github-actions
|
||||
name: Build with stack and cabal
|
||||
|
||||
# Trigger the workflow on push or pull request, but only for the master branch
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
cabal:
|
||||
name: ${{ matrix.os }} / ghc ${{ matrix.ghc }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
cabal: ["latest"]
|
||||
ghc:
|
||||
- "8.6.5"
|
||||
- "8.8.3"
|
||||
- "8.10.1"
|
||||
exclude:
|
||||
- os: macos-latest
|
||||
ghc: 8.8.3
|
||||
- os: macos-latest
|
||||
ghc: 8.6.5
|
||||
- os: windows-latest
|
||||
ghc: 8.8.3
|
||||
- os: windows-latest
|
||||
ghc: 8.6.5
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
||||
|
||||
- uses: haskell/actions/setup@v1
|
||||
id: setup-haskell-cabal
|
||||
name: Setup Haskell
|
||||
with:
|
||||
ghc-version: ${{ matrix.ghc }}
|
||||
cabal-version: ${{ matrix.cabal }}
|
||||
|
||||
- name: Freeze
|
||||
run: |
|
||||
cabal freeze
|
||||
|
||||
- uses: actions/cache@v1
|
||||
name: Cache ~/.cabal/store
|
||||
with:
|
||||
path: ${{ steps.setup-haskell-cabal.outputs.cabal-store }}
|
||||
key: ${{ runner.os }}-${{ matrix.ghc }}
|
||||
# key: ${{ runner.os }}-${{ matrix.ghc }}-${{ hashFiles('cabal.project.freeze') }}
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cabal configure --enable-tests --enable-benchmarks --test-show-details=direct
|
||||
cabal build all
|
||||
|
||||
# - name: Test
|
||||
# run: |
|
||||
# cabal test all
|
||||
|
||||
stack:
|
||||
name: stack / ghc ${{ matrix.ghc }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
stack: ["latest"]
|
||||
ghc: ["7.10.3","8.0.2", "8.2.2", "8.4.4", "8.6.5", "8.8.4"]
|
||||
# ghc: ["8.8.3"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
||||
|
||||
- uses: haskell/actions/setup@v1
|
||||
name: Setup Haskell Stack
|
||||
with:
|
||||
ghc-version: ${{ matrix.ghc }}
|
||||
stack-version: 'latest'
|
||||
enable-stack: true
|
||||
|
||||
- uses: actions/cache@v1
|
||||
name: Cache ~/.stack
|
||||
with:
|
||||
path: ~/.stack
|
||||
key: ${{ runner.os }}-${{ matrix.ghc }}-stack
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
stack build --system-ghc --stack-yaml stack-ghc${{ matrix.ghc }}.yaml
|
||||
# stack build --system-ghc --test --bench --no-run-tests --no-run-benchmarks
|
||||
|
||||
- name: Test
|
||||
run: |
|
||||
stack test --system-ghc --stack-yaml stack-ghc${{ matrix.ghc }}.yaml
|
||||
230
.github/workflows/build-binary-packages.yml
vendored
Normal file
230
.github/workflows/build-binary-packages.yml
vendored
Normal file
@@ -0,0 +1,230 @@
|
||||
name: Build Binary Packages
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
release:
|
||||
types: ["created"]
|
||||
|
||||
jobs:
|
||||
|
||||
# ---
|
||||
|
||||
ubuntu:
|
||||
name: Build Ubuntu package
|
||||
strategy:
|
||||
matrix:
|
||||
os:
|
||||
- ubuntu-18.04
|
||||
- ubuntu-20.04
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
# Note: `haskell-platform` is listed as requirement in debian/control,
|
||||
# which is why it's installed using apt instead of the Setup Haskell action.
|
||||
|
||||
# - name: Setup Haskell
|
||||
# uses: actions/setup-haskell@v1
|
||||
# id: setup-haskell-cabal
|
||||
# with:
|
||||
# ghc-version: ${{ matrix.ghc }}
|
||||
# cabal-version: ${{ matrix.cabal }}
|
||||
|
||||
- name: Install build tools
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
make \
|
||||
dpkg-dev \
|
||||
debhelper \
|
||||
haskell-platform \
|
||||
libghc-json-dev \
|
||||
python-dev \
|
||||
default-jdk \
|
||||
libtool-bin
|
||||
|
||||
- name: Build package
|
||||
run: |
|
||||
make deb
|
||||
|
||||
- name: Copy package
|
||||
run: |
|
||||
cp ../gf_*.deb dist/
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: gf-${{ github.event.release.tag_name }}-${{ matrix.os }}.deb
|
||||
path: dist/gf_*.deb
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Rename package for specific ubuntu version
|
||||
run: |
|
||||
mv dist/gf_*.deb dist/gf-${{ github.event.release.tag_name }}-${{ matrix.os }}.deb
|
||||
|
||||
- uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: dist/gf-${{ github.event.release.tag_name }}-${{ matrix.os }}.deb
|
||||
asset_name: gf-${{ github.event.release.tag_name }}-${{ matrix.os }}.deb
|
||||
asset_content_type: application/octet-stream
|
||||
|
||||
# ---
|
||||
|
||||
macos:
|
||||
name: Build macOS package
|
||||
strategy:
|
||||
matrix:
|
||||
ghc: ["8.6.5"]
|
||||
cabal: ["2.4"]
|
||||
os: ["macos-10.15"]
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Haskell
|
||||
uses: actions/setup-haskell@v1
|
||||
id: setup-haskell-cabal
|
||||
with:
|
||||
ghc-version: ${{ matrix.ghc }}
|
||||
cabal-version: ${{ matrix.cabal }}
|
||||
|
||||
- name: Install build tools
|
||||
run: |
|
||||
brew install \
|
||||
automake
|
||||
cabal v1-install alex happy
|
||||
|
||||
- name: Build package
|
||||
run: |
|
||||
sudo mkdir -p /Library/Java/Home
|
||||
sudo ln -s /usr/local/opt/openjdk/include /Library/Java/Home/include
|
||||
make pkg
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: gf-${{ github.event.release.tag_name }}-macos
|
||||
path: dist/gf-*.pkg
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Rename package
|
||||
run: |
|
||||
mv dist/gf-*.pkg dist/gf-${{ github.event.release.tag_name }}-macos.pkg
|
||||
|
||||
- uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: dist/gf-${{ github.event.release.tag_name }}-macos.pkg
|
||||
asset_name: gf-${{ github.event.release.tag_name }}-macos.pkg
|
||||
asset_content_type: application/octet-stream
|
||||
|
||||
# ---
|
||||
|
||||
windows:
|
||||
name: Build Windows package
|
||||
strategy:
|
||||
matrix:
|
||||
ghc: ["8.6.5"]
|
||||
cabal: ["2.4"]
|
||||
os: ["windows-2019"]
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Setup MSYS2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
install: >-
|
||||
base-devel
|
||||
gcc
|
||||
python-devel
|
||||
|
||||
- name: Prepare dist folder
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
mkdir /c/tmp-dist
|
||||
mkdir /c/tmp-dist/c
|
||||
mkdir /c/tmp-dist/java
|
||||
mkdir /c/tmp-dist/python
|
||||
|
||||
- name: Build C runtime
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
cd src/runtime/c
|
||||
autoreconf -i
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
cp /mingw64/bin/libpgf-0.dll /c/tmp-dist/c
|
||||
cp /mingw64/bin/libgu-0.dll /c/tmp-dist/c
|
||||
|
||||
# JAVA_HOME_8_X64 = C:\hostedtoolcache\windows\Java_Adopt_jdk\8.0.292-10\x64
|
||||
- name: Build Java bindings
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
export JDKPATH=/c/hostedtoolcache/windows/Java_Adopt_jdk/8.0.292-10/x64
|
||||
export PATH="${PATH}:${JDKPATH}/bin"
|
||||
cd src/runtime/java
|
||||
make \
|
||||
JNI_INCLUDES="-I \"${JDKPATH}/include\" -I \"${JDKPATH}/include/win32\" -I \"/mingw64/include\" -D__int64=int64_t" \
|
||||
WINDOWS_LDFLAGS="-L\"/mingw64/lib\" -no-undefined"
|
||||
make install
|
||||
cp .libs/msys-jpgf-0.dll /c/tmp-dist/java/jpgf.dll
|
||||
cp jpgf.jar /c/tmp-dist/java
|
||||
|
||||
- name: Build Python bindings
|
||||
shell: msys2 {0}
|
||||
env:
|
||||
EXTRA_INCLUDE_DIRS: /mingw64/include
|
||||
EXTRA_LIB_DIRS: /mingw64/lib
|
||||
run: |
|
||||
cd src/runtime/python
|
||||
python setup.py build
|
||||
python setup.py install
|
||||
cp /usr/lib/python3.9/site-packages/pgf* /c/tmp-dist/python
|
||||
|
||||
- name: Setup Haskell
|
||||
uses: actions/setup-haskell@v1
|
||||
id: setup-haskell-cabal
|
||||
with:
|
||||
ghc-version: ${{ matrix.ghc }}
|
||||
cabal-version: ${{ matrix.cabal }}
|
||||
|
||||
- name: Install Haskell build tools
|
||||
run: |
|
||||
cabal install alex happy
|
||||
|
||||
- name: Build GF
|
||||
run: |
|
||||
cabal install --only-dependencies -fserver
|
||||
cabal configure -fserver
|
||||
cabal build
|
||||
copy dist\build\gf\gf.exe C:\tmp-dist
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: gf-${{ github.event.release.tag_name }}-windows
|
||||
path: C:\tmp-dist\*
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Create archive
|
||||
run: |
|
||||
Compress-Archive C:\tmp-dist C:\gf-${{ github.event.release.tag_name }}-windows.zip
|
||||
- uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: C:\gf-${{ github.event.release.tag_name }}-windows.zip
|
||||
asset_name: gf-${{ github.event.release.tag_name }}-windows.zip
|
||||
asset_content_type: application/zip
|
||||
216
.github/workflows/build-majestic.yml
vendored
Normal file
216
.github/workflows/build-majestic.yml
vendored
Normal file
@@ -0,0 +1,216 @@
|
||||
name: Build majestic runtime
|
||||
|
||||
on: push
|
||||
|
||||
env:
|
||||
LD_LIBRARY_PATH: /usr/local/lib
|
||||
|
||||
jobs:
|
||||
|
||||
ubuntu-runtime:
|
||||
name: Runtime (Ubuntu)
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Build runtime
|
||||
working-directory: ./src/runtime/c
|
||||
run: |
|
||||
autoreconf -i
|
||||
./configure
|
||||
make
|
||||
sudo make install
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@master
|
||||
with:
|
||||
name: libpgf-ubuntu
|
||||
path: |
|
||||
/usr/local/lib/libpgf*
|
||||
/usr/local/include/pgf
|
||||
|
||||
ubuntu-haskell:
|
||||
name: Haskell (Ubuntu)
|
||||
runs-on: ubuntu-20.04
|
||||
needs: ubuntu-runtime
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@master
|
||||
with:
|
||||
name: libpgf-ubuntu
|
||||
- run: |
|
||||
sudo mv lib/* /usr/local/lib/
|
||||
sudo mv include/* /usr/local/include/
|
||||
|
||||
- name: Setup Haskell
|
||||
uses: haskell/actions/setup@v1
|
||||
|
||||
- name: Build & run testsuite
|
||||
working-directory: ./src/runtime/haskell
|
||||
run: |
|
||||
cabal test --extra-lib-dirs=/usr/local/lib
|
||||
|
||||
ubuntu-python:
|
||||
name: Python (Ubuntu)
|
||||
runs-on: ubuntu-20.04
|
||||
needs: ubuntu-runtime
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@master
|
||||
with:
|
||||
name: libpgf-ubuntu
|
||||
- run: |
|
||||
sudo mv lib/* /usr/local/lib/
|
||||
sudo mv include/* /usr/local/include/
|
||||
|
||||
- name: Install bindings
|
||||
working-directory: ./src/runtime/python
|
||||
run: |
|
||||
python setup.py build
|
||||
sudo python setup.py install
|
||||
|
||||
- name: Run testsuite
|
||||
working-directory: ./src/runtime/python
|
||||
run: |
|
||||
pip install pytest
|
||||
pytest
|
||||
|
||||
ubuntu-javascript:
|
||||
name: JavaScript (Ubuntu)
|
||||
runs-on: ubuntu-20.04
|
||||
needs: ubuntu-runtime
|
||||
if: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@master
|
||||
with:
|
||||
name: libpgf-ubuntu
|
||||
- run: |
|
||||
sudo mv lib/* /usr/local/lib/
|
||||
sudo mv include/* /usr/local/include/
|
||||
|
||||
- name: Install dependencies
|
||||
working-directory: ./src/runtime/javascript
|
||||
run: |
|
||||
npm ci
|
||||
|
||||
- name: Run testsuite
|
||||
working-directory: ./src/runtime/javascript
|
||||
run: |
|
||||
npm run test
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
macos-runtime:
|
||||
name: Runtime (macOS)
|
||||
runs-on: macOS-11
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Install build tools
|
||||
run: |
|
||||
brew install \
|
||||
autoconf \
|
||||
automake \
|
||||
libtool \
|
||||
|
||||
- name: Build runtime
|
||||
working-directory: ./src/runtime/c
|
||||
run: |
|
||||
glibtoolize
|
||||
autoreconf -i
|
||||
./configure
|
||||
make
|
||||
sudo make install
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@master
|
||||
with:
|
||||
name: libpgf-macos
|
||||
path: |
|
||||
/usr/local/lib/libpgf*
|
||||
/usr/local/include/pgf
|
||||
|
||||
macos-haskell:
|
||||
name: Haskell (macOS)
|
||||
runs-on: macOS-11
|
||||
needs: macos-runtime
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@master
|
||||
with:
|
||||
name: libpgf-macos
|
||||
- run: |
|
||||
sudo mv lib/* /usr/local/lib/
|
||||
sudo mv include/* /usr/local/include/
|
||||
|
||||
- name: Setup Haskell
|
||||
uses: haskell/actions/setup@v1
|
||||
|
||||
- name: Build & run testsuite
|
||||
working-directory: ./src/runtime/haskell
|
||||
run: |
|
||||
cabal test --extra-lib-dirs=/usr/local/lib
|
||||
|
||||
macos-python:
|
||||
name: Python (macOS)
|
||||
runs-on: macOS-11
|
||||
needs: macos-runtime
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@master
|
||||
with:
|
||||
name: libpgf-macos
|
||||
- run: |
|
||||
sudo mv lib/* /usr/local/lib/
|
||||
sudo mv include/* /usr/local/include/
|
||||
|
||||
- name: Install bindings
|
||||
working-directory: ./src/runtime/python
|
||||
run: |
|
||||
python3 setup.py build
|
||||
sudo python3 setup.py install
|
||||
|
||||
- name: Run testsuite
|
||||
working-directory: ./src/runtime/python
|
||||
run: |
|
||||
pip3 install pytest
|
||||
pytest
|
||||
|
||||
macos-javascript:
|
||||
name: JavaScript (macOS)
|
||||
runs-on: macOS-11
|
||||
needs: macos-runtime
|
||||
if: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@master
|
||||
with:
|
||||
name: libpgf-macos
|
||||
- run: |
|
||||
sudo mv lib/* /usr/local/lib/
|
||||
sudo mv include/* /usr/local/include/
|
||||
|
||||
- name: Install dependencies
|
||||
working-directory: ./src/runtime/javascript
|
||||
run: |
|
||||
npm ci
|
||||
|
||||
- name: Run testsuite
|
||||
working-directory: ./src/runtime/javascript
|
||||
run: |
|
||||
npm run test
|
||||
98
.github/workflows/build-python-package.yml
vendored
Normal file
98
.github/workflows/build-python-package.yml
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
name: Build & Publish Python Package
|
||||
|
||||
# Trigger the workflow on push or pull request, but only for the master branch
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
build_wheels:
|
||||
name: Build wheel on ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
os: [ubuntu-18.04, macos-10.15]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- uses: actions/setup-python@v1
|
||||
name: Install Python
|
||||
with:
|
||||
python-version: '3.7'
|
||||
|
||||
- name: Install cibuildwheel
|
||||
run: |
|
||||
python -m pip install git+https://github.com/joerick/cibuildwheel.git@main
|
||||
|
||||
- name: Install build tools for OSX
|
||||
if: startsWith(matrix.os, 'macos')
|
||||
run: |
|
||||
brew install automake
|
||||
|
||||
- name: Build wheels on Linux
|
||||
if: startsWith(matrix.os, 'macos') != true
|
||||
env:
|
||||
CIBW_BEFORE_BUILD: cd src/runtime/c && autoreconf -i && ./configure && make && make install
|
||||
run: |
|
||||
python -m cibuildwheel src/runtime/python --output-dir wheelhouse
|
||||
|
||||
- name: Build wheels on OSX
|
||||
if: startsWith(matrix.os, 'macos')
|
||||
env:
|
||||
CIBW_BEFORE_BUILD: cd src/runtime/c && glibtoolize && autoreconf -i && ./configure && make && make install
|
||||
run: |
|
||||
python -m cibuildwheel src/runtime/python --output-dir wheelhouse
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
path: ./wheelhouse
|
||||
|
||||
build_sdist:
|
||||
name: Build source distribution
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: actions/setup-python@v2
|
||||
name: Install Python
|
||||
with:
|
||||
python-version: '3.7'
|
||||
|
||||
- name: Build sdist
|
||||
run: cd src/runtime/python && python setup.py sdist
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
path: ./src/runtime/python/dist/*.tar.gz
|
||||
|
||||
upload_pypi:
|
||||
name: Upload to PyPI
|
||||
needs: [build_wheels, build_sdist]
|
||||
runs-on: ubuntu-latest
|
||||
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- name: Install twine
|
||||
run: pip install twine
|
||||
|
||||
- uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: artifact
|
||||
path: ./dist
|
||||
|
||||
- name: Publish
|
||||
env:
|
||||
TWINE_USERNAME: __token__
|
||||
TWINE_PASSWORD: ${{ secrets.pypi_password }}
|
||||
run: |
|
||||
(cd ./src/runtime/python && curl -I --fail https://pypi.org/project/$(python setup.py --name)/$(python setup.py --version)/) || twine upload dist/*
|
||||
33
.gitignore
vendored
33
.gitignore
vendored
@@ -5,7 +5,15 @@
|
||||
*.jar
|
||||
*.gfo
|
||||
*.pgf
|
||||
*.ngf
|
||||
debian/.debhelper
|
||||
debian/debhelper-build-stamp
|
||||
debian/gf
|
||||
debian/gf.debhelper.log
|
||||
debian/gf.substvars
|
||||
debian/files
|
||||
dist/
|
||||
dist-newstyle/
|
||||
src/runtime/c/.libs/
|
||||
src/runtime/c/Makefile
|
||||
src/runtime/c/Makefile.in
|
||||
@@ -39,7 +47,32 @@ src/runtime/c/sg/.dirstamp
|
||||
src/runtime/c/stamp-h1
|
||||
src/runtime/java/.libs/
|
||||
src/runtime/python/build/
|
||||
src/runtime/python/**/__pycache__/
|
||||
src/runtime/python/**/.pytest_cache/
|
||||
.cabal-sandbox
|
||||
cabal.sandbox.config
|
||||
.stack-work
|
||||
DATA_DIR
|
||||
|
||||
stack*.yaml.lock
|
||||
|
||||
# Output files for test suite
|
||||
*.out
|
||||
gf-tests.html
|
||||
|
||||
# Generated documentation (not exhaustive)
|
||||
demos/index-numbers.html
|
||||
demos/resourcegrammars.html
|
||||
demos/translation.html
|
||||
doc/tutorial/gf-tutorial.html
|
||||
doc/index.html
|
||||
doc/gf-bibliography.html
|
||||
doc/gf-developers.html
|
||||
doc/gf-editor-modes.html
|
||||
doc/gf-people.html
|
||||
doc/gf-refman.html
|
||||
doc/gf-shell-reference.html
|
||||
doc/icfp-2012.html
|
||||
download/*.html
|
||||
gf-book/index.html
|
||||
src/www/gf-web-api.html
|
||||
|
||||
14
.travis.yml
14
.travis.yml
@@ -1,14 +0,0 @@
|
||||
sudo: required
|
||||
|
||||
language: c
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
before_install:
|
||||
- docker pull odanoburu/gf-src:3.9
|
||||
|
||||
script:
|
||||
- |
|
||||
docker run --mount src="$(pwd)",target=/home/gfer,type=bind odanoburu/gf-src:3.9 /bin/bash -c "cd /home/gfer/src/runtime/c &&
|
||||
autoreconf -i && ./configure && make && make install ; cd /home/gfer ; cabal install -fserver -fc-runtime --extra-lib-dirs='/usr/local/lib'"
|
||||
11
CHANGELOG.md
Normal file
11
CHANGELOG.md
Normal file
@@ -0,0 +1,11 @@
|
||||
### New since 3.11 (WIP)
|
||||
|
||||
- Added a changelog!
|
||||
|
||||
### 3.11
|
||||
|
||||
See <https://www.grammaticalframework.org/download/release-3.11.html>
|
||||
|
||||
### 3.10
|
||||
|
||||
See <https://www.grammaticalframework.org/download/release-3.10.html>
|
||||
50
Makefile
50
Makefile
@@ -1,29 +1,47 @@
|
||||
.PHONY: all build install doc clean gf html deb pkg bintar sdist
|
||||
.PHONY: all build install doc clean html deb pkg bintar sdist
|
||||
|
||||
# This gets the numeric part of the version from the cabal file
|
||||
VERSION=$(shell sed -ne "s/^version: *\([0-9.]*\).*/\1/p" gf.cabal)
|
||||
|
||||
# Check if stack is installed
|
||||
STACK=$(shell if hash stack 2>/dev/null; then echo "1"; else echo "0"; fi)
|
||||
|
||||
# Check if cabal >= 2.4 is installed (with v1- and v2- commands)
|
||||
CABAL_NEW=$(shell if cabal v1-repl --help >/dev/null 2>&1 ; then echo "1"; else echo "0"; fi)
|
||||
|
||||
ifeq ($(STACK),1)
|
||||
CMD=stack
|
||||
else
|
||||
CMD=cabal
|
||||
ifeq ($(CABAL_NEW),1)
|
||||
CMD_PFX=v1-
|
||||
endif
|
||||
endif
|
||||
|
||||
all: build
|
||||
|
||||
dist/setup-config: gf.cabal Setup.hs WebSetup.hs
|
||||
cabal configure
|
||||
ifneq ($(STACK),1)
|
||||
cabal ${CMD_PFX}configure
|
||||
endif
|
||||
|
||||
build: dist/setup-config
|
||||
cabal build
|
||||
${CMD} ${CMD_PFX}build
|
||||
|
||||
install:
|
||||
cabal copy
|
||||
cabal register
|
||||
ifeq ($(STACK),1)
|
||||
stack install
|
||||
else
|
||||
cabal ${CMD_PFX}copy
|
||||
cabal ${CMD_PFX}register
|
||||
endif
|
||||
|
||||
doc:
|
||||
cabal haddock
|
||||
${CMD} ${CMD_PFX}haddock
|
||||
|
||||
clean:
|
||||
cabal clean
|
||||
|
||||
gf:
|
||||
cabal build rgl-none
|
||||
strip dist/build/gf/gf
|
||||
${CMD} ${CMD_PFX}clean
|
||||
bash bin/clean_html
|
||||
|
||||
html::
|
||||
bash bin/update_html
|
||||
@@ -32,9 +50,9 @@ html::
|
||||
# number to the top of debian/changelog.
|
||||
# (Tested on Ubuntu 15.04. You need to install dpkg-dev & debhelper.)
|
||||
deb:
|
||||
dpkg-buildpackage -b
|
||||
dpkg-buildpackage -b -uc
|
||||
|
||||
# Make an OS X Installer package
|
||||
# Make a macOS installer package
|
||||
pkg:
|
||||
FMT=pkg bash bin/build-binary-dist.sh
|
||||
|
||||
@@ -47,6 +65,6 @@ bintar:
|
||||
|
||||
# Make a source tar.gz distribution using git to make sure that everything is included.
|
||||
# We put the distribution in dist/ so it is removed on `make clean`
|
||||
sdist:
|
||||
test -d dist || mkdir dist
|
||||
git archive --format=tar.gz --output=dist/gf-${VERSION}.tar.gz HEAD
|
||||
# sdist:
|
||||
# test -d dist || mkdir dist
|
||||
# git archive --format=tar.gz --output=dist/gf-${VERSION}.tar.gz HEAD
|
||||
|
||||
16
README.md
16
README.md
@@ -1,9 +1,7 @@
|
||||

|
||||

|
||||
|
||||
# Grammatical Framework (GF)
|
||||
|
||||
[](https://travis-ci.org/GrammaticalFramework/gf-core)
|
||||
|
||||
The Grammatical Framework is a grammar formalism based on type theory.
|
||||
It consists of:
|
||||
|
||||
@@ -32,20 +30,16 @@ GF particularly addresses four aspects of grammars:
|
||||
|
||||
## Compilation and installation
|
||||
|
||||
The simplest way of installing GF is with the command:
|
||||
The simplest way of installing GF from source is with the command:
|
||||
```
|
||||
cabal install
|
||||
```
|
||||
|
||||
This can be broken down into the usual sub-steps:
|
||||
or:
|
||||
```
|
||||
cabal configure
|
||||
cabal build
|
||||
cabal copy
|
||||
stack install
|
||||
```
|
||||
|
||||
For more details, see the [download page](http://www.grammaticalframework.org/download/index.html)
|
||||
and [developers manual](http://www.grammaticalframework.org/doc/gf-developers.html).
|
||||
For more information, including links to precompiled binaries, see the [download page](https://www.grammaticalframework.org/download/index.html).
|
||||
|
||||
## About this repository
|
||||
|
||||
|
||||
69
RELEASE.md
Normal file
69
RELEASE.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# GF Core releases
|
||||
|
||||
**Note:**
|
||||
The RGL is now released completely separately from GF Core.
|
||||
See the [RGL's RELEASE.md](https://github.com/GrammaticalFramework/gf-rgl/blob/master/RELEASE.md).
|
||||
|
||||
## Creating a new release
|
||||
|
||||
### 1. Prepare the repository
|
||||
|
||||
**Web pages**
|
||||
|
||||
1. Create `download/index-X.Y.md` with installation instructions.
|
||||
2. Create `download/release-X.Y.md` with changelog information.
|
||||
3. Update `download/index.html` to redirect to the new version.
|
||||
4. Add announcement in news section in `index.html`.
|
||||
|
||||
**Version numbers**
|
||||
|
||||
1. Update version number in `gf.cabal` (ommitting `-git` suffix).
|
||||
2. Add a new line in `debian/changelog`.
|
||||
|
||||
### 2. Create GitHub release
|
||||
|
||||
1. When the above changes are committed to the `master` branch in the repository
|
||||
and pushed, check that all CI workflows are successful (fixing as necessary):
|
||||
- <https://github.com/GrammaticalFramework/gf-core/actions>
|
||||
- <https://travis-ci.org/github/GrammaticalFramework/gf-core>
|
||||
2. Create a GitHub release [here](https://github.com/GrammaticalFramework/gf-core/releases/new):
|
||||
- Tag version format `RELEASE-X.Y`
|
||||
- Title: "GF X.Y"
|
||||
- Description: mention major changes since last release
|
||||
3. Publish the release to trigger the building of the binary packages (below).
|
||||
|
||||
### 3. Binary packages
|
||||
|
||||
The binaries will be built automatically by GitHub Actions when the release is created,
|
||||
but the generated _artifacts_ must be manually attached to the release as _assets_.
|
||||
|
||||
1. Go to the [actions page](https://github.com/GrammaticalFramework/gf-core/actions) and click "Build Binary Packages" under _Workflows_.
|
||||
2. Choose the workflow run corresponding to the newly created release.
|
||||
3. Download the artifacts locally. Extract the Ubuntu and macOS ones to get the `.deb` and `.pkg` files.
|
||||
4. Go back to the [releases page](https://github.com/GrammaticalFramework/gf-core/releases) and click to edit the release information.
|
||||
5. Add the downloaded artifacts as release assets, giving them names with format `gf-X.Y-PLATFORM.EXT` (e.g. `gf-3.11-macos.pkg`).
|
||||
|
||||
### 4. Upload to Hackage
|
||||
|
||||
In order to do this you will need to be added the [GF maintainers](https://hackage.haskell.org/package/gf/maintainers/) on Hackage.
|
||||
|
||||
1. Run `stack sdist --test-tarball` and address any issues.
|
||||
2. Upload the package, either:
|
||||
1. **Manually**: visit <https://hackage.haskell.org/upload> and upload the file generated by the previous command.
|
||||
2. **via Stack**: `stack upload . --candidate`
|
||||
3. After testing the candidate, publish it:
|
||||
1. **Manually**: visit <https://hackage.haskell.org/package/gf-X.Y.Z/candidate/publish>
|
||||
1. **via Stack**: `stack upload .`
|
||||
4. If the documentation-building fails on the Hackage server, do:
|
||||
```
|
||||
cabal v2-haddock --builddir=dist/docs --haddock-for-hackage --enable-doc
|
||||
cabal upload --documentation dist/docs/*-docs.tar.gz
|
||||
```
|
||||
|
||||
## Miscellaneous
|
||||
|
||||
### What is the tag `GF-3.10`?
|
||||
|
||||
For GF 3.10, the Core and RGL repositories had already been separated, however
|
||||
the binary packages still included the RGL. `GF-3.10` is a tag that was created
|
||||
in both repositories ([gf-core](https://github.com/GrammaticalFramework/gf-core/releases/tag/GF-3.10) and [gf-rgl](https://github.com/GrammaticalFramework/gf-rgl/releases/tag/GF-3.10)) to indicate which versions of each went into the binaries.
|
||||
12
Setup.hs
12
Setup.hs
@@ -1,3 +1,4 @@
|
||||
import Distribution.System(Platform(..),OS(..))
|
||||
import Distribution.Simple(defaultMainWithHooks,UserHooks(..),simpleUserHooks)
|
||||
import Distribution.Simple.LocalBuildInfo(LocalBuildInfo(..),absoluteInstallDirs,datadir)
|
||||
import Distribution.Simple.Setup(BuildFlags(..),Flag(..),InstallFlags(..),CopyDest(..),CopyFlags(..),SDistFlags(..))
|
||||
@@ -18,7 +19,6 @@ main = defaultMainWithHooks simpleUserHooks
|
||||
, preInst = gfPreInst
|
||||
, postInst = gfPostInst
|
||||
, postCopy = gfPostCopy
|
||||
, sDistHook = gfSDist
|
||||
}
|
||||
where
|
||||
gfPreBuild args = gfPre args . buildDistPref
|
||||
@@ -28,17 +28,17 @@ main = defaultMainWithHooks simpleUserHooks
|
||||
return emptyHookedBuildInfo
|
||||
|
||||
gfPostBuild args flags pkg lbi = do
|
||||
noRGLmsg
|
||||
-- noRGLmsg
|
||||
let gf = default_gf lbi
|
||||
buildWeb gf flags (pkg,lbi)
|
||||
|
||||
gfPostInst args flags pkg lbi = do
|
||||
noRGLmsg
|
||||
-- noRGLmsg
|
||||
saveInstallPath args flags (pkg,lbi)
|
||||
installWeb (pkg,lbi)
|
||||
|
||||
gfPostCopy args flags pkg lbi = do
|
||||
noRGLmsg
|
||||
-- noRGLmsg
|
||||
saveCopyPath args flags (pkg,lbi)
|
||||
copyWeb flags (pkg,lbi)
|
||||
|
||||
@@ -73,5 +73,9 @@ dataDirFile = "DATA_DIR"
|
||||
default_gf :: LocalBuildInfo -> FilePath
|
||||
default_gf lbi = buildDir lbi </> exeName' </> exeNameReal
|
||||
where
|
||||
-- shadows Distribution.Simple.BuildPaths.exeExtension, which changed type signature in Cabal 2.4
|
||||
exeExtension = case hostPlatform lbi of
|
||||
Platform arch Windows -> "exe"
|
||||
_ -> ""
|
||||
exeName' = "gf"
|
||||
exeNameReal = exeName' <.> exeExtension
|
||||
|
||||
20
WebSetup.hs
20
WebSetup.hs
@@ -26,6 +26,14 @@ import Distribution.PackageDescription(PackageDescription(..))
|
||||
so users won't see this message unless they check the log.)
|
||||
-}
|
||||
|
||||
-- | Notice about contrib grammars
|
||||
noContribMsg :: IO ()
|
||||
noContribMsg = putStr $ unlines
|
||||
[ "Example grammars are no longer included in the main GF repository, but have moved to gf-contrib."
|
||||
, "If you want them to be built, clone the following repository in the same directory as gf-core:"
|
||||
, "https://github.com/GrammaticalFramework/gf-contrib.git"
|
||||
]
|
||||
|
||||
example_grammars :: [(String, String, [String])] -- [(pgf, subdir, source modules)]
|
||||
example_grammars =
|
||||
[("Letter.pgf","letter",letterSrc)
|
||||
@@ -50,11 +58,8 @@ buildWeb gf flags (pkg,lbi) = do
|
||||
contrib_exists <- doesDirectoryExist contrib_dir
|
||||
if contrib_exists
|
||||
then mapM_ build_pgf example_grammars
|
||||
else putStr $ unlines
|
||||
[ "Example grammars are no longer included in the main GF repository, but have moved to gf-contrib."
|
||||
, "If you want these example grammars to be built, clone this repository in the same top-level directory as GF:"
|
||||
, "https://github.com/GrammaticalFramework/gf-contrib.git"
|
||||
]
|
||||
-- else noContribMsg
|
||||
else return ()
|
||||
where
|
||||
gfo_dir = buildDir lbi </> "examples"
|
||||
|
||||
@@ -104,9 +109,10 @@ setupWeb dest (pkg,lbi) = do
|
||||
copy_pgf (pgf,subdir,_) =
|
||||
do let src = gfo_dir </> pgf
|
||||
let dst = grammars_dir </> pgf
|
||||
putStrLn $ "Installing "++dst
|
||||
ex <- doesFileExist src
|
||||
if ex then copyFile src dst else return ()
|
||||
if ex then do putStrLn $ "Installing "++dst
|
||||
copyFile src dst
|
||||
else putStrLn $ "Not installing "++dst
|
||||
|
||||
gf_logo = "gf0.png"
|
||||
|
||||
|
||||
@@ -1,33 +1,38 @@
|
||||
#! /bin/bash
|
||||
|
||||
### This script builds a binary distribution of GF from the source
|
||||
### package that this script is a part of. It assumes that you have installed
|
||||
### the Haskell Platform, version 2013.2.0.0 or 2012.4.0.0.
|
||||
### Two binary package formats are supported: plain tar files (.tar.gz) and
|
||||
### OS X Installer packages (.pkg).
|
||||
### This script builds a binary distribution of GF from source.
|
||||
### It assumes that you have Haskell and Cabal installed.
|
||||
### Two binary package formats are supported (specified with the FMT env var):
|
||||
### - plain tar files (.tar.gz)
|
||||
### - macOS installer packages (.pkg)
|
||||
|
||||
os=$(uname) # Operating system name (e.g. Darwin or Linux)
|
||||
hw=$(uname -m) # Hardware name (e.g. i686 or x86_64)
|
||||
|
||||
# GF version number:
|
||||
cabal="cabal v1-" # Cabal >= 2.4
|
||||
# cabal="cabal " # Cabal <= 2.2
|
||||
|
||||
## Get GF version number from Cabal file
|
||||
ver=$(grep -i ^version: gf.cabal | sed -e 's/version://' -e 's/ //g')
|
||||
|
||||
name="gf-$ver"
|
||||
destdir="$PWD/dist/$name" # assemble binary dist here
|
||||
prefix=${PREFIX:-/usr/local} # where to install
|
||||
fmt=${FMT:-tar.gz} # binary package format (tar.gz or pkg)
|
||||
ghc=${GHC:-ghc} # which Haskell compiler to use
|
||||
|
||||
extralib="$destdir$prefix/lib"
|
||||
extrainclude="$destdir$prefix/include"
|
||||
extra="--extra-lib-dirs=$extralib --extra-include-dirs=$extrainclude"
|
||||
|
||||
set -e # Stop if an error occurs
|
||||
set -x # print commands before exuting them
|
||||
set -x # print commands before executing them
|
||||
|
||||
## First configure & build the C run-time system
|
||||
pushd src/runtime/c
|
||||
bash setup.sh configure --prefix="$prefix"
|
||||
bash setup.sh build
|
||||
bash setup.sh install prefix="$prefix" # hack required for GF build on macOS
|
||||
bash setup.sh install prefix="$destdir$prefix"
|
||||
popd
|
||||
|
||||
@@ -37,11 +42,11 @@ if which >/dev/null python; then
|
||||
EXTRA_INCLUDE_DIRS="$extrainclude" EXTRA_LIB_DIRS="$extralib" python setup.py build
|
||||
python setup.py install --prefix="$destdir$prefix"
|
||||
if [ "$fmt" == pkg ] ; then
|
||||
# A hack for Python on OS X to find the PGF modules
|
||||
pyver=$(ls "$destdir$prefix/lib" | sed -n 's/^python//p')
|
||||
pydest="$destdir/Library/Python/$pyver/site-packages"
|
||||
mkdir -p "$pydest"
|
||||
ln "$destdir$prefix/lib/python$pyver/site-packages"/pgf* "$pydest"
|
||||
# A hack for Python on macOS to find the PGF modules
|
||||
pyver=$(ls "$destdir$prefix/lib" | sed -n 's/^python//p')
|
||||
pydest="$destdir/Library/Python/$pyver/site-packages"
|
||||
mkdir -p "$pydest"
|
||||
ln "$destdir$prefix/lib/python$pyver/site-packages"/pgf* "$pydest"
|
||||
fi
|
||||
popd
|
||||
else
|
||||
@@ -52,52 +57,42 @@ fi
|
||||
if which >/dev/null javac && which >/dev/null jar ; then
|
||||
pushd src/runtime/java
|
||||
rm -f libjpgf.la # In case it contains the wrong INSTALL_PATH
|
||||
if make CFLAGS="-I$extrainclude -L$extralib" INSTALL_PATH="$prefix/lib"
|
||||
if make CFLAGS="-I$extrainclude -L$extralib" INSTALL_PATH="$prefix"
|
||||
then
|
||||
make INSTALL_PATH="$destdir$prefix/lib" install
|
||||
make INSTALL_PATH="$destdir$prefix" install
|
||||
else
|
||||
echo "*** Skipping the Java binding because of errors"
|
||||
echo "Skipping the Java binding because of errors"
|
||||
fi
|
||||
popd
|
||||
else
|
||||
echo "Java SDK is not installed, so the Java binding will not be included"
|
||||
fi
|
||||
|
||||
## To find dynamic C run-time libraries when building GF below
|
||||
export DYLD_LIBRARY_PATH="$extralib" LD_LIBRARY_PATH="$extralib"
|
||||
|
||||
## Build GF, with C run-time support enabled
|
||||
cabal install --only-dependencies -fserver -fc-runtime $extra
|
||||
cabal configure --prefix="$prefix" -fserver -fc-runtime $extra
|
||||
DYLD_LIBRARY_PATH="$extralib" LD_LIBRARY_PATH="$extralib" cabal build
|
||||
# Building the example grammars will fail, because the RGL is missing
|
||||
cabal copy --destdir="$destdir" # create www directory
|
||||
|
||||
## Build the RGL and copy it to $destdir
|
||||
PATH=$PWD/dist/build/gf:$PATH
|
||||
export GF_LIB_PATH="$(dirname $(find "$destdir" -name www))/lib" # hmm
|
||||
mkdir -p "$GF_LIB_PATH"
|
||||
pushd ../gf-rgl
|
||||
make build
|
||||
make copy
|
||||
popd
|
||||
|
||||
# Build GF again, including example grammars that need the RGL
|
||||
DYLD_LIBRARY_PATH="$extralib" LD_LIBRARY_PATH="$extralib" cabal build
|
||||
${cabal}install -w "$ghc" --only-dependencies -fserver -fc-runtime $extra
|
||||
${cabal}configure -w "$ghc" --prefix="$prefix" -fserver -fc-runtime $extra
|
||||
${cabal}build
|
||||
|
||||
## Copy GF to $destdir
|
||||
cabal copy --destdir="$destdir"
|
||||
${cabal}copy --destdir="$destdir"
|
||||
libdir=$(dirname $(find "$destdir" -name PGF.hi))
|
||||
cabal register --gen-pkg-config=$libdir/gf-$ver.conf
|
||||
${cabal}register --gen-pkg-config="$libdir/gf-$ver.conf"
|
||||
|
||||
## Create the binary distribution package
|
||||
case $fmt in
|
||||
tar.gz)
|
||||
targz="$name-bin-$hw-$os.tar.gz" # the final tar file
|
||||
tar -C "$destdir/$prefix" -zcf "dist/$targz" .
|
||||
echo "Created $targz, consider renaming it to something more user friendly"
|
||||
;;
|
||||
targz="$name-bin-$hw-$os.tar.gz" # the final tar file
|
||||
tar --directory "$destdir/$prefix" --gzip --create --file "dist/$targz" .
|
||||
echo "Created $targz"
|
||||
;;
|
||||
pkg)
|
||||
pkg=$name.pkg
|
||||
pkgbuild --identifier org.grammaticalframework.gf.pkg --version "$ver" --root "$destdir" --install-location / dist/$pkg
|
||||
echo "Created $pkg"
|
||||
pkg=$name.pkg
|
||||
pkgbuild --identifier org.grammaticalframework.gf.pkg --version "$ver" --root "$destdir" --install-location / dist/$pkg
|
||||
echo "Created $pkg"
|
||||
esac
|
||||
|
||||
## Cleanup
|
||||
rm -r "$destdir"
|
||||
|
||||
20
bin/clean_html
Executable file
20
bin/clean_html
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script finds all .t2t (txt2tags) and .md (Markdown) files
|
||||
# and deletes the corresponding HTML file of the same name.
|
||||
|
||||
find . -name '*.t2t' | while read t2t ; do
|
||||
html="${t2t%.t2t}.html"
|
||||
if [ -f "$html" ] ; then
|
||||
echo "$html"
|
||||
rm -f "$html"
|
||||
fi
|
||||
done
|
||||
|
||||
find . -name '*.md' | while read md ; do
|
||||
html="${md%.md}.html"
|
||||
if [ -f "$html" ] ; then
|
||||
echo "$html"
|
||||
rm -f "$html"
|
||||
fi
|
||||
done
|
||||
147
bin/template.html
Normal file
147
bin/template.html
Normal file
@@ -0,0 +1,147 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang$" xml:lang="$lang$"$if(dir)$ dir="$dir$"$endif$>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
$for(author-meta)$
|
||||
<meta name="author" content="$author-meta$" />
|
||||
$endfor$
|
||||
$if(date-meta)$
|
||||
<meta name="dcterms.date" content="$date-meta$" />
|
||||
$endif$
|
||||
$if(keywords)$
|
||||
<meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$" />
|
||||
$endif$
|
||||
<title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.2/css/all.css" integrity="sha384-/rXc/GQVaYpyDdyxK+ecHPVYJSN9bmVFBvjA/9eOB+pb3F2w2N6fc5qB9Ew5yIns" crossorigin="anonymous">
|
||||
$for(css)$
|
||||
<link rel="stylesheet" href="$css$" />
|
||||
$endfor$
|
||||
$if(math)$
|
||||
$math$
|
||||
$endif$
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
|
||||
<![endif]-->
|
||||
$for(header-includes)$
|
||||
$header-includes$
|
||||
$endfor$
|
||||
</head>
|
||||
<body class="bg-light">
|
||||
<div class="bg-white pb-5">
|
||||
$for(include-before)$
|
||||
$include-before$
|
||||
$endfor$
|
||||
<div class="container-fluid py-5" style="max-width:1200px">
|
||||
|
||||
$if(title)$
|
||||
<header id="title-block-header">
|
||||
<a href="$rel-root$" title="Home">
|
||||
<img src="$rel-root$/doc/Logos/gf1.svg" height="200" class="float-md-right ml-3 mb-3 bg-white" alt="GF Logo">
|
||||
</a>
|
||||
<h1 class="title">$title$</h1>
|
||||
$if(subtitle)$
|
||||
<p class="subtitle">$subtitle$</p>
|
||||
$endif$
|
||||
$for(author)$
|
||||
<p class="author">$author$</p>
|
||||
$endfor$
|
||||
$if(date)$
|
||||
<p class="date">$date$</p>
|
||||
$endif$
|
||||
</header>
|
||||
$endif$
|
||||
$if(toc)$
|
||||
<nav id="$idprefix$TOC">
|
||||
$if(table-of-contents)$
|
||||
<!-- pandoc >= 2.0 -->
|
||||
$table-of-contents$
|
||||
$else$
|
||||
<!-- pandoc < 2.0 -->
|
||||
$toc$
|
||||
$endif$
|
||||
</nav>
|
||||
$endif$
|
||||
$body$
|
||||
</div><!-- .container -->
|
||||
</div><!-- .bg-white -->
|
||||
|
||||
<footer class="py-5">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-6 col-sm-3">
|
||||
<a href="$rel-root$">
|
||||
<i class="fas fa-home"></i>
|
||||
Home
|
||||
</a>
|
||||
<h6 class="text-muted mt-3">Get started</h6>
|
||||
<ul class="list-unstyled">
|
||||
<li><a href="https://www.youtube.com/watch?v=x1LFbDQhbso">Google Tech Talk</a></li>
|
||||
<li><a href="http://cloud.grammaticalframework.org/">GF Cloud</a></li>
|
||||
<li>
|
||||
<a href="$rel-root$/doc/tutorial/gf-tutorial.html">Tutorial</a>
|
||||
·
|
||||
<a href="$rel-root$/lib/doc/rgl-tutorial/index.html">RGL Tutorial</a>
|
||||
</li>
|
||||
<li><a href="$rel-root$/doc/gf-video-tutorials.html">Video Tutorials</a></li>
|
||||
<li><a href="$rel-root$/download"><strong>Download GF</strong></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="col-6 col-sm-3">
|
||||
<h6 class="text-muted">Learn more</h6>
|
||||
<ul class="list-unstyled">
|
||||
<li><a href="$rel-root$/gf-book">The GF Book</a></li>
|
||||
<li><a href="$rel-root$/doc/gf-refman.html">Reference Manual</a></li>
|
||||
<li><a href="$rel-root$/doc/gf-shell-reference.html">GF Shell Reference</a></li>
|
||||
<li><a href="http://www.molto-project.eu/sites/default/files/MOLTO_D2.3.pdf">Best Practices</a></li>
|
||||
<li><a href="$rel-root$/lib/doc/synopsis/index.html"><strong>RGL Synopsis</strong></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="col-6 col-sm-3">
|
||||
<h6 class="text-muted">Develop</h6>
|
||||
<ul class="list-unstyled">
|
||||
<li><a href="$rel-root$/doc/gf-developers.html">Developers Guide</a></li>
|
||||
<li><a href="http://hackage.haskell.org/package/gf/docs/PGF.html">PGF library API (Haskell runtime)</a></li>
|
||||
<li><a href="$rel-root$/doc/runtime-api.html">PGF library API (C runtime)</a></li>
|
||||
<li><a href="http://hackage.haskell.org/package/gf/docs/GF.html">GF compiler API</a></li>
|
||||
<li><a href="$rel-root$/doc/gf-editor-modes.html">Text Editor Support</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="col-6 col-sm-3">
|
||||
<h6 class="text-muted">Contribute</h6>
|
||||
<ul class="list-unstyled">
|
||||
<li><a href="http://groups.google.com/group/gf-dev">Mailing List</a></li>
|
||||
<li><a href="https://github.com/GrammaticalFramework/gf-core/issues">Issue Tracker</a></li>
|
||||
<li><a href="$rel-root$/doc/gf-people.html">Authors</a></li>
|
||||
<li><a href="http://school.grammaticalframework.org/2018/">Summer School</a></li>
|
||||
</ul>
|
||||
<h6 class="text-muted">
|
||||
Repositories
|
||||
<i class="fab fa-github ml-1"></i>
|
||||
</h6>
|
||||
<a href="https://github.com/GrammaticalFramework/gf-core">GF</a> ·
|
||||
<a href="https://github.com/GrammaticalFramework/gf-rgl">RGL</a> ·
|
||||
<a href="https://github.com/GrammaticalFramework/gf-contrib">Contributions</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
$for(include-after)$
|
||||
$include-after$
|
||||
$endfor$
|
||||
<script type="text/javascript">
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-7811807-3");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}</script>
|
||||
</body>
|
||||
</html>
|
||||
159
bin/update_html
159
bin/update_html
@@ -1,11 +1,156 @@
|
||||
#!/bin/bash
|
||||
|
||||
### This script finds all .t2t (txt2tags) files and updates the corresponding
|
||||
### .html file, if it is out-of-date.
|
||||
# Generate HTML from txt2tags (.t2t) and Markdown (.md)
|
||||
# Usage:
|
||||
# - update_html
|
||||
# Look for all .t2t and .md files in the current directory and below,
|
||||
# generating the output HTML when the source is newer than the HTML.
|
||||
# - update_html path/to/file.t2t path/to/another.md
|
||||
# Generate HTML for the specified file(s), ignoring modification time.
|
||||
#
|
||||
# Requires:
|
||||
# - txt2tags for .t2t files. Tested with 2.6.
|
||||
# - pandoc for both .t2t and .md files. Tested with 1.16.0.2 and 2.3.1.
|
||||
# - the template file `template.html` in the same directory as this script.
|
||||
#
|
||||
# Tested with Ubuntu 16.04 and macOS Mojave.
|
||||
#
|
||||
# See also clean_html for removing the files generated by this script.
|
||||
|
||||
find . -name '*.t2t' | while read t2t ; do
|
||||
html="${t2t%.t2t}.html"
|
||||
if [ "$t2t" -nt "$html" ] ; then
|
||||
txt2tags -thtml "$t2t"
|
||||
# Path to directory where this script is
|
||||
# https://stackoverflow.com/a/246128/98600
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
|
||||
|
||||
# HTML template
|
||||
template="$DIR/template.html"
|
||||
|
||||
# Render txt2tags into html file
|
||||
# Arguments:
|
||||
# 1. txt2tags source file, e.g. download/index.t2t
|
||||
# 2. html target file, e.g. download/index.html
|
||||
function render_t2t_html {
|
||||
t2t="$1"
|
||||
html="$2"
|
||||
tmp="$2.tmp"
|
||||
relroot="$( dirname $t2t | sed -E 's/^.\///' | sed -E 's/[^/]+/../g' )"
|
||||
|
||||
# First render with txt2tags to handle pre/post processing
|
||||
txt2tags \
|
||||
--target=html \
|
||||
--no-headers \
|
||||
--quiet \
|
||||
--outfile="$tmp" \
|
||||
--infile="$t2t"
|
||||
|
||||
# Replace <A NAME="toc3"></A> with <div id="toc3"></div> so that Pandoc retains it
|
||||
# Do this for both cases since BSD sed doesn't support /i
|
||||
sed -i.bak "s/<a name=\"\(.*\)\"><\/a>/<div id=\"\1\"><\/div>/" "$tmp"
|
||||
sed -i.bak "s/<A NAME=\"\(.*\)\"><\/A>/<div id=\"\1\"><\/div>/" "$tmp"
|
||||
rm -f "$tmp.bak"
|
||||
|
||||
# Capture first 3 lines of t2t file: title, author, date
|
||||
# Documentation here: https://txt2tags.org/userguide/headerarea
|
||||
l1=$(head -n 1 "$t2t")
|
||||
l2=$(tail -n+2 "$t2t" | head -n 1)
|
||||
l3=$(tail -n+3 "$t2t" | head -n 1)
|
||||
title=
|
||||
author=
|
||||
date=
|
||||
if [ -n "$l1" ] ; then
|
||||
title="$l1"
|
||||
if [ -n "$l2" ] ; then author="$l2" ; fi
|
||||
if [ -n "$l3" ] ; then date="$l3" ; fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Run txt2tag's HTML through Pandoc for cleanup
|
||||
pandoc \
|
||||
--from=html \
|
||||
--to=html5 \
|
||||
--standalone \
|
||||
--template="$template" \
|
||||
--variable="lang:en" \
|
||||
--variable="rel-root:$relroot" \
|
||||
--metadata="title:$title" \
|
||||
--metadata="author:$author" \
|
||||
--metadata="date:$date" \
|
||||
"$tmp" \
|
||||
--output="$html"
|
||||
rm -f "$tmp"
|
||||
|
||||
# Final post-processing
|
||||
if [ -f "$html" ] ; then
|
||||
sed -i.bak "s/<table/<table class=\"table\"/" "$html" && rm "$html.bak"
|
||||
echo "$html"
|
||||
fi
|
||||
}
|
||||
|
||||
# Render markdown into html file
|
||||
# Arguments:
|
||||
# 1. markdown source file, e.g. download/index.md
|
||||
# 2. html target file, e.g. download/index.html
|
||||
function render_md_html {
|
||||
md="$1"
|
||||
html="$2"
|
||||
relroot="$( dirname $md | sed -E 's/^.\///' | sed -E 's/[^/]+/../g' )"
|
||||
|
||||
# Look for `show-toc: true` in metadata (first ten lines of file)
|
||||
if head -n 10 "$md" | grep --quiet 'show-toc: true' ; then
|
||||
tocflag='--table-of-contents'
|
||||
else
|
||||
tocflag=''
|
||||
fi
|
||||
|
||||
pandoc \
|
||||
--from=markdown \
|
||||
--to=html5 \
|
||||
--standalone \
|
||||
$tocflag \
|
||||
--template="$template" \
|
||||
--variable="lang:en" \
|
||||
--variable="rel-root:$relroot" \
|
||||
"$md" \
|
||||
--output="$html"
|
||||
|
||||
# Final post-processing
|
||||
if [ -f "$html" ] ; then
|
||||
# add "table" class to tables
|
||||
sed -i.bak "s/<table/<table class=\"table\"/" "$html"
|
||||
# rewrite anchors that Pandoc 1.16 ignores: [content]{#anchor} -> <span id="anchor">content</span>
|
||||
sed -i.bak -E "s/\[(.*)\]\{#(.+)\}/<span id=\"\2\">\1<\/span>/" "$html"
|
||||
rm -f "$html.bak"
|
||||
echo "$html"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main entry point
|
||||
# Script can be run in one of two modes:
|
||||
if [ $# -gt 0 ] ; then
|
||||
# Render specific file(s) from args, ignoring dates
|
||||
for file in "$@" ; do
|
||||
ext="${file##*.}"
|
||||
html="${file%.$ext}.html"
|
||||
case $ext in
|
||||
"md")
|
||||
render_md_html "$file" "$html"
|
||||
;;
|
||||
"t2t")
|
||||
render_t2t_html "$file" "$html"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
else
|
||||
# Render all files found in cwd and deeper if source is newer
|
||||
find . -name '*.t2t' | while read file ; do
|
||||
html="${file%.t2t}.html"
|
||||
if [ "$file" -nt "$html" ] || [ "$template" -nt "$html" ] ; then
|
||||
render_t2t_html "$file" "$html"
|
||||
fi
|
||||
done
|
||||
find . -name '*.md' | while read file ; do
|
||||
if [[ "$file" == *"README.md" ]] || [[ "$file" == *"RELEASE.md" ]] ; then continue ; fi
|
||||
html="${file%.md}.html"
|
||||
if [ "$file" -nt "$html" ] || [ "$template" -nt "$html" ] ; then
|
||||
render_md_html "$file" "$html"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
30
debian/changelog
vendored
30
debian/changelog
vendored
@@ -1,3 +1,33 @@
|
||||
gf (3.11) bionic focal; urgency=low
|
||||
|
||||
* GF 3.11
|
||||
|
||||
-- Inari Listenmaa <inari@digitalgrammars.com> Sun, 25 Jul 2021 10:27:40 +0800
|
||||
|
||||
gf (3.10.4-1) xenial bionic cosmic; urgency=low
|
||||
|
||||
* GF 3.10.4
|
||||
|
||||
-- Thomas Hallgren <hallgren@chalmers.se> Fri, 18 Nov 2019 15:00:00 +0100
|
||||
|
||||
gf (3.10.3-1) xenial bionic cosmic; urgency=low
|
||||
|
||||
* GF 3.10.3
|
||||
|
||||
-- Thomas Hallgren <hallgren@chalmers.se> Fri, 5 Mar 2019 19:30:00 +0100
|
||||
|
||||
gf (3.10-2) xenial bionic cosmic; urgency=low
|
||||
|
||||
* GF 3.10
|
||||
|
||||
-- Thomas Hallgren <hallgren@chalmers.se> Fri, 5 Mar 2019 16:00:00 +0100
|
||||
|
||||
gf (3.10-1) xenial bionic cosmic; urgency=low
|
||||
|
||||
* GF 3.10
|
||||
|
||||
-- Thomas Hallgren <hallgren@chalmers.se> Fri, 2 Dec 2018 15:00:00 +0100
|
||||
|
||||
gf (3.9-1) vivid xenial zesty; urgency=low
|
||||
|
||||
* GF 3.9
|
||||
|
||||
4
debian/control
vendored
4
debian/control
vendored
@@ -3,14 +3,14 @@ Section: devel
|
||||
Priority: optional
|
||||
Maintainer: Thomas Hallgren <hallgren@chalmers.se>
|
||||
Standards-Version: 3.9.2
|
||||
Build-Depends: debhelper (>= 5), haskell-platform (>= 2011.2.0.1), libghc-haskeline-dev, libghc-mtl-dev, libghc-json-dev, autoconf, automake, libtool-bin, python-dev, java-sdk, txt2tags
|
||||
Build-Depends: debhelper (>= 5), haskell-platform (>= 2011.2.0.1), libghc-haskeline-dev, libghc-mtl-dev, libghc-json-dev, autoconf, automake, libtool-bin, python-dev, java-sdk
|
||||
Homepage: http://www.grammaticalframework.org/
|
||||
|
||||
Package: gf
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}
|
||||
Description: Tools for GF, a grammar formalism based on type theory
|
||||
Grammatical Framework (GF) is a grammar formalism based on type theory.
|
||||
Grammatical Framework (GF) is a grammar formalism based on type theory.
|
||||
It consists of a special-purpose programming language,
|
||||
a compiler of the language, and a generic grammar processor.
|
||||
.
|
||||
|
||||
39
debian/rules
vendored
Normal file → Executable file
39
debian/rules
vendored
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
%:
|
||||
%:
|
||||
+dh $@
|
||||
|
||||
#dh_shlibdeps has a problem finding which package some of the Haskell
|
||||
@@ -13,12 +13,27 @@
|
||||
override_dh_shlibdeps:
|
||||
dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
|
||||
|
||||
override_dh_auto_configure:
|
||||
cd src/runtime/c && bash setup.sh configure --prefix=/usr
|
||||
cd src/runtime/c && bash setup.sh build
|
||||
cabal v1-update
|
||||
cabal v1-install --only-dependencies
|
||||
cabal v1-configure --prefix=/usr -fserver -fc-runtime --extra-lib-dirs=$(CURDIR)/src/runtime/c/.libs --extra-include-dirs=$(CURDIR)/src/runtime/c
|
||||
|
||||
SET_LDL=LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(CURDIR)/src/runtime/c/.libs
|
||||
|
||||
override_dh_auto_build:
|
||||
cd src/runtime/python && EXTRA_INCLUDE_DIRS=$(CURDIR)/src/runtime/c EXTRA_LIB_DIRS=$(CURDIR)/src/runtime/c/.libs python setup.py build
|
||||
cd src/runtime/java && make CFLAGS="-I$(CURDIR)/src/runtime/c -L$(CURDIR)/src/runtime/c/.libs" INSTALL_PATH=/usr/lib
|
||||
echo LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(CURDIR)/src/runtime/c/.libs
|
||||
LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(CURDIR)/src/runtime/c/.libs cabal build
|
||||
make html
|
||||
cd src/runtime/java && make CFLAGS="-I$(CURDIR)/src/runtime/c -L$(CURDIR)/src/runtime/c/.libs" INSTALL_PATH=/usr
|
||||
echo $(SET_LDL)
|
||||
-$(SET_LDL) cabal v1-build
|
||||
|
||||
override_dh_auto_install:
|
||||
$(SET_LDL) cabal v1-copy --destdir=$(CURDIR)/debian/gf
|
||||
cd src/runtime/c && bash setup.sh copy prefix=$(CURDIR)/debian/gf/usr
|
||||
cd src/runtime/python && python setup.py install --prefix=$(CURDIR)/debian/gf/usr
|
||||
cd src/runtime/java && make INSTALL_PATH=$(CURDIR)/debian/gf/usr install
|
||||
D="`find debian/gf -name site-packages`" && [ -n "$$D" ] && cd $$D && cd .. && mv site-packages dist-packages
|
||||
|
||||
override_dh_auto_clean:
|
||||
rm -fr dist/build
|
||||
@@ -26,20 +41,6 @@ override_dh_auto_clean:
|
||||
-cd src/runtime/java && make clean
|
||||
-cd src/runtime/c && make clean
|
||||
|
||||
override_dh_auto_configure:
|
||||
cd src/runtime/c && bash setup.sh configure --prefix=/usr
|
||||
cd src/runtime/c && bash setup.sh build
|
||||
cabal update
|
||||
cabal install --only-dependencies
|
||||
cabal configure --prefix=/usr -fserver -fc-runtime --extra-lib-dirs=$(CURDIR)/src/runtime/c/.libs --extra-include-dirs=$(CURDIR)/src/runtime/c
|
||||
|
||||
override_dh_auto_install:
|
||||
LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(CURDIR)/src/runtime/c/.libs cabal copy --destdir=$(CURDIR)/debian/gf
|
||||
cd src/runtime/c && bash setup.sh copy prefix=$(CURDIR)/debian/gf/usr
|
||||
cd src/runtime/python && python setup.py install --prefix=$(CURDIR)/debian/gf/usr
|
||||
cd src/runtime/java && make INSTALL_PATH=$(CURDIR)/debian/gf/usr/lib install
|
||||
D="`find debian/gf -name site-packages`" && [ -n "$$D" ] && cd $$D && cd .. && mv site-packages dist-packages
|
||||
|
||||
override_dh_auto_test:
|
||||
ifneq (nocheck,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
|
||||
true
|
||||
|
||||
15
doc/Makefile
15
doc/Makefile
@@ -1,18 +1,3 @@
|
||||
resource:
|
||||
gfdoc -txt2 ../lib/resource-1.0/abstract/*.gf
|
||||
gfdoc -txt2 ../lib/resource-1.0/*/Paradigms*.gf
|
||||
txt2tags --toc resource.txt
|
||||
# cat resource-preamble resource.tex >final-resource.tex
|
||||
sed -i 's/\\docum/%\\docum/g' resource.tex
|
||||
sed -i 's/ion\*{/ion{/g' resource.tex
|
||||
sed -i 's/\\paragraph{}//g' resource.tex
|
||||
sed -i 's/}\\\\/}/g' resource.tex
|
||||
cat resource-preamble resource.tex >resource.tmp
|
||||
mv resource.tmp resource.tex
|
||||
latex resource.tex
|
||||
latex resource.tex
|
||||
dvipdf resource.dvi
|
||||
|
||||
gf-help-full.txt::
|
||||
{ echo ; echo ; echo ; } > $@
|
||||
echo help -full -t2t | gf -run >> $@
|
||||
|
||||
551
doc/error-messages.txt
Normal file
551
doc/error-messages.txt
Normal file
@@ -0,0 +1,551 @@
|
||||
Compiler.hs
|
||||
mainGFC :: Options -> [FilePath] -> IO ()
|
||||
_ | null fs -> fail $ "No input files."
|
||||
_ | all (extensionIs ".pgf") fs -> unionPGFFiles opts fs
|
||||
_ -> fail $ "Don't know what to do with these input files: " ++ unwords fs)
|
||||
|
||||
|
||||
----------------------------------------
|
||||
Compile.hs
|
||||
|
||||
compileModule
|
||||
case length file1s of
|
||||
0 -> raise (render ("Unable to find: " $$ nest 2 candidates))
|
||||
1 -> do return $ head file1s
|
||||
_ -> do putIfVerb opts1 ("matched multiple candidates: " +++ show file1s)
|
||||
return $ head file1s
|
||||
else raise (render ("File" <+> file <+> "does not exist"))
|
||||
|
||||
---------------------------------------
|
||||
Grammar.Lexer.x
|
||||
token :: P Token
|
||||
AlexError (AI pos _ _) -> PFailed pos "lexical error"
|
||||
|
||||
|
||||
---------------------------------------
|
||||
Grammar.Parser.y
|
||||
|
||||
happyError = fail "syntax error"
|
||||
|
||||
tryLoc (c,mty,Just e) = return (c,(mty,e))
|
||||
tryLoc (c,_ ,_ ) = fail ("local definition of" +++ showIdent c +++ "without value")
|
||||
|
||||
mkR [] = return $ RecType [] --- empty record always interpreted as record type
|
||||
mkR fs@(f:_) =
|
||||
case f of
|
||||
(lab,Just ty,Nothing) -> mapM tryRT fs >>= return . RecType
|
||||
_ -> mapM tryR fs >>= return . R
|
||||
where
|
||||
tryRT (lab,Just ty,Nothing) = return (ident2label lab,ty)
|
||||
tryRT (lab,_ ,_ ) = fail $ "illegal record type field" +++ showIdent lab --- manifest fields ?!
|
||||
|
||||
tryR (lab,mty,Just t) = return (ident2label lab,(mty,t))
|
||||
tryR (lab,_ ,_ ) = fail $ "illegal record field" +++ showIdent lab
|
||||
|
||||
|
||||
---------------------------------------
|
||||
ModDeps.hs
|
||||
|
||||
mkSourceGrammar :: [SourceModule] -> Err SourceGrammar
|
||||
deplist <- either
|
||||
return
|
||||
(\ms -> Bad $ "circular modules" +++ unwords (map show ms)) $
|
||||
|
||||
|
||||
checkUniqueImportNames :: [Ident] -> SourceModInfo -> Err ()
|
||||
test ms = testErr (all (`notElem` ns) ms)
|
||||
("import names clashing with module names among" +++ unwords (map prt ms))
|
||||
|
||||
|
||||
moduleDeps :: [SourceModule] -> Err Dependencies
|
||||
deps (c,m) = errIn ("checking dependencies of module" +++ prt c) $ case mtype m of
|
||||
MTConcrete a -> do
|
||||
am <- lookupModuleType gr a
|
||||
testErr (mtype am == MTAbstract) "the of-module is not an abstract syntax"
|
||||
|
||||
testErr (all (compatMType ety . mtype) ests) "inappropriate extension module type"
|
||||
|
||||
|
||||
---------------------------------------
|
||||
Update.hs
|
||||
|
||||
buildAnyTree
|
||||
Just i -> case unifyAnyInfo m i j of
|
||||
Ok k -> go (Map.insert c k map) is
|
||||
Bad _ -> fail $ render ("conflicting information in module"<+>m $$
|
||||
nest 4 (ppJudgement Qualified (c,i)) $$
|
||||
"and" $+$
|
||||
nest 4 (ppJudgement Qualified (c,j)))
|
||||
extendModule
|
||||
unless (sameMType (mtype m) (mtype mo))
|
||||
(checkError ("illegal extension type to module" <+> name))
|
||||
|
||||
rebuildModule
|
||||
unless (null is || mstatus mi == MSIncomplete)
|
||||
(checkError ("module" <+> i <+>
|
||||
"has open interfaces and must therefore be declared incomplete"))
|
||||
|
||||
unless (isModRes m1)
|
||||
(checkError ("interface expected instead of" <+> i0))
|
||||
js' <- extendMod gr False ((i0,m1), isInherited mincl) i (jments mi)
|
||||
|
||||
unless (stat' == MSComplete || stat == MSIncomplete)
|
||||
(checkError ("module" <+> i <+> "remains incomplete"))
|
||||
|
||||
|
||||
extendMod
|
||||
checkError ("cannot unify the information" $$
|
||||
nest 4 (ppJudgement Qualified (c,i)) $$
|
||||
"in module" <+> name <+> "with" $$
|
||||
nest 4 (ppJudgement Qualified (c,j)) $$
|
||||
"in module" <+> base)
|
||||
|
||||
unifyAnyInfo
|
||||
(ResValue (L l1 t1), ResValue (L l2 t2))
|
||||
| t1==t2 -> return (ResValue (L l1 t1))
|
||||
| otherwise -> fail ""
|
||||
|
||||
(AnyInd b1 m1, AnyInd b2 m2) -> do
|
||||
testErr (b1 == b2) $ "indirection status"
|
||||
testErr (m1 == m2) $ "different sources of indirection"
|
||||
|
||||
unifAbsDefs _ _ = fail ""
|
||||
|
||||
----------------------------------
|
||||
|
||||
Rename.hs
|
||||
|
||||
renameIdentTerm'
|
||||
_ -> case lookupTreeManyAll showIdent opens c of
|
||||
[f] -> return (f c)
|
||||
[] -> alt c ("constant not found:" <+> c $$
|
||||
"given" <+> fsep (punctuate ',' (map fst qualifs)))
|
||||
|
||||
ts@(t:_) -> do checkWarn ("atomic term" <+> ppTerm Qualified 0 t0 $$
|
||||
"conflict" <+> hsep (punctuate ',' (map (ppTerm Qualified 0) ts)) $$
|
||||
"given" <+> fsep (punctuate ',' (map fst qualifs)))
|
||||
return t
|
||||
|
||||
renameInfo
|
||||
renLoc ren (L loc x) =
|
||||
checkInModule cwd mi loc ("Happened in the renaming of" <+> i) $ do
|
||||
|
||||
renameTerm
|
||||
| otherwise -> checks [ renid' (Q (MN r,label2ident l)) -- .. and qualified expression second.
|
||||
, renid' t >>= \t -> return (P t l) -- try as a constant at the end
|
||||
, checkError ("unknown qualified constant" <+> trm)
|
||||
]
|
||||
|
||||
renamePattern env patt =
|
||||
do r@(p',vs) <- renp patt
|
||||
let dupl = vs \\ nub vs
|
||||
unless (null dupl) $ checkError (hang ("[C.4.13] Pattern is not linear:") 4
|
||||
patt)
|
||||
return r
|
||||
|
||||
case c' of
|
||||
Q d -> renp $ PM d
|
||||
_ -> checkError ("unresolved pattern" <+> patt)
|
||||
|
||||
Q _ -> checkError ("data constructor expected but" <+> ppTerm Qualified 0 c' <+> "is found instead")
|
||||
_ -> checkError ("unresolved data constructor" <+> ppTerm Qualified 0 c')
|
||||
|
||||
PM c -> do
|
||||
x <- renid (Q c)
|
||||
c' <- case x of
|
||||
(Q c') -> return c'
|
||||
_ -> checkError ("not a pattern macro" <+> ppPatt Qualified 0 patt)
|
||||
|
||||
PV x -> checks [ renid' (Vr x) >>= \t' -> case t' of
|
||||
QC c -> return (PP c [],[])
|
||||
_ -> checkError (pp "not a constructor")
|
||||
, return (patt, [x])
|
||||
|
||||
|
||||
|
||||
-----------------------------------
|
||||
CheckGrammar.hs
|
||||
|
||||
checkRestrictedInheritance :: FilePath -> SourceGrammar -> SourceModule -> Check ()
|
||||
let illegals = [(f,is) |
|
||||
(f,cs) <- allDeps, incld f, let is = filter illegal cs, not (null is)]
|
||||
case illegals of
|
||||
[] -> return ()
|
||||
cs -> checkWarn ("In inherited module" <+> i <> ", dependence of excluded constants:" $$
|
||||
nest 2 (vcat [f <+> "on" <+> fsep is | (f,is) <- cs]))
|
||||
|
||||
checkCompleteGrammar :: Options -> FilePath -> Grammar -> Module -> Module -> Check Module
|
||||
case info of
|
||||
CncCat (Just (L loc (RecType []))) _ _ _ _ -> return (foldr (\_ -> Abs Explicit identW) (R []) cxt)
|
||||
_ -> Bad "no def lin"
|
||||
|
||||
where noLinOf c = checkWarn ("no linearization of" <+> c)
|
||||
|
||||
Ok (CncCat Nothing md mr mp mpmcfg) -> do
|
||||
checkWarn ("no linearization type for" <+> c <> ", inserting default {s : Str}")
|
||||
return $ updateTree (c,CncCat (Just (L NoLoc defLinType)) md mr mp mpmcfg) js
|
||||
_ -> do
|
||||
checkWarn ("no linearization type for" <+> c <> ", inserting default {s : Str}")
|
||||
|
||||
_ -> do checkWarn ("function" <+> c <+> "is not in abstract")
|
||||
|
||||
Ok (_,AbsFun {}) ->
|
||||
checkError ("lincat:"<+>c<+>"is a fun, not a cat")
|
||||
-}
|
||||
_ -> do checkWarn ("category" <+> c <+> "is not in abstract")
|
||||
|
||||
checkInfo :: Options -> FilePath -> SourceGrammar -> SourceModule -> Ident -> Info -> Check Info
|
||||
(Just (L loct ty), Nothing) -> do
|
||||
chIn loct "operation" $
|
||||
checkError (pp "No definition given to the operation")
|
||||
|
||||
ResOverload os tysts -> chIn NoLoc "overloading" $ do
|
||||
|
||||
checkUniq xss = case xss of
|
||||
x:y:xs
|
||||
| x == y -> checkError $ "ambiguous for type" <+>
|
||||
ppType (mkFunType (tail x) (head x))
|
||||
|
||||
compAbsTyp g t = case t of
|
||||
Vr x -> maybe (checkError ("no value given to variable" <+> x)) return $ lookup x g
|
||||
|
||||
checkReservedId x =
|
||||
when (isReservedWord x) $
|
||||
checkWarn ("reserved word used as identifier:" <+> x)
|
||||
|
||||
|
||||
--------------------------------
|
||||
TypeCheck/Abstract.hs
|
||||
|
||||
grammar2theory :: SourceGrammar -> Theory
|
||||
Bad s -> case lookupCatContext gr m f of
|
||||
Ok cont -> return $ cont2val cont
|
||||
_ -> Bad s
|
||||
|
||||
|
||||
--------------------------------
|
||||
TypeCheck/ConcreteNew.hs
|
||||
-- Concrete.hs has all its code commented out
|
||||
|
||||
|
||||
--------------------------------
|
||||
TypeCheck/RConcrete.hs
|
||||
-- seems to be used more than ConcreteNew
|
||||
|
||||
computeLType :: SourceGrammar -> Context -> Type -> Check Type
|
||||
AdHocOverload ts -> do
|
||||
over <- getOverload gr g (Just typeType) t
|
||||
case over of
|
||||
Just (tr,_) -> return tr
|
||||
_ -> checkError ("unresolved overloading of constants" <+> ppTerm Qualified 0 t)
|
||||
|
||||
inferLType :: SourceGrammar -> Context -> Term -> Check (Term, Type)
|
||||
Q (m,ident) | isPredef m -> termWith trm $ case typPredefined ident of
|
||||
Nothing -> checkError ("unknown in Predef:" <+> ident)
|
||||
|
||||
Q ident -> checks [
|
||||
checkError ("cannot infer type of constant" <+> ppTerm Unqualified 0 trm)
|
||||
]
|
||||
|
||||
QC ident -> checks [
|
||||
checkError ("cannot infer type of canonical constant" <+> ppTerm Unqualified 0 trm)
|
||||
]
|
||||
|
||||
Vr ident -> termWith trm $ checkLookup ident g
|
||||
|
||||
AdHocOverload ts -> do
|
||||
_ -> checkError ("unresolved overloading of constants" <+> ppTerm Qualified 0 trm)
|
||||
|
||||
App f a -> do
|
||||
case fty' of
|
||||
Prod bt z arg val -> do
|
||||
_ -> checkError ("A function type is expected for" <+> ppTerm Unqualified 0 f <+> "instead of type" <+> ppType fty)
|
||||
|
||||
S f x -> do
|
||||
_ -> checkError ("table lintype expected for the table in" $$ nest 2 (ppTerm Unqualified 0 trm))
|
||||
|
||||
P t i -> do
|
||||
Nothing -> checkError ("unknown label" <+> i <+> "in" $$ nest 2 (ppTerm Unqualified 0 ty'))
|
||||
_ -> checkError ("record type expected for:" <+> ppTerm Unqualified 0 t $$
|
||||
" instead of the inferred:" <+> ppTerm Unqualified 0 ty')
|
||||
|
||||
R r -> do
|
||||
checkCond ("cannot infer type of record" $$ nest 2 (ppTerm Unqualified 0 trm)) (length ts == length fsts)
|
||||
|
||||
T ti pts -> do -- tries to guess: good in oper type inference
|
||||
[] -> checkError ("cannot infer table type of" <+> ppTerm Unqualified 0 trm)
|
||||
|
||||
---- hack from Rename.identRenameTerm, to live with files with naming conflicts 18/6/2007
|
||||
Strs (Cn c : ts) | c == cConflict -> do
|
||||
checkWarn ("unresolved constant, could be any of" <+> hcat (map (ppTerm Unqualified 0) ts))
|
||||
|
||||
ExtR r s -> do
|
||||
case (rT', sT') of
|
||||
(RecType rs, RecType ss) -> do
|
||||
_ -> checkError ("records or record types expected in" <+> ppTerm Unqualified 0 trm)
|
||||
|
||||
_ -> checkError ("cannot infer lintype of" <+> ppTerm Unqualified 0 trm)
|
||||
|
||||
|
||||
getOverload :: SourceGrammar -> Context -> Maybe Type -> Term -> Check (Maybe (Term,Type))
|
||||
matchOverload f typs ttys = do
|
||||
checkWarn $ "ignoring lock fields in resolving" <+> ppTerm Unqualified 0 ot $$
|
||||
"for" $$
|
||||
nest 2 (showTypes tys) $$
|
||||
"using" $$
|
||||
nest 2 (showTypes pre)
|
||||
([],[]) -> do
|
||||
checkError $ "no overload instance of" <+> ppTerm Unqualified 0 f $$
|
||||
"for" $$
|
||||
nest 2 stysError $$
|
||||
"among" $$
|
||||
nest 2 (vcat stypsError) $$
|
||||
maybe empty (\x -> "with value type" <+> ppType x) mt
|
||||
([],[(val,fun)]) -> do
|
||||
checkWarn ("ignoring lock fields in resolving" <+> ppTerm Unqualified 0 ot)
|
||||
(nps1,nps2) -> do
|
||||
checkWarn $ "ambiguous overloading of" <+> ppTerm Unqualified 0 f <+>
|
||||
---- "with argument types" <+> hsep (map (ppTerm Qualified 0) tys) $$
|
||||
"resolved by selecting the first of the alternatives" $$
|
||||
nest 2 (vcat [ppTerm Qualified 0 fun | (_,ty,fun) <- vfs1 ++ if null vfs1 then vfs2 else []])
|
||||
case [(mkApp fun tts,val) | (val,fun) <- nps1 ++ nps2] of
|
||||
[] -> checkError $ "no alternatives left when resolving" <+> ppTerm Unqualified 0 f
|
||||
|
||||
checkLType :: SourceGrammar -> Context -> Term -> Type -> Check (Term, Type)
|
||||
Abs bt x c -> do
|
||||
case typ of
|
||||
Prod bt' z a b -> do
|
||||
_ -> checkError $ "function type expected instead of" <+> ppType typ
|
||||
AdHocOverload ts -> do
|
||||
_ -> checkError ("unresolved overloading of constants" <+> ppTerm Qualified 0 trm)
|
||||
T _ [] ->
|
||||
checkError ("found empty table in type" <+> ppTerm Unqualified 0 typ)
|
||||
T _ cs -> case typ of
|
||||
else checkWarn ("patterns never reached:" $$
|
||||
nest 2 (vcat (map (ppPatt Unqualified 0) ps)))
|
||||
_ -> checkError $ "table type expected for table instead of" $$ nest 2 (ppType typ)
|
||||
V arg0 vs ->
|
||||
if length vs1 == length vs
|
||||
then return ()
|
||||
else checkError $ "wrong number of values in table" <+> ppTerm Unqualified 0 trm
|
||||
|
||||
R r -> case typ of --- why needed? because inference may be too difficult
|
||||
RecType rr -> do
|
||||
_ -> checkError ("record type expected in type checking instead of" $$ nest 2 (ppTerm Unqualified 0 typ))
|
||||
|
||||
ExtR r s -> case typ of
|
||||
case trm' of
|
||||
RecType _ -> termWith trm' $ return typeType
|
||||
ExtR (Vr _) (RecType _) -> termWith trm' $ return typeType
|
||||
-- ext t = t ** ...
|
||||
_ -> checkError ("invalid record type extension" <+> nest 2 (ppTerm Unqualified 0 trm))
|
||||
|
||||
case typ2 of
|
||||
RecType ss -> return $ map fst ss
|
||||
_ -> checkError ("cannot get labels from" $$ nest 2 (ppTerm Unqualified 0 typ2))
|
||||
_ -> checkError ("record extension not meaningful for" <+> ppTerm Unqualified 0 typ)
|
||||
|
||||
S tab arg -> checks [ do
|
||||
_ -> checkError ("table type expected for applied table instead of" <+> ppType ty')
|
||||
|
||||
_ -> do
|
||||
(trm',ty') <- inferLType gr g trm
|
||||
termWith trm' $ checkEqLType gr g typ ty' trm'
|
||||
|
||||
checkM rms (l,ty) = case lookup l rms of
|
||||
_ -> checkError $
|
||||
if isLockLabel l
|
||||
then let cat = drop 5 (showIdent (label2ident l))
|
||||
in ppTerm Unqualified 0 (R rms) <+> "is not in the lincat of" <+> cat <>
|
||||
"; try wrapping it with lin" <+> cat
|
||||
else "cannot find value for label" <+> l <+> "in" <+> ppTerm Unqualified 0 (R rms)
|
||||
|
||||
checkEqLType :: SourceGrammar -> Context -> Type -> Type -> Term -> Check Type
|
||||
False -> checkError $ s <+> "type of" <+> ppTerm Unqualified 0 trm $$
|
||||
"expected:" <+> ppTerm Qualified 0 t $$ -- ppqType t u $$
|
||||
"inferred:" <+> ppTerm Qualified 0 u -- ppqType u t
|
||||
|
||||
checkIfEqLType :: SourceGrammar -> Context -> Type -> Type -> Term -> Check (Bool,Type,Type,String)
|
||||
Ok lo -> do
|
||||
checkWarn $ "missing lock field" <+> fsep lo
|
||||
|
||||
missingLock g t u = case (t,u) of
|
||||
_:_ -> Bad $ render ("missing record fields:" <+> fsep (punctuate ',' (others)))
|
||||
|
||||
|
||||
|
||||
pattContext :: SourceGrammar -> Context -> Type -> Patt -> Check Context
|
||||
checkCond ("wrong number of arguments for constructor in" <+> ppPatt Unqualified 0 p)
|
||||
(length cont == length ps)
|
||||
PR r -> do
|
||||
_ -> checkError ("record type expected for pattern instead of" <+> ppTerm Unqualified 0 typ')
|
||||
|
||||
PAlt p' q -> do
|
||||
g1 <- pattContext env g typ p'
|
||||
g2 <- pattContext env g typ q
|
||||
let pts = nub ([x | pt@(_,x,_) <- g1, notElem pt g2] ++ [x | pt@(_,x,_) <- g2, notElem pt g1])
|
||||
checkCond
|
||||
("incompatible bindings of" <+>
|
||||
fsep pts <+>
|
||||
"in pattern alterantives" <+> ppPatt Unqualified 0 p) (null pts)
|
||||
return g1 -- must be g1 == g2
|
||||
|
||||
noBind typ p' = do
|
||||
co <- pattContext env g typ p'
|
||||
if not (null co)
|
||||
then checkWarn ("no variable bound inside pattern" <+> ppPatt Unqualified 0 p)
|
||||
>> return []
|
||||
else return []
|
||||
|
||||
checkLookup :: Ident -> Context -> Check Type -- used for looking up Vr x type in context
|
||||
[] -> checkError ("unknown variable" <+> x)
|
||||
|
||||
|
||||
|
||||
-------------------------------
|
||||
Grammar/Lookup.hs
|
||||
|
||||
lookupIdent :: ErrorMonad m => Ident -> BinTree Ident b -> m b
|
||||
Bad _ -> raise ("unknown identifier" +++ showIdent c)
|
||||
|
||||
lookupResDefLoc
|
||||
_ -> raise $ render (c <+> "is not defined in resource" <+> m)
|
||||
|
||||
lookupResType :: ErrorMonad m => Grammar -> QIdent -> m Type
|
||||
_ -> raise $ render (c <+> "has no type defined in resource" <+> m)
|
||||
|
||||
lookupOverloadTypes :: ErrorMonad m => Grammar -> QIdent -> m [(Term,Type)]
|
||||
_ -> raise $ render (c <+> "has no types defined in resource" <+> m)
|
||||
|
||||
lookupOverload :: ErrorMonad m => Grammar -> QIdent -> m [([Type],(Type,Term))]
|
||||
_ -> raise $ render (c <+> "is not an overloaded operation")
|
||||
|
||||
|
||||
lookupParamValues :: ErrorMonad m => Grammar -> QIdent -> m [Term]
|
||||
case info of
|
||||
ResParam _ (Just pvs) -> return pvs
|
||||
_ -> raise $ render (ppQIdent Qualified c <+> "has no parameter values defined")
|
||||
|
||||
|
||||
allParamValues :: ErrorMonad m => Grammar -> Type -> m [Term]
|
||||
_ -> raise (render ("cannot find parameter values for" <+> ptyp))
|
||||
|
||||
|
||||
lookupFunType :: ErrorMonad m => Grammar -> ModuleName -> Ident -> m Type
|
||||
_ -> raise (render ("cannot find type of" <+> c))
|
||||
|
||||
lookupCatContext :: ErrorMonad m => Grammar -> ModuleName -> Ident -> m Context
|
||||
_ -> raise (render ("unknown category" <+> c))
|
||||
|
||||
|
||||
-------------------------
|
||||
PatternMatch.hs
|
||||
|
||||
matchPattern :: ErrorMonad m => [(Patt,rhs)] -> Term -> m (rhs, Substitution)
|
||||
if not (isInConstantForm term)
|
||||
then raise (render ("variables occur in" <+> pp term))
|
||||
|
||||
findMatch :: ErrorMonad m => [([Patt],rhs)] -> [Term] -> m (rhs, Substitution)
|
||||
[] -> raise (render ("no applicable case for" <+> hsep (punctuate ',' terms)))
|
||||
(patts,_):_ | length patts /= length terms ->
|
||||
raise (render ("wrong number of args for patterns :" <+> hsep patts <+>
|
||||
"cannot take" <+> hsep terms))
|
||||
|
||||
tryMatch :: (Patt, Term) -> Err [(Ident, Term)]
|
||||
(PNeg p',_) -> case tryMatch (p',t) of
|
||||
Bad _ -> return []
|
||||
_ -> raise (render ("no match with negative pattern" <+> p))
|
||||
|
||||
|
||||
---------------------------------------------
|
||||
Compile.Optimize.hs
|
||||
|
||||
mkLinDefault :: SourceGrammar -> Type -> Err Term
|
||||
_ -> Bad (render ("no parameter values given to type" <+> ppQIdent Qualified p))
|
||||
_ -> Bad (render ("linearization type field cannot be" <+> typ))
|
||||
|
||||
mkLinReference :: SourceGrammar -> Type -> Err Term
|
||||
[] -> Bad "no string"
|
||||
|
||||
|
||||
---------------------------------------------
|
||||
Compile.Compute.Concrete.hs
|
||||
|
||||
nfx env@(GE _ _ _ loc) t = do
|
||||
Left i -> fail ("variable #"++show i++" is out of scope")
|
||||
|
||||
var :: CompleteEnv -> Ident -> Err OpenValue
|
||||
var env x = maybe unbound pick' (elemIndex x (local env))
|
||||
where
|
||||
unbound = fail ("Unknown variable: "++showIdent x)
|
||||
pick' i = return $ \ vs -> maybe (err i vs) ok (pick i vs)
|
||||
err i vs = bug $ "Stack problem: "++showIdent x++": "
|
||||
++unwords (map showIdent (local env))
|
||||
++" => "++show (i,length vs)
|
||||
|
||||
resource env (m,c) =
|
||||
where e = fail $ "Not found: "++render m++"."++showIdent c
|
||||
|
||||
extR t vv =
|
||||
(VRecType rs1, VRecType rs2) ->
|
||||
case intersect (map fst rs1) (map fst rs2) of
|
||||
[] -> VRecType (rs1 ++ rs2)
|
||||
ls -> error $ "clash"<+>show ls
|
||||
(v1,v2) -> error $ "not records" $$ show v1 $$ show v2
|
||||
where
|
||||
error explain = ppbug $ "The term" <+> t
|
||||
<+> "is not reducible" $$ explain
|
||||
|
||||
glue env (v1,v2) = glu v1 v2
|
||||
ppL loc (hang "unsupported token gluing:" 4
|
||||
(Glue (vt v1) (vt v2)))
|
||||
|
||||
strsFromValue :: Value -> Err [Str]
|
||||
_ -> fail ("cannot get Str from value " ++ show t)
|
||||
|
||||
match loc cs v =
|
||||
case value2term loc [] v of
|
||||
Left i -> bad ("variable #"++show i++" is out of scope")
|
||||
Right t -> err bad return (matchPattern cs t)
|
||||
where
|
||||
bad = fail . ("In pattern matching: "++)
|
||||
|
||||
inlinePattMacro p =
|
||||
VPatt p' -> inlinePattMacro p'
|
||||
_ -> ppbug $ hang "Expected pattern macro:" 4
|
||||
|
||||
linPattVars p =
|
||||
if null dups
|
||||
then return pvs
|
||||
else fail.render $ hang "Pattern is not linear:" 4 (ppPatt Unqualified 0 p)
|
||||
|
||||
---------------------------------------------
|
||||
Compile.Compute.Abstract.hs
|
||||
|
||||
|
||||
---------------------------------------------
|
||||
PGF.Linearize.hs
|
||||
|
||||
bracketedLinearize :: PGF -> Language -> Tree -> [BracketedString]
|
||||
cnc = lookMap (error "no lang") lang (concretes pgf)
|
||||
|
||||
|
||||
---------------------------------------------
|
||||
PGF.TypeCheck.hs
|
||||
|
||||
ppTcError :: TcError -> Doc
|
||||
ppTcError (UnknownCat cat) = text "Category" <+> ppCId cat <+> text "is not in scope"
|
||||
ppTcError (UnknownFun fun) = text "Function" <+> ppCId fun <+> text "is not in scope"
|
||||
ppTcError (WrongCatArgs xs ty cat m n) = text "Category" <+> ppCId cat <+> text "should have" <+> int m <+> text "argument(s), but has been given" <+> int n $$
|
||||
text "In the type:" <+> ppType 0 xs ty
|
||||
ppTcError (TypeMismatch xs e ty1 ty2) = text "Couldn't match expected type" <+> ppType 0 xs ty1 $$
|
||||
text " against inferred type" <+> ppType 0 xs ty2 $$
|
||||
text "In the expression:" <+> ppExpr 0 xs e
|
||||
ppTcError (NotFunType xs e ty) = text "A function type is expected for the expression" <+> ppExpr 0 xs e <+> text "instead of type" <+> ppType 0 xs ty
|
||||
ppTcError (CannotInferType xs e) = text "Cannot infer the type of expression" <+> ppExpr 0 xs e
|
||||
ppTcError (UnresolvedMetaVars xs e ms) = text "Meta variable(s)" <+> fsep (List.map ppMeta ms) <+> text "should be resolved" $$
|
||||
text "in the expression:" <+> ppExpr 0 xs e
|
||||
ppTcError (UnexpectedImplArg xs e) = braces (ppExpr 0 xs e) <+> text "is implicit argument but not implicit argument is expected here"
|
||||
ppTcError (UnsolvableGoal xs metaid ty)= text "The goal:" <+> ppMeta metaid <+> colon <+> ppType 0 xs ty $$
|
||||
text "cannot be solved"
|
||||
|
||||
27
doc/errors/gluing.md
Normal file
27
doc/errors/gluing.md
Normal file
@@ -0,0 +1,27 @@
|
||||
## unsupported token gluing `foo + bar`
|
||||
|
||||
There was a problem in an expression using +, e.g. `foo + bar`.
|
||||
This can be due to two causes, check which one applies in your case.
|
||||
|
||||
1. You are trying to use + on runtime arguments. Even if you are using
|
||||
`foo + bar` in an oper, make sure that the oper isn't called in a
|
||||
linearization that takes arguments. Both of the following are illegal:
|
||||
|
||||
lin Test foo bar = foo.s + bar.s -- explicit + in a lin
|
||||
lin Test foo bar = opWithPlus foo bar -- the oper uses +
|
||||
|
||||
2. One of the arguments in `foo + bar` is a bound variable
|
||||
from pattern matching a string, but the cases are non-exhaustive.
|
||||
Example:
|
||||
case "test" of {
|
||||
x + "a" => x + "b" -- no applicable case for "test", so x = ???
|
||||
} ;
|
||||
|
||||
You can fix this by adding a catch-all case in the end:
|
||||
{ x + "a" => x + "b" ;
|
||||
_ => "default case" } ;
|
||||
|
||||
3. If neither applies to your problem, submit a bug report and we
|
||||
will update the error message and this documentation.
|
||||
|
||||
https://github.com/GrammaticalFramework/gf-core/issues
|
||||
201
doc/gf-developers-old-cabal.t2t
Normal file
201
doc/gf-developers-old-cabal.t2t
Normal file
@@ -0,0 +1,201 @@
|
||||
GF Developer's Guide: Old installation instructions with Cabal
|
||||
|
||||
|
||||
This page contains the old installation instructions from the [Developer's Guide ../doc/gf-developers.html].
|
||||
We recommend Stack as a primary installation method, because it's easier for a Haskell beginner, and we want to keep the main instructions short.
|
||||
But if you are an experienced Haskeller and want to keep using Cabal, here are the old instructions using ``cabal install``.
|
||||
|
||||
Note that some of these instructions may be outdated. Other parts may still be useful.
|
||||
|
||||
== Compilation from source with Cabal ==
|
||||
|
||||
The build system of GF is based on //Cabal//, which is part of the
|
||||
Haskell Platform, so no extra steps are needed to install it. In the simplest
|
||||
case, all you need to do to compile and install GF, after downloading the
|
||||
source code as described above, is
|
||||
|
||||
```
|
||||
$ cabal install
|
||||
```
|
||||
|
||||
This will automatically download any additional Haskell libraries needed to
|
||||
build GF. If this is the first time you use Cabal, you might need to run
|
||||
``cabal update`` first, to update the list of available libraries.
|
||||
|
||||
If you want more control, the process can also be split up into the usual
|
||||
//configure//, //build// and //install// steps.
|
||||
|
||||
=== Configure ===
|
||||
|
||||
During the configuration phase Cabal will check that you have all
|
||||
necessary tools and libraries needed for GF. The configuration is
|
||||
started by the command:
|
||||
|
||||
```
|
||||
$ cabal configure
|
||||
```
|
||||
|
||||
If you don't see any error message from the above command then you
|
||||
have everything that is needed for GF. You can also add the option
|
||||
``-v`` to see more details about the configuration.
|
||||
|
||||
You can use ``cabal configure --help`` to get a list of configuration options.
|
||||
|
||||
=== Build ===
|
||||
|
||||
The build phase does two things. First it builds the GF compiler from
|
||||
the Haskell source code and after that it builds the GF Resource Grammar
|
||||
Library using the already build compiler. The simplest command is:
|
||||
|
||||
```
|
||||
$ cabal build
|
||||
```
|
||||
|
||||
Again you can add the option ``-v`` if you want to see more details.
|
||||
|
||||
==== Parallel builds ====
|
||||
|
||||
If you have Cabal>=1.20 you can enable parallel compilation by using
|
||||
|
||||
```
|
||||
$ cabal build -j
|
||||
```
|
||||
|
||||
or by putting a line
|
||||
```
|
||||
jobs: $ncpus
|
||||
```
|
||||
in your ``.cabal/config`` file. Cabal
|
||||
will pass this option to GHC when building the GF compiler, if you
|
||||
have GHC>=7.8.
|
||||
|
||||
Cabal also passes ``-j`` to GF to enable parallel compilation of the
|
||||
Resource Grammar Library. This is done unconditionally to avoid
|
||||
causing problems for developers with Cabal<1.20. You can disable this
|
||||
by editing the last few lines in ``WebSetup.hs``.
|
||||
|
||||
=== Install ===
|
||||
|
||||
After you have compiled GF you need to install the executable and libraries
|
||||
to make the system usable.
|
||||
|
||||
```
|
||||
$ cabal copy
|
||||
$ cabal register
|
||||
```
|
||||
|
||||
This command installs the GF compiler for a single user, in the standard
|
||||
place used by Cabal.
|
||||
On Linux and Mac this could be ``$HOME/.cabal/bin``.
|
||||
On Mac it could also be ``$HOME/Library/Haskell/bin``.
|
||||
On Windows this is ``C:\Program Files\Haskell\bin``.
|
||||
|
||||
The compiled GF Resource Grammar Library will be installed
|
||||
under the same prefix, e.g. in
|
||||
``$HOME/.cabal/share/gf-3.3.3/lib`` on Linux and
|
||||
in ``C:\Program Files\Haskell\gf-3.3.3\lib`` on Windows.
|
||||
|
||||
If you want to install in some other place then use the ``--prefix``
|
||||
option during the configuration phase.
|
||||
|
||||
=== Clean ===
|
||||
|
||||
Sometimes you want to clean up the compilation and start again from clean
|
||||
sources. Use the clean command for this purpose:
|
||||
|
||||
```
|
||||
$ cabal clean
|
||||
```
|
||||
|
||||
|
||||
%=== SDist ===
|
||||
%
|
||||
%You can use the command:
|
||||
%
|
||||
%% This does *NOT* include everything that is needed // TH 2012-08-06
|
||||
%```
|
||||
%$ cabal sdist
|
||||
%```
|
||||
%
|
||||
%to prepare archive with all source codes needed to compile GF.
|
||||
|
||||
=== Known problems with Cabal ===
|
||||
|
||||
Some versions of Cabal (at least version 1.16) seem to have a bug that can
|
||||
cause the following error:
|
||||
|
||||
```
|
||||
Configuring gf-3.x...
|
||||
setup: Distribution/Simple/PackageIndex.hs:124:8-13: Assertion failed
|
||||
```
|
||||
|
||||
The exact cause of this problem is unclear, but it seems to happen
|
||||
during the configure phase if the same version of GF is already installed,
|
||||
so a workaround is to remove the existing installation with
|
||||
|
||||
```
|
||||
ghc-pkg unregister gf
|
||||
```
|
||||
|
||||
You can check with ``ghc-pkg list gf`` that it is gone.
|
||||
|
||||
== Compilation with make ==
|
||||
|
||||
If you feel more comfortable with Makefiles then there is a thin Makefile
|
||||
wrapper arround Cabal for you. If you just type:
|
||||
```
|
||||
$ make
|
||||
```
|
||||
the configuration phase will be run automatically if needed and after that
|
||||
the sources will be compiled.
|
||||
|
||||
%% cabal build rgl-none does not work with recent versions of Cabal
|
||||
%If you don't want to compile the resource library
|
||||
%every time then you can use:
|
||||
%```
|
||||
%$ make gf
|
||||
%```
|
||||
|
||||
For installation use:
|
||||
```
|
||||
$ make install
|
||||
```
|
||||
For cleaning:
|
||||
```
|
||||
$ make clean
|
||||
```
|
||||
%and to build source distribution archive run:
|
||||
%```
|
||||
%$ make sdist
|
||||
%```
|
||||
|
||||
|
||||
== Partial builds of RGL ==
|
||||
|
||||
**NOTE**: The following doesn't work with recent versions of ``cabal``. //(This comment was left in 2015, so make your own conclusions.)//
|
||||
%% // TH 2015-06-22
|
||||
|
||||
%Sometimes you just want to work on the GF compiler and don't want to
|
||||
%recompile the resource library after each change. In this case use
|
||||
%this extended command:
|
||||
|
||||
%```
|
||||
%$ cabal build rgl-none
|
||||
%```
|
||||
|
||||
The resource grammar library can be compiled in two modes: with present
|
||||
tense only and with all tenses. By default it is compiled with all
|
||||
tenses. If you want to use the library with only present tense you can
|
||||
compile it in this special mode with the command:
|
||||
|
||||
```
|
||||
$ cabal build present
|
||||
```
|
||||
|
||||
You could also control which languages you want to be recompiled by
|
||||
adding the option ``langs=list``. For example the following command
|
||||
will compile only the English and the Swedish language:
|
||||
|
||||
```
|
||||
$ cabal build langs=Eng,Swe
|
||||
```
|
||||
@@ -1,16 +1,8 @@
|
||||
GF Developers Guide
|
||||
Authors: Björn Bringert, Krasimir Angelov and Thomas Hallgren
|
||||
Last update: %%mtime(%F, %H:%M)
|
||||
|
||||
% NOTE: this is a txt2tags file.
|
||||
% Create an html file from this file using:
|
||||
% txt2tags -t html gf-developers.t2t
|
||||
2021-07-15
|
||||
|
||||
%!style:../css/style.css
|
||||
%!target:html
|
||||
%!options(html): --toc
|
||||
%!encoding:utf-8
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
== Before you start ==
|
||||
|
||||
@@ -23,398 +15,287 @@ you are a GF user who just wants to download and install GF
|
||||
== Setting up your system for building GF ==
|
||||
|
||||
To build GF from source you need to install some tools on your
|
||||
system: the //Haskell Platform//, //Git// and the //Haskeline library//.
|
||||
system: the Haskell build tool //Stack//, the version control software //Git// and the //Haskeline// library.
|
||||
|
||||
**On Linux** the best option is to install the tools via the standard
|
||||
software distribution channels, i.e. by using the //Software Center//
|
||||
in Ubuntu or the corresponding tool in other popular Linux distributions.
|
||||
Or, from a Terminal window, the following command should be enough:
|
||||
%**On Linux** the best option is to install the tools via the standard
|
||||
%software distribution channels, i.e. by using the //Software Center//
|
||||
%in Ubuntu or the corresponding tool in other popular Linux distributions.
|
||||
|
||||
- On Ubuntu: ``sudo apt-get install haskell-platform git libghc6-haskeline-dev``
|
||||
- On Fedora: ``sudo dnf install haskell-platform git ghc-haskeline-devel``
|
||||
%**On Mac OS and Windows**, the tools can be downloaded from their respective
|
||||
%web sites, as described below.
|
||||
|
||||
=== Stack ===
|
||||
The primary installation method is via //Stack//.
|
||||
(You can also use Cabal, but we recommend Stack to those who are new to Haskell.)
|
||||
|
||||
To install Stack:
|
||||
|
||||
- **On Linux and Mac OS**, do either
|
||||
|
||||
``$ curl -sSL https://get.haskellstack.org/ | sh``
|
||||
|
||||
or
|
||||
|
||||
``$ wget -qO- https://get.haskellstack.org/ | sh``
|
||||
|
||||
|
||||
**On Mac OS and Windows**, the tools can be downloaded from their respective
|
||||
web sites, as described below.
|
||||
- **On other operating systems**, see the [installation guide https://docs.haskellstack.org/en/stable/install_and_upgrade].
|
||||
|
||||
=== The Haskell Platform ===
|
||||
|
||||
GF is written in Haskell, so first of all you need
|
||||
the //Haskell Platform//, e.g. version 8.0.2 or 7.10.3. Downloads
|
||||
and installation instructions are available from here:
|
||||
|
||||
http://hackage.haskell.org/platform/
|
||||
|
||||
Once you have installed the Haskell Platform, open a terminal
|
||||
(Command Prompt on Windows) and try to execute the following command:
|
||||
```
|
||||
$ ghc --version
|
||||
```
|
||||
This command should show you which version of GHC you have. If the installation
|
||||
of the Haskell Platform was successful you should see a message like:
|
||||
|
||||
```
|
||||
The Glorious Glasgow Haskell Compilation System, version 8.0.2
|
||||
```
|
||||
|
||||
Other required tools included in the Haskell Platform are
|
||||
[Cabal http://www.haskell.org/cabal/],
|
||||
[Alex http://www.haskell.org/alex/]
|
||||
and
|
||||
[Happy http://www.haskell.org/happy/].
|
||||
|
||||
%=== Darcs ===
|
||||
%
|
||||
%To get the GF source code, you also need //Darcs//, version 2 or later.
|
||||
%Darcs 2.10 is recommended (July 2015).
|
||||
%
|
||||
%//Darcs//
|
||||
%is a distributed version control system, see http://darcs.net/ for
|
||||
%more information. There are precompiled packages for many platforms
|
||||
%available and source code if you want to compile it yourself. Darcs
|
||||
%is also written in Haskell and so you can use GHC to compile it.
|
||||
%If you already have Stack installed, upgrade it to the latest version by running: ``stack upgrade``
|
||||
|
||||
|
||||
=== Git ===
|
||||
|
||||
To get the GF source code, you also need //Git//.
|
||||
//Git// is a distributed version control system, see
|
||||
https://git-scm.com/downloads for more information.
|
||||
To get the GF source code, you also need //Git//, a distributed version control system.
|
||||
|
||||
=== The haskeline library ===
|
||||
- **On Linux**, the best option is to install the tools via the standard
|
||||
software distribution channels:
|
||||
|
||||
- On Ubuntu: ``sudo apt-get install git-all``
|
||||
- On Fedora: ``sudo dnf install git-all``
|
||||
|
||||
|
||||
- **On other operating systems**, see
|
||||
https://git-scm.com/book/en/v2/Getting-Started-Installing-Git for installation.
|
||||
|
||||
|
||||
|
||||
=== Haskeline ===
|
||||
|
||||
GF uses //haskeline// to enable command line editing in the GF shell.
|
||||
This should work automatically on Mac OS and Windows, but on Linux one
|
||||
extra step is needed to make sure the C libraries (terminfo)
|
||||
required by //haskeline// are installed. Here is one way to do this:
|
||||
|
||||
- On Ubuntu: ``sudo apt-get install libghc-haskeline-dev``
|
||||
- On Fedora: ``sudo dnf install ghc-haskeline-devel``
|
||||
- **On Mac OS and Windows**, this should work automatically.
|
||||
|
||||
- **On Linux**, an extra step is needed to make sure the C libraries (terminfo)
|
||||
required by //haskeline// are installed:
|
||||
|
||||
- On Ubuntu: ``sudo apt-get install libghc-haskeline-dev``
|
||||
- On Fedora: ``sudo dnf install ghc-haskeline-devel``
|
||||
|
||||
|
||||
== Getting the source ==
|
||||
== Getting the source ==[getting-source]
|
||||
|
||||
Once you have all tools in place you can get the GF source code. If you
|
||||
just want to compile and use GF then it is enough to have read-only
|
||||
access. It is also possible to make changes in the source code but if you
|
||||
want these changes to be applied back to the main source repository you will
|
||||
have to send the changes to us. If you plan to work continuously on
|
||||
GF then you should consider getting read-write access.
|
||||
Once you have all tools in place you can get the GF source code from
|
||||
[GitHub https://github.com/GrammaticalFramework/]:
|
||||
|
||||
=== Read-only access ===
|
||||
- https://github.com/GrammaticalFramework/gf-core for the GF compiler
|
||||
- https://github.com/GrammaticalFramework/gf-rgl for the Resource Grammar Library
|
||||
|
||||
==== Getting a fresh copy for read-only access ====
|
||||
|
||||
Anyone can get the latest development version of GF by running:
|
||||
=== Read-only access: clone the main repository ===
|
||||
|
||||
If you only want to compile and use GF, you can just clone the repositories as follows:
|
||||
|
||||
```
|
||||
$ git clone https://github.com/GrammaticalFramework/gf-core.git
|
||||
$ git clone https://github.com/GrammaticalFramework/gf-rgl.git
|
||||
$ git clone https://github.com/GrammaticalFramework/gf-core.git
|
||||
$ git clone https://github.com/GrammaticalFramework/gf-rgl.git
|
||||
```
|
||||
|
||||
This will create directories ``gf-core`` and ``gf-rgl`` in the current directory.
|
||||
|
||||
|
||||
==== Updating your copy ====
|
||||
|
||||
To get all new patches from each repo:
|
||||
```
|
||||
$ git pull
|
||||
```
|
||||
This can be done anywhere in your local repository.
|
||||
|
||||
|
||||
==== Recording local changes ====[record]
|
||||
|
||||
Since every copy is a repository, you can have local version control
|
||||
of your changes.
|
||||
|
||||
If you have added files, you first need to tell your local repository to
|
||||
keep them under revision control:
|
||||
To get new updates, run the following anywhere in your local copy of the repository:
|
||||
|
||||
```
|
||||
$ git add file1 file2 ...
|
||||
$ git pull
|
||||
```
|
||||
|
||||
To record changes, use:
|
||||
=== Contribute your changes: fork the main repository ===
|
||||
|
||||
If you want the possibility to contribute your changes,
|
||||
you should create your own fork, do your changes there,
|
||||
and then send a pull request to the main repository.
|
||||
|
||||
+ **Creating and cloning a fork —**
|
||||
See GitHub documentation for instructions how to [create your own fork https://docs.github.com/en/get-started/quickstart/fork-a-repo]
|
||||
of the repository. Once you've done it, clone the fork to your local computer.
|
||||
|
||||
```
|
||||
$ git commit file1 file2 ...
|
||||
$ git clone https://github.com/<YOUR_USERNAME>/gf-core.git
|
||||
```
|
||||
|
||||
This creates a patch against the previous version and stores it in your
|
||||
local repository. You can record any number of changes before
|
||||
pushing them to the main repo. In fact, you don't have to push them at
|
||||
all if you want to keep the changes only in your local repo.
|
||||
|
||||
Instead of enumerating all modified files on the command line,
|
||||
you can use the flag ``-a`` to automatically record //all// modified
|
||||
files. You still need to use ``git add`` to add new files.
|
||||
|
||||
|
||||
=== Read-write access ===
|
||||
|
||||
If you are a member of the GF project on GitHub, you can push your
|
||||
changes directly to the GF git repository on GitHub.
|
||||
+ **Updating your copy —**
|
||||
Once you have cloned your fork, you need to set up the main repository as a remote:
|
||||
|
||||
```
|
||||
$ git push
|
||||
$ git remote add upstream https://github.com/GrammaticalFramework/gf-core.git
|
||||
```
|
||||
|
||||
It is also possible for anyone else to contribute by
|
||||
Then you can get the latest updates by running the following:
|
||||
|
||||
- creating a fork of the GF repository on GitHub,
|
||||
- working with local clone of the fork (obtained with ``git clone``),
|
||||
- pushing changes to the fork,
|
||||
- and finally sending a pull request.
|
||||
```
|
||||
$ git pull upstream master
|
||||
```
|
||||
|
||||
+ **Recording local changes —**
|
||||
See Git tutorial on how to [record and push your changes https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository] to your fork.
|
||||
|
||||
+ **Pull request —**
|
||||
When you want to contribute your changes to the main gf-core repository,
|
||||
[create a pull request https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request]
|
||||
from your fork.
|
||||
|
||||
|
||||
|
||||
== Compilation from source with Cabal ==
|
||||
If you want to contribute to the RGL as well, do the same process for the RGL repository.
|
||||
|
||||
The build system of GF is based on //Cabal//, which is part of the
|
||||
Haskell Platform, so no extra steps are needed to install it. In the simplest
|
||||
case, all you need to do to compile and install GF, after downloading the
|
||||
source code as described above, is
|
||||
|
||||
== Compilation from source ==
|
||||
|
||||
By now you should have installed Stack and Haskeline, and cloned the Git repository on your own computer, in a directory called ``gf-core``.
|
||||
|
||||
=== Primary recommendation: use Stack ===
|
||||
|
||||
Open a terminal, go to the top directory (``gf-core``), and type the following command.
|
||||
|
||||
```
|
||||
$ stack install
|
||||
```
|
||||
|
||||
It will install GF and all necessary tools and libraries to do that.
|
||||
|
||||
|
||||
=== Alternative: use Cabal ===
|
||||
You can also install GF using Cabal, if you prefer Cabal to Stack. In that case, you may need to install some prerequisites yourself.
|
||||
|
||||
The actual installation process is similar to Stack: open a terminal, go to the top directory (``gf-core``), and type the following command.
|
||||
|
||||
```
|
||||
$ cabal install
|
||||
```
|
||||
|
||||
This will automatically download any additional Haskell libraries needed to
|
||||
build GF. If this is the first time you use Cabal, you might need to run
|
||||
``cabal update`` first, to update the list of available libraries.
|
||||
//The old (potentially outdated) instructions for Cabal are moved to a [separate page ../doc/gf-developers-old-cabal.html]. If you run into trouble with ``cabal install``, you may want to take a look.//
|
||||
|
||||
If you want more control, the process can also be split up into the usual
|
||||
//configure//, //build// and //install// steps.
|
||||
== Compiling GF with C runtime system support ==
|
||||
|
||||
=== Configure ===
|
||||
|
||||
During the configuration phase Cabal will check that you have all
|
||||
necessary tools and libraries needed for GF. The configuration is
|
||||
started by the command:
|
||||
|
||||
```
|
||||
$ cabal configure
|
||||
```
|
||||
|
||||
If you don't see any error message from the above command then you
|
||||
have everything that is needed for GF. You can also add the option
|
||||
``-v`` to see more details about the configuration.
|
||||
|
||||
You can use ``cabal configure --help`` to get a list of configuration options.
|
||||
|
||||
=== Build ===
|
||||
|
||||
The build phase does two things. First it builds the GF compiler from
|
||||
the Haskell source code and after that it builds the GF Resource Grammar
|
||||
Library using the already build compiler. The simplest command is:
|
||||
|
||||
```
|
||||
$ cabal build
|
||||
```
|
||||
|
||||
Again you can add the option ``-v`` if you want to see more details.
|
||||
|
||||
==== Parallel builds ====
|
||||
|
||||
If you have Cabal>=1.20 you can enable parallel compilation by using
|
||||
|
||||
```
|
||||
$ cabal build -j
|
||||
```
|
||||
|
||||
or by putting a line
|
||||
```
|
||||
jobs: $ncpus
|
||||
```
|
||||
in your ``.cabal/config`` file. Cabal
|
||||
will pass this option to GHC when building the GF compiler, if you
|
||||
have GHC>=7.8.
|
||||
|
||||
Cabal also passes ``-j`` to GF to enable parallel compilation of the
|
||||
Resource Grammar Library. This is done unconditionally to avoid
|
||||
causing problems for developers with Cabal<1.20. You can disable this
|
||||
by editing the last few lines in ``WebSetup.hs``.
|
||||
|
||||
|
||||
==== Partial builds ====
|
||||
|
||||
**NOTE**: The following doesn't work with recent versions of ``cabal``.
|
||||
%% // TH 2015-06-22
|
||||
|
||||
Sometimes you just want to work on the GF compiler and don't want to
|
||||
recompile the resource library after each change. In this case use
|
||||
this extended command:
|
||||
|
||||
```
|
||||
$ cabal build rgl-none
|
||||
```
|
||||
|
||||
The resource library could also be compiled in two modes: with present
|
||||
tense only and with all tenses. By default it is compiled with all
|
||||
tenses. If you want to use the library with only present tense you can
|
||||
compile it in this special mode with the command:
|
||||
|
||||
```
|
||||
$ cabal build present
|
||||
```
|
||||
|
||||
You could also control which languages you want to be recompiled by
|
||||
adding the option ``langs=list``. For example the following command
|
||||
will compile only the English and the Swedish language:
|
||||
|
||||
```
|
||||
$ cabal build langs=Eng,Swe
|
||||
```
|
||||
|
||||
=== Install ===
|
||||
|
||||
After you have compiled GF you need to install the executable and libraries
|
||||
to make the system usable.
|
||||
|
||||
```
|
||||
$ cabal copy
|
||||
$ cabal register
|
||||
```
|
||||
|
||||
This command installs the GF compiler for a single user, in the standard
|
||||
place used by Cabal.
|
||||
On Linux and Mac this could be ``$HOME/.cabal/bin``.
|
||||
On Mac it could also be ``$HOME/Library/Haskell/bin``.
|
||||
On Windows this is ``C:\Program Files\Haskell\bin``.
|
||||
|
||||
The compiled GF Resource Grammar Library will be installed
|
||||
under the same prefix, e.g. in
|
||||
``$HOME/.cabal/share/gf-3.3.3/lib`` on Linux and
|
||||
in ``C:\Program Files\Haskell\gf-3.3.3\lib`` on Windows.
|
||||
|
||||
If you want to install in some other place then use the ``--prefix``
|
||||
option during the configuration phase.
|
||||
|
||||
=== Clean ===
|
||||
|
||||
Sometimes you want to clean up the compilation and start again from clean
|
||||
sources. Use the clean command for this purpose:
|
||||
|
||||
```
|
||||
$ cabal clean
|
||||
```
|
||||
|
||||
|
||||
%=== SDist ===
|
||||
%
|
||||
%You can use the command:
|
||||
%
|
||||
%% This does *NOT* include everything that is needed // TH 2012-08-06
|
||||
%```
|
||||
%$ cabal sdist
|
||||
%```
|
||||
%
|
||||
%to prepare archive with all source codes needed to compile GF.
|
||||
|
||||
=== Known problems with Cabal ===
|
||||
|
||||
Some versions of Cabal (at least version 1.16) seem to have a bug that can
|
||||
cause the following error:
|
||||
|
||||
```
|
||||
Configuring gf-3.x...
|
||||
setup: Distribution/Simple/PackageIndex.hs:124:8-13: Assertion failed
|
||||
```
|
||||
|
||||
The exact cause of this problem is unclear, but it seems to happen
|
||||
during the configure phase if the same version of GF is already installed,
|
||||
so a workaround is to remove the existing installation with
|
||||
|
||||
```
|
||||
ghc-pkg unregister gf
|
||||
```
|
||||
|
||||
You can check with ``ghc-pkg list gf`` that it is gone.
|
||||
|
||||
== Compilation with make ==
|
||||
|
||||
If you feel more comfortable with Makefiles then there is a thin Makefile
|
||||
wrapper arround Cabal for you. If you just type:
|
||||
```
|
||||
$ make
|
||||
```
|
||||
the configuration phase will be run automatically if needed and after that
|
||||
the sources will be compiled.
|
||||
|
||||
%% cabal build rgl-none does not work with recent versions of Cabal
|
||||
%If you don't want to compile the resource library
|
||||
%every time then you can use:
|
||||
%```
|
||||
%$ make gf
|
||||
%```
|
||||
|
||||
For installation use:
|
||||
```
|
||||
$ make install
|
||||
```
|
||||
For cleaning:
|
||||
```
|
||||
$ make clean
|
||||
```
|
||||
%and to build source distribution archive run:
|
||||
%```
|
||||
%$ make sdist
|
||||
%```
|
||||
|
||||
== Compiling GF with C run-time system support ==
|
||||
|
||||
The C run-time system is a separate implementation of the PGF run-time services.
|
||||
The C runtime system is a separate implementation of the PGF runtime services.
|
||||
It makes it possible to work with very large, ambiguous grammars, using
|
||||
probabilistic models to obtain probable parses. The C run-time system might
|
||||
also be easier to use than the Haskell run-time system on certain platforms,
|
||||
probabilistic models to obtain probable parses. The C runtime system might
|
||||
also be easier to use than the Haskell runtime system on certain platforms,
|
||||
e.g. Android and iOS.
|
||||
|
||||
To install the C run-time system, go to the ``src/runtime/c`` directory
|
||||
%and follow the instructions in the ``INSTALL`` file.
|
||||
and use the ``install.sh`` script:
|
||||
```
|
||||
bash setup.sh configure
|
||||
bash setup.sh build
|
||||
bash setup.sh install
|
||||
```
|
||||
This will install
|
||||
the C header files and libraries need to write C programs that use PGF grammars.
|
||||
Some example C programs are included in the ``utils`` subdirectory, e.g.
|
||||
``pgf-translate.c``.
|
||||
To install the C runtime system, go to the ``src/runtime/c`` directory.
|
||||
|
||||
When the C run-time system is installed, you can install GF with C run-time
|
||||
support by doing
|
||||
- **On Linux and Mac OS —**
|
||||
You should have autoconf, automake, libtool and make.
|
||||
If you are missing some of them, follow the
|
||||
instructions in the [INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file.
|
||||
|
||||
Once you have the required libraries, the easiest way to install the C runtime is to use the ``install.sh`` script. Just type
|
||||
|
||||
``$ bash install.sh``
|
||||
|
||||
This will install the C header files and libraries need to write C programs
|
||||
that use PGF grammars.
|
||||
|
||||
% If this doesn't work for you, follow the manual instructions in the [INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file under your operating system.
|
||||
|
||||
- **On other operating systems —** Follow the instructions in the
|
||||
[INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file under your operating system.
|
||||
|
||||
|
||||
|
||||
Depending on what you want to do with the C runtime, you can follow one or more of the following steps.
|
||||
|
||||
=== Use the C runtime from another programming language ===[bindings]
|
||||
|
||||
% **If you just want to use the C runtime from Python, Java, or Haskell, you don't need to change your GF installation.**
|
||||
|
||||
- **What —**
|
||||
This is the most common use case for the C runtime: compile
|
||||
your GF grammars into PGF with the standard GF executable,
|
||||
and manipulate the PGFs from another programming language,
|
||||
using the bindings to the C runtime.
|
||||
|
||||
|
||||
- **How —**
|
||||
The Python, Java and Haskell bindings are found in the
|
||||
``src/runtime/{python,java,haskell-bind}`` directories,
|
||||
respecively. Compile them by following the instructions
|
||||
in the ``INSTALL`` or ``README`` files in those directories.
|
||||
|
||||
The Python library can also be installed from PyPI using ``pip install pgf``.
|
||||
|
||||
|
||||
//If you are on Mac and get an error about ``clang`` version, you can try some of [these solutions https://stackoverflow.com/questions/63972113/big-sur-clang-invalid-version-error-due-to-macosx-deployment-target]—but be careful before removing any existing installations.//
|
||||
|
||||
|
||||
=== Use GF shell with C runtime support ===
|
||||
|
||||
- **What —**
|
||||
If you want to use the GF shell with C runtime functionalities, then you need to (re)compile GF with special flags.
|
||||
|
||||
The GF shell can be started with ``gf -cshell`` or ``gf -crun`` to use
|
||||
the C run-time system instead of the Haskell run-time system.
|
||||
Only limited functionality is available when running the shell in these
|
||||
modes (use the ``help`` command in the shell for details).
|
||||
|
||||
(Re)compiling your GF with these flags will also give you
|
||||
Haskell bindings to the C runtime, as a library called ``PGF2``,
|
||||
but if you want Python or Java bindings, you need to do [the previous step #bindings].
|
||||
|
||||
% ``PGF2``: a module to import in Haskell programs, providing a binding to the C run-time system.
|
||||
|
||||
- **How —**
|
||||
If you use cabal, run the following command:
|
||||
|
||||
```
|
||||
cabal install -fserver -fc-runtime
|
||||
cabal install -fc-runtime
|
||||
```
|
||||
from the top directory. This give you three new things:
|
||||
|
||||
- ``PGF2``: a module to import in Haskell programs, providing a binding to
|
||||
the C run-time system.
|
||||
from the top directory (``gf-core``).
|
||||
|
||||
- The GF shell can be started with ``gf -cshell`` or ``gf -crun`` to use
|
||||
the C run-time system instead of the Haskell run-time system.
|
||||
Only limited functionality is available when running the shell in these
|
||||
modes (use the ``help`` command in the shell for details).
|
||||
If you use stack, uncomment the following lines in the ``stack.yaml`` file:
|
||||
|
||||
- ``gf -server`` mode is extended with new requests to call the C run-time
|
||||
system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
|
||||
```
|
||||
flags:
|
||||
gf:
|
||||
c-runtime: true
|
||||
extra-lib-dirs:
|
||||
- /usr/local/lib
|
||||
```
|
||||
and then run ``stack install`` from the top directory (``gf-core``).
|
||||
|
||||
|
||||
=== Python and Java bindings ===
|
||||
//If you get an "``error while loading shared libraries``" when trying to run GF with C runtime, remember to declare your ``LD_LIBRARY_PATH``.//
|
||||
//Add ``export LD_LIBRARY_PATH="/usr/local/lib"`` to either your ``.bashrc`` or ``.profile``. You should now be able to start GF with C runtime.//
|
||||
|
||||
|
||||
=== Use GF server mode with C runtime ===
|
||||
|
||||
- **What —**
|
||||
With this feature, ``gf -server`` mode is extended with new requests to call the C run-time
|
||||
system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
|
||||
|
||||
- **How —**
|
||||
If you use cabal, run the following command:
|
||||
|
||||
```
|
||||
cabal install -fc-runtime -fserver
|
||||
```
|
||||
from the top directory.
|
||||
|
||||
If you use stack, add the following lines in the ``stack.yaml`` file:
|
||||
|
||||
```
|
||||
flags:
|
||||
gf:
|
||||
c-runtime: true
|
||||
server: true
|
||||
extra-lib-dirs:
|
||||
- /usr/local/lib
|
||||
```
|
||||
|
||||
and then run ``stack install``, also from the top directory.
|
||||
|
||||
|
||||
The C run-time system can also be used from Python and Java. Python and Java
|
||||
bindings are found in the ``src/runtime/python`` and ``src/runtime/java``
|
||||
directories, respecively. Compile them by following the instructions in
|
||||
the ``INSTALL`` files in those directories.
|
||||
|
||||
== Compilation of RGL ==
|
||||
|
||||
As of 2018-07-26, the RGL is distributed separately from the GF compiler and runtimes.
|
||||
|
||||
To get the source, follow the previous instructions on [how to clone a repository with Git #getting-source].
|
||||
|
||||
After cloning the RGL, you should have a directory named ``gf-rgl`` on your computer.
|
||||
|
||||
=== Simple ===
|
||||
To install the RGL, you can use the following commands from within the ``gf-rgl`` repository:
|
||||
```
|
||||
@@ -425,114 +306,79 @@ There is also ``make build``, ``make copy`` and ``make clean`` which do what you
|
||||
=== Advanced ===
|
||||
For advanced build options, call the Haskell build script directly:
|
||||
```
|
||||
$ runghc Make.hs ...
|
||||
$ runghc Setup.hs ...
|
||||
```
|
||||
For more details see the [README https://github.com/GrammaticalFramework/gf-rgl/blob/master/README.md].
|
||||
|
||||
=== Haskell-free ===
|
||||
If you do not have Haskell installed, you can use the simple build script ``Make.sh``
|
||||
(or ``Make.bat`` for Windows).
|
||||
If you do not have Haskell installed, you can use the simple build script ``Setup.sh``
|
||||
(or ``Setup.bat`` for Windows).
|
||||
|
||||
|
||||
== Creating binary distribution packages ==
|
||||
|
||||
=== Creating .deb packages for Ubuntu ===
|
||||
The binaries are generated with Github Actions. More details can be viewed here:
|
||||
|
||||
This was tested on Ubuntu 14.04 for the release of GF 3.6, and the
|
||||
resulting ``.deb`` packages appears to work on Ubuntu 12.04, 13.10 and 14.04.
|
||||
For the release of GF 3.7, we generated ``.deb`` packages on Ubuntu 15.04 and
|
||||
tested them on Ubuntu 12.04 and 14.04.
|
||||
https://github.com/GrammaticalFramework/gf-core/actions/workflows/build-binary-packages.yml
|
||||
|
||||
Under Ubuntu, Haskell executables are statically linked against other Haskell
|
||||
libraries, so the .deb packages are fairly self-contained.
|
||||
|
||||
==== Preparations ====
|
||||
== Running the test suite ==
|
||||
|
||||
The GF test suite is run with one of the following commands from the top directory:
|
||||
|
||||
```
|
||||
sudo apt-get install dpkg-dev debhelper
|
||||
$ cabal test
|
||||
```
|
||||
|
||||
==== Creating the package ====
|
||||
|
||||
Make sure the ``debian/changelog`` starts with an entry that describes the
|
||||
version you are building. Then run
|
||||
or
|
||||
|
||||
```
|
||||
make deb
|
||||
$ stack test
|
||||
```
|
||||
|
||||
If get error messages about missing dependencies
|
||||
(e.g. ``autoconf``, ``automake``, ``libtool-bin``, ``python-dev``,
|
||||
``java-sdk``, ``txt2tags``)
|
||||
use ``apt-get intall`` to install them, then try again.
|
||||
|
||||
|
||||
=== Creating OS X Installer packages ===
|
||||
|
||||
Run
|
||||
|
||||
```
|
||||
make pkg
|
||||
```
|
||||
|
||||
=== Creating binary tar distributions ===
|
||||
|
||||
Run
|
||||
|
||||
```
|
||||
make bintar
|
||||
```
|
||||
|
||||
=== Creating .rpm packages for Fedora ===
|
||||
|
||||
This is possible, but the procedure has not been automated.
|
||||
It involves using the cabal-rpm tool,
|
||||
|
||||
```
|
||||
sudo dnf install cabal-rpm
|
||||
```
|
||||
|
||||
and following the Fedora guide
|
||||
[How to create an RPM package http://fedoraproject.org/wiki/How_to_create_an_RPM_package].
|
||||
|
||||
Under Fedora, Haskell executables are dynamically linked against other Haskell
|
||||
libraries, so ``.rpm`` packages for all Haskell libraries that GF depends on
|
||||
are required. Most of them are already available in the Fedora distribution,
|
||||
but a few of them might have to be built and distributed along with
|
||||
the GF ``.rpm`` package.
|
||||
When building ``.rpm`` packages for GF 3.4, we also had to build ``.rpm``s for
|
||||
``fst`` and ``httpd-shed``.
|
||||
|
||||
== Running the testsuite ==
|
||||
|
||||
**NOTE:** The test suite has not been maintained recently, so expect many
|
||||
tests to fail.
|
||||
%% // TH 2012-08-06
|
||||
|
||||
GF has testsuite. It is run with the following command:
|
||||
```
|
||||
$ cabal test
|
||||
```
|
||||
The testsuite architecture for GF is very simple but still very flexible.
|
||||
GF by itself is an interpreter and could execute commands in batch mode.
|
||||
This is everything that we need to organize a testsuite. The root of the
|
||||
testsuite is the testsuite/ directory. It contains subdirectories which
|
||||
themself contain GF batch files (with extension .gfs). The above command
|
||||
searches the subdirectories of the testsuite/ directory for files with extension
|
||||
.gfs and when it finds one it is executed with the GF interpreter.
|
||||
The output of the script is stored in file with extension .out and is compared
|
||||
with the content of the corresponding file with extension .gold, if there is one.
|
||||
If the contents are identical the command reports that the test was passed successfully.
|
||||
Otherwise the test had failed.
|
||||
testsuite is the ``testsuite/`` directory. It contains subdirectories
|
||||
which themselves contain GF batch files (with extension ``.gfs``).
|
||||
The above command searches the subdirectories of the ``testsuite/`` directory
|
||||
for files with extension ``.gfs`` and when it finds one, it is executed with
|
||||
the GF interpreter. The output of the script is stored in file with extension ``.out``
|
||||
and is compared with the content of the corresponding file with extension ``.gold``, if there is one.
|
||||
|
||||
Every time when you make some changes to GF that have to be tested, instead of
|
||||
writing the commands by hand in the GF shell, add them to one .gfs file in the testsuite
|
||||
and run the test. In this way you can use the same test later and we will be sure
|
||||
that we will not incidentaly break your code later.
|
||||
Every time when you make some changes to GF that have to be tested,
|
||||
instead of writing the commands by hand in the GF shell, add them to one ``.gfs``
|
||||
file in the testsuite subdirectory where its ``.gf`` file resides and run the test.
|
||||
In this way you can use the same test later and we will be sure that we will not
|
||||
accidentally break your code later.
|
||||
|
||||
**Test Outcome - Passed:** If the contents of the files with the ``.out`` extension
|
||||
are identical to their correspondingly-named files with the extension ``.gold``,
|
||||
the command will report that the tests passed successfully, e.g.
|
||||
|
||||
If you don't want to run the whole testsuite you can write the path to the subdirectory
|
||||
in which you are interested. For example:
|
||||
```
|
||||
$ cabal test testsuite/compiler
|
||||
Running 1 test suites...
|
||||
Test suite gf-tests: RUNNING...
|
||||
Test suite gf-tests: PASS
|
||||
1 of 1 test suites (1 of 1 test cases) passed.
|
||||
```
|
||||
will run only the testsuite for the compiler.
|
||||
|
||||
**Test Outcome - Failed:** If there is a contents mismatch between the files
|
||||
with the ``.out`` extension and their corresponding files with the extension ``.gold``,
|
||||
the test diagnostics will show a fail and the areas that failed. e.g.
|
||||
|
||||
```
|
||||
testsuite/compiler/compute/Records.gfs: OK
|
||||
testsuite/compiler/compute/Variants.gfs: FAIL
|
||||
testsuite/compiler/params/params.gfs: OK
|
||||
Test suite gf-tests: FAIL
|
||||
0 of 1 test suites (0 of 1 test cases) passed.
|
||||
```
|
||||
|
||||
The fail results overview is available in gf-tests.html which shows 4 columns:
|
||||
|
||||
+ __Results__ - only areas that fail will appear. (Note: There are 3 failures in the gf-tests.html which are labelled as (expected). These failures should be ignored.)
|
||||
+ __Input__ - which is the test written in the .gfs file
|
||||
+ __Gold__ - the expected output from running the test set out in the .gfs file. This column refers to the contents from the .gold extension files.
|
||||
+ __Output__ - This column refers to the contents from the .out extension files which are generated as test output.
|
||||
After fixing the areas which fail, rerun the test command. Repeat the entire process of fix-and-test until the test suite passes before submitting a pull request to include your changes.
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
Editor modes & IDE integration for GF
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!options(html): --toc
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!encoding:utf-8
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
We collect GF modes for various editors on this page. Contributions are
|
||||
welcome!
|
||||
|
||||
@@ -21,6 +15,12 @@ instructions inside.
|
||||
==Atom==
|
||||
[language-gf https://atom.io/packages/language-gf], by John J. Camilleri
|
||||
|
||||
==Visual Studio Code==
|
||||
|
||||
[Grammatical Framework Language Server https://marketplace.visualstudio.com/items?itemName=anka-213.gf-vscode] by Andreas Källberg.
|
||||
|
||||
This provides syntax highlighting and a client for the Grammatical Framework language server. Follow the installation instructions in the link.
|
||||
|
||||
==Eclipse==
|
||||
|
||||
[GF Eclipse Plugin https://github.com/GrammaticalFramework/gf-eclipse-plugin/], by John J. Camilleri
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
Grammatical Framework: Frequently Asked Quuestions
|
||||
Aarne Ranta
|
||||
%%date(%c)
|
||||
|
||||
% NOTE: this is a txt2tags file.
|
||||
% Create an html file from this file using:
|
||||
% txt2tags gf-bibliography.t2t
|
||||
|
||||
%!style:../css/style.css
|
||||
%!target:html
|
||||
%!options(html): --toc
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): #BR <br>
|
||||
%!encoding:utf-8
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
|
||||
===What has been done with GF?===
|
||||
|
||||
**Translation**: systems with any number of parallel languages, with input in one language and output in all the others.
|
||||
|
||||
**Natural language generation** (NLG): translation from a formal language to natural languages.
|
||||
|
||||
**Ontology verbalization** is a special case of NLG.
|
||||
|
||||
**Language training**: grammar and vocabulary training systems.
|
||||
|
||||
**Human-computer interaction**: natural language interfaces, spoken dialogue systems.
|
||||
|
||||
**Linguistics**: comparisons between languages.
|
||||
|
||||
|
||||
|
||||
===What parts does GF have?===
|
||||
|
||||
A **grammar compiler**, used for compiling grammars to parsing, generation, and translation code.
|
||||
|
||||
A **run-time system**, used for parsing, generation and translation. The run-time system is available in several languages:
|
||||
Haskell, Java, C, C++, Javascript, and Python. The point with this is that you can include GF-based parsing and generation in
|
||||
larger programs written in any of these languages.
|
||||
|
||||
A **resource grammar library**, containing the morphology and basic syntax of currently 26 languages.
|
||||
|
||||
A **web application toolkit**, containing server-side (Haskell) and client-side (Javascript) libraries.
|
||||
|
||||
An **integrated development environment**, the GF-Eclipse plug-in.
|
||||
|
||||
A **shell**, i.e. a command interpreter for testing and developing GF grammars. This is the program started by the command ``gf`` in a terminal.
|
||||
|
||||
|
||||
|
||||
===Is GF open-source?===
|
||||
|
||||
|
||||
===Can I use GF for commercial applications?===
|
||||
|
||||
Yes. Those parts of GF that you will need to distribute - the run-time system and the libraries - are licensed under LGPL and BSD; it's up to you to choose which.
|
||||
|
||||
|
||||
|
||||
===When was GF started?===
|
||||
|
||||
|
||||
===Where does the name GF come from?===
|
||||
|
||||
GF = Grammatical Framework = LF + concrete syntax
|
||||
|
||||
LF = Logical Framework
|
||||
|
||||
Logical Frameworks are implementations of type theory, which have been built since the 1980's to support formalized mathematics. GF has its roots in
|
||||
type theory, which is widely used in the semantics of natural language. Some of these ideas were first implemented in ALF, Another Logical Framework,
|
||||
in 1992; the book //Type-Theoretical Grammar// (by A. Ranta, OUP 1994) has a chapter and an appendix on this. The first implementations did not have
|
||||
a parser, and GF proper, started in 1998, was an implementation of yet another LF together with concrete syntax supporting generation and parsing.
|
||||
Grammatical Framework was a natural name for this. We tried to avoid it in the beginning, because it sounded pretentious in its generality. But the
|
||||
name was just too natural to be avoided.
|
||||
|
||||
|
||||
|
||||
===Is GF backward compatible?===
|
||||
|
||||
|
||||
|
||||
===Do I need Haskell to use GF?===
|
||||
|
||||
No. GF is a language of its own, and you don't need to know Haskell. And if you download the GF binary, you don't need any Haskell tools. But if you want to
|
||||
become a GF developer, then it's better you install GF from the latest source, and then you need the GHC Haskell compiler to compile GF. But even then, you
|
||||
don't need to know Haskell yourself.
|
||||
|
||||
|
||||
===What is a lock field?===
|
||||
|
||||
@@ -68,9 +68,9 @@ metavariables and the type of the expression.
|
||||
Prints a set of strings in the .dot format (the graphviz format).
|
||||
The graph can be saved in a file by the wf command as usual.
|
||||
If the -view flag is defined, the graph is saved in a temporary file
|
||||
which is processed by graphviz and displayed by the program indicated
|
||||
by the flag. The target format is postscript, unless overridden by the
|
||||
flag -format.
|
||||
which is processed by 'dot' (graphviz) and displayed by the program indicated
|
||||
by the view flag. The target format is png, unless overridden by the
|
||||
flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).
|
||||
|
||||
|
||||
- Options:
|
||||
@@ -151,6 +151,7 @@ of a pipe.
|
||||
| ``-one`` | pick the first strings, if there is any, from records and tables
|
||||
| ``-table`` | show all strings labelled by parameters
|
||||
| ``-unqual`` | hide qualifying module names
|
||||
| ``-trace`` | trace computations
|
||||
|
||||
|
||||
#NORMAL
|
||||
@@ -242,7 +243,7 @@ and thus cannot be a part of a pipe.
|
||||
|
||||
====e = empty====
|
||||
#NOINDENT
|
||||
``e`` = ``empty``: //empty the environment.//
|
||||
``e`` = ``empty``: //empty the environment (except the command history).//
|
||||
|
||||
#TINY
|
||||
|
||||
@@ -281,6 +282,19 @@ but the resulting .gf file must be imported separately.
|
||||
#NORMAL
|
||||
|
||||
|
||||
#VSPACE
|
||||
|
||||
====eh = execute_history====
|
||||
#NOINDENT
|
||||
``eh`` = ``execute_history``: //read commands from a file and execute them.//
|
||||
|
||||
#TINY
|
||||
|
||||
- Syntax: ``eh FILE``
|
||||
|
||||
#NORMAL
|
||||
|
||||
|
||||
#VSPACE
|
||||
|
||||
====gr = generate_random====
|
||||
@@ -434,12 +448,14 @@ sequences; see example.
|
||||
| ``-list`` | show all forms and variants, comma-separated on one line (cf. l -all)
|
||||
| ``-multi`` | linearize to all languages (default)
|
||||
| ``-table`` | show all forms labelled by parameters
|
||||
| ``-tabtreebank`` | show the tree and its linearizations on a tab-separated line
|
||||
| ``-treebank`` | show the tree and tag linearizations with language names
|
||||
| ``-bind`` | bind tokens separated by Prelude.BIND, i.e. &+
|
||||
| ``-chars`` | lexer that makes every non-space character a token
|
||||
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
||||
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
||||
| ``-from_arabic`` | from unicode to GF Arabic transliteration
|
||||
| ``-from_arabic_unvocalized`` | from unicode to GF unvocalized Arabic transliteration
|
||||
| ``-from_cp1251`` | decode from cp1251 (Cyrillic used in Bulgarian resource)
|
||||
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
||||
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
||||
@@ -453,11 +469,14 @@ sequences; see example.
|
||||
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
||||
| ``-from_utf8`` | decode from utf8 (default)
|
||||
| ``-lexcode`` | code-like lexer
|
||||
| ``-lexgreek`` | lexer normalizing ancient Greek accentuation
|
||||
| ``-lexgreek2`` | lexer normalizing ancient Greek accentuation for text with vowel length annotations
|
||||
| ``-lexmixed`` | mixture of text and code, as in LaTeX (code between $...$, \(...)\, \[...\])
|
||||
| ``-lextext`` | text-like lexer
|
||||
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
||||
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
||||
| ``-to_arabic`` | from GF Arabic transliteration to unicode
|
||||
| ``-to_arabic_unvocalized`` | from GF unvocalized Arabic transliteration to unicode
|
||||
| ``-to_cp1251`` | encode to cp1251 (Cyrillic used in Bulgarian resource)
|
||||
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
||||
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
||||
@@ -473,6 +492,7 @@ sequences; see example.
|
||||
| ``-to_utf8`` | encode to utf8 (default)
|
||||
| ``-unchars`` | unlexer that puts no spaces between tokens
|
||||
| ``-unlexcode`` | code-like unlexer
|
||||
| ``-unlexgreek`` | unlexer de-normalizing ancient Greek accentuation
|
||||
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
||||
| ``-unlextext`` | text-like unlexer
|
||||
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
||||
@@ -513,6 +533,7 @@ trees where a function node is a metavariable.
|
||||
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
||||
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
||||
| ``-from_arabic`` | from unicode to GF Arabic transliteration
|
||||
| ``-from_arabic_unvocalized`` | from unicode to GF unvocalized Arabic transliteration
|
||||
| ``-from_cp1251`` | decode from cp1251 (Cyrillic used in Bulgarian resource)
|
||||
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
||||
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
||||
@@ -526,11 +547,14 @@ trees where a function node is a metavariable.
|
||||
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
||||
| ``-from_utf8`` | decode from utf8 (default)
|
||||
| ``-lexcode`` | code-like lexer
|
||||
| ``-lexgreek`` | lexer normalizing ancient Greek accentuation
|
||||
| ``-lexgreek2`` | lexer normalizing ancient Greek accentuation for text with vowel length annotations
|
||||
| ``-lexmixed`` | mixture of text and code, as in LaTeX (code between $...$, \(...)\, \[...\])
|
||||
| ``-lextext`` | text-like lexer
|
||||
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
||||
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
||||
| ``-to_arabic`` | from GF Arabic transliteration to unicode
|
||||
| ``-to_arabic_unvocalized`` | from GF unvocalized Arabic transliteration to unicode
|
||||
| ``-to_cp1251`` | encode to cp1251 (Cyrillic used in Bulgarian resource)
|
||||
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
||||
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
||||
@@ -546,6 +570,7 @@ trees where a function node is a metavariable.
|
||||
| ``-to_utf8`` | encode to utf8 (default)
|
||||
| ``-unchars`` | unlexer that puts no spaces between tokens
|
||||
| ``-unlexcode`` | code-like unlexer
|
||||
| ``-unlexgreek`` | unlexer de-normalizing ancient Greek accentuation
|
||||
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
||||
| ``-unlextext`` | text-like unlexer
|
||||
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
||||
@@ -666,10 +691,9 @@ command (flag -printer):
|
||||
fa finite automaton in graphviz format
|
||||
gsl Nuance speech recognition format
|
||||
haskell Haskell (abstract syntax)
|
||||
java Java (abstract syntax)
|
||||
js JavaScript (whole grammar)
|
||||
jsgf JSGF speech recognition format
|
||||
lambda_prolog LambdaProlog (abstract syntax)
|
||||
lp_byte_code Bytecode for Teyjus (abstract syntax, experimental)
|
||||
pgf_pretty human-readable pgf
|
||||
prolog Prolog (whole grammar)
|
||||
python Python (whole grammar)
|
||||
@@ -753,6 +777,7 @@ To see transliteration tables, use command ut.
|
||||
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
||||
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
||||
| ``-from_arabic`` | from unicode to GF Arabic transliteration
|
||||
| ``-from_arabic_unvocalized`` | from unicode to GF unvocalized Arabic transliteration
|
||||
| ``-from_cp1251`` | decode from cp1251 (Cyrillic used in Bulgarian resource)
|
||||
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
||||
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
||||
@@ -766,11 +791,14 @@ To see transliteration tables, use command ut.
|
||||
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
||||
| ``-from_utf8`` | decode from utf8 (default)
|
||||
| ``-lexcode`` | code-like lexer
|
||||
| ``-lexgreek`` | lexer normalizing ancient Greek accentuation
|
||||
| ``-lexgreek2`` | lexer normalizing ancient Greek accentuation for text with vowel length annotations
|
||||
| ``-lexmixed`` | mixture of text and code, as in LaTeX (code between $...$, \(...)\, \[...\])
|
||||
| ``-lextext`` | text-like lexer
|
||||
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
||||
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
||||
| ``-to_arabic`` | from GF Arabic transliteration to unicode
|
||||
| ``-to_arabic_unvocalized`` | from GF unvocalized Arabic transliteration to unicode
|
||||
| ``-to_cp1251`` | encode to cp1251 (Cyrillic used in Bulgarian resource)
|
||||
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
||||
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
||||
@@ -786,6 +814,7 @@ To see transliteration tables, use command ut.
|
||||
| ``-to_utf8`` | encode to utf8 (default)
|
||||
| ``-unchars`` | unlexer that puts no spaces between tokens
|
||||
| ``-unlexcode`` | code-like unlexer
|
||||
| ``-unlexgreek`` | unlexer de-normalizing ancient Greek accentuation
|
||||
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
||||
| ``-unlextext`` | text-like unlexer
|
||||
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
||||
@@ -799,13 +828,14 @@ To see transliteration tables, use command ut.
|
||||
|
||||
- Examples:
|
||||
|
||||
| ``l (EAdd 3 4) | ps -code`` | linearize code-like output
|
||||
| ``ps -lexer=code | p -cat=Exp`` | parse code-like input
|
||||
| ``l (EAdd 3 4) | ps -unlexcode`` | linearize code-like output
|
||||
| ``ps -lexcode | p -cat=Exp`` | parse code-like input
|
||||
| ``gr -cat=QCl | l | ps -bind`` | linearization output from LangFin
|
||||
| ``ps -to_devanagari "A-p"`` | show Devanagari in UTF8 terminal
|
||||
| ``rf -file=Hin.gf | ps -env=quotes -to_devanagari`` | convert translit to UTF8
|
||||
| ``rf -file=Ara.gf | ps -from_utf8 -env=quotes -from_arabic`` | convert UTF8 to transliteration
|
||||
| ``ps -to=chinese.trans "abc"`` | apply transliteration defined in file chinese.trans
|
||||
| ``ps -lexgreek "a)gavoi` a)'nvrwpoi' tines*"`` | normalize ancient greek accentuation
|
||||
|
||||
|
||||
#NORMAL
|
||||
@@ -828,7 +858,6 @@ are type checking and semantic computation.
|
||||
- Options:
|
||||
|
||||
| ``-compute`` | compute by using semantic definitions (def)
|
||||
| ``-paraphrase`` | paraphrase by using semantic definitions (def)
|
||||
| ``-largest`` | sort trees from largest to smallest, in number of nodes
|
||||
| ``-nub`` | remove duplicate trees
|
||||
| ``-smallest`` | sort trees from smallest to largest, in number of nodes
|
||||
@@ -838,12 +867,10 @@ are type checking and semantic computation.
|
||||
- Flags:
|
||||
|
||||
| ``-number`` | take at most this many trees
|
||||
| ``-transfer`` | syntactic transfer by applying function, recursively in subtrees
|
||||
|
||||
- Examples:
|
||||
|
||||
| ``pt -compute (plus one two)`` | compute value
|
||||
| ``p "4 dogs love 5 cats" | pt -transfer=digits2numeral | l`` | four...five...
|
||||
|
||||
|
||||
#NORMAL
|
||||
@@ -990,8 +1017,6 @@ This command requires a source grammar to be in scope, imported with 'import -re
|
||||
The operations include the parameter constructors that are in scope.
|
||||
The optional TYPE filters according to the value type.
|
||||
The grep STRINGs filter according to other substrings of the type signatures.
|
||||
This command must be a line of its own, and thus cannot be a part
|
||||
of a pipe.
|
||||
|
||||
- Syntax: ``so (-grep=STRING)* TYPE?``
|
||||
- Options:
|
||||
@@ -1002,6 +1027,12 @@ of a pipe.
|
||||
|
||||
| ``-grep`` | substring used for filtering (the command can have many of these)
|
||||
|
||||
- Examples:
|
||||
|
||||
| ``so Det`` | show all opers that create a Det
|
||||
| ``so -grep=Prep`` | find opers relating to Prep
|
||||
| ``so | wf -file=/tmp/opers`` | write the list of opers to a file
|
||||
|
||||
|
||||
#NORMAL
|
||||
|
||||
@@ -1113,6 +1144,7 @@ This command must be a line of its own, and thus cannot be a part of a pipe.
|
||||
| ``-amharic`` | Amharic
|
||||
| ``-ancientgreek`` | ancient Greek
|
||||
| ``-arabic`` | Arabic
|
||||
| ``-arabic_unvocalized`` | unvocalized Arabic
|
||||
| ``-devanagari`` | Devanagari
|
||||
| ``-greek`` | modern Greek
|
||||
| ``-hebrew`` | unvocalized Hebrew
|
||||
@@ -1137,35 +1169,41 @@ This command must be a line of its own, and thus cannot be a part of a pipe.
|
||||
#TINY
|
||||
|
||||
Prints a dependency tree in the .dot format (the graphviz format, default)
|
||||
or LaTeX (flag -output=latex)
|
||||
or the CoNLL/MaltParser format (flag -output=conll for training, malt_input
|
||||
for unanalysed input).
|
||||
By default, the last argument is the head of every abstract syntax
|
||||
function; moreover, the head depends on the head of the function above.
|
||||
The graph can be saved in a file by the wf command as usual.
|
||||
If the -view flag is defined, the graph is saved in a temporary file
|
||||
which is processed by graphviz and displayed by the program indicated
|
||||
by the flag. The target format is png, unless overridden by the
|
||||
flag -format.
|
||||
which is processed by dot (graphviz) and displayed by the program indicated
|
||||
by the view flag. The target format is png, unless overridden by the
|
||||
flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).
|
||||
See also 'vp -showdep' for another visualization of dependencies.
|
||||
|
||||
|
||||
- Options:
|
||||
|
||||
| ``-v`` | show extra information
|
||||
| ``-conll2latex`` | convert conll to latex
|
||||
|
||||
- Flags:
|
||||
|
||||
| ``-file`` | configuration file for labels per fun, format 'fun l1 ... label ... l2'
|
||||
| ``-format`` | format of the visualization file (default "png")
|
||||
| ``-output`` | output format of graph source (default "dot")
|
||||
| ``-view`` | program to open the resulting file (default "open")
|
||||
| ``-abslabels`` | abstract configuration file for labels, format per line 'fun label*'
|
||||
| ``-cnclabels`` | concrete configuration file for labels, format per line 'fun {words|*} pos label head'
|
||||
| ``-file`` | same as abslabels (abstract configuration file)
|
||||
| ``-format`` | format of the visualization file using dot (default "png")
|
||||
| ``-output`` | output format of graph source (latex, conll, dot (default but deprecated))
|
||||
| ``-view`` | program to open the resulting graph file (default "open")
|
||||
| ``-lang`` | the language of analysis
|
||||
|
||||
- Examples:
|
||||
|
||||
| ``gr | vd`` | generate a tree and show dependency tree in .dot
|
||||
| ``gr | vd -view=open`` | generate a tree and display dependency tree on a Mac
|
||||
| ``gr -number=1000 | vd -file=dep.labels -output=malt`` | generate training treebank
|
||||
| ``gr -number=100 | vd -file=dep.labels -output=malt_input`` | generate test sentences
|
||||
| ``gr | vd -view=open`` | generate a tree and display dependency tree on with Mac's 'open'
|
||||
| ``gr | vd -view=open -output=latex`` | generate a tree and display latex dependency tree with Mac's 'open'
|
||||
| ``gr -number=1000 | vd -abslabels=Lang.labels -cnclabels=LangSwe.labels -output=conll`` | generate a random treebank
|
||||
| ``rf -file=ex.conll | vd -conll2latex | wf -file=ex.tex`` | convert conll file to latex
|
||||
|
||||
|
||||
#NORMAL
|
||||
@@ -1182,15 +1220,16 @@ flag -format.
|
||||
Prints a parse tree in the .dot format (the graphviz format).
|
||||
The graph can be saved in a file by the wf command as usual.
|
||||
If the -view flag is defined, the graph is saved in a temporary file
|
||||
which is processed by graphviz and displayed by the program indicated
|
||||
by the flag. The target format is png, unless overridden by the
|
||||
flag -format.
|
||||
which is processed by dot (graphviz) and displayed by the program indicated
|
||||
by the view flag. The target format is png, unless overridden by the
|
||||
flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).
|
||||
|
||||
|
||||
- Options:
|
||||
|
||||
| ``-showcat`` | show categories in the tree nodes (default)
|
||||
| ``-nocat`` | don't show categories
|
||||
| ``-showdep`` | show dependency labels
|
||||
| ``-showfun`` | show function names in the tree nodes
|
||||
| ``-nofun`` | don't show function names (default)
|
||||
| ``-showleaves`` | show the leaves of the tree (default)
|
||||
@@ -1198,6 +1237,8 @@ flag -format.
|
||||
|
||||
- Flags:
|
||||
|
||||
| ``-lang`` | the language to visualize
|
||||
| ``-file`` | configuration file for dependency labels with -deps, format per line 'fun label*'
|
||||
| ``-format`` | format of the visualization file (default "png")
|
||||
| ``-view`` | program to open the resulting file (default "open")
|
||||
| ``-nodefont`` | font for tree nodes (default: Times -- graphviz standard font)
|
||||
@@ -1210,7 +1251,8 @@ flag -format.
|
||||
- Examples:
|
||||
|
||||
| ``p "John walks" | vp`` | generate a tree and show parse tree as .dot script
|
||||
| ``gr | vp -view="open"`` | generate a tree and display parse tree on a Mac
|
||||
| ``gr | vp -view=open`` | generate a tree and display parse tree on a Mac
|
||||
| ``p "she loves us" | vp -view=open -showdep -file=uddeps.labels -nocat`` | show a visual variant of a dependency tree
|
||||
|
||||
|
||||
#NORMAL
|
||||
@@ -1227,9 +1269,9 @@ flag -format.
|
||||
Prints a set of trees in the .dot format (the graphviz format).
|
||||
The graph can be saved in a file by the wf command as usual.
|
||||
If the -view flag is defined, the graph is saved in a temporary file
|
||||
which is processed by graphviz and displayed by the program indicated
|
||||
by the flag. The target format is postscript, unless overridden by the
|
||||
flag -format.
|
||||
which is processed by dot (graphviz) and displayed by the command indicated
|
||||
by the view flag. The target format is postscript, unless overridden by the
|
||||
flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).
|
||||
With option -mk, use for showing library style function names of form 'mkC'.
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
@@ -1,132 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>GF People</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel=stylesheet href="../css/style.css">
|
||||
<meta name = "viewport" content = "width = device-width">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<IMG SRC="Logos/gf0.png" alt="[GF]">
|
||||
|
||||
<h1>Grammatical Framework: Authors and Acknowledgements</h1>
|
||||
|
||||
</center>
|
||||
|
||||
The current developers and maintainers are
|
||||
<a href="http://www.chalmers.se/cse/EN/organization/divisions/computing-science/people/angelov-krasimir">Krasimir Angelov</a>,
|
||||
<a href="http://www.cse.chalmers.se/~hallgren/">Thomas Hallgren</a>,
|
||||
and
|
||||
<a href="http://www.cse.chalmers.se/~aarne/">Aarne Ranta</a>. Bug reports should be
|
||||
posted via the
|
||||
<a href="http://code.google.com/p/grammatical-framework/issues/list">GF bug tracker</a>.
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
Also the following people have contributed code to some of the versions:
|
||||
|
||||
<dl>
|
||||
|
||||
<dt>Grégoire Détrez (University of Gothenburg)
|
||||
<dt>Ramona Enache (University of Gothenburg)
|
||||
<dt>
|
||||
<a href="http://www.cse.chalmers.se/alumni/bringert">Björn Bringert</a> (University of Gothenburg)
|
||||
<dt>
|
||||
Håkan Burden (University of Gothenburg)
|
||||
<dt>
|
||||
Hans-Joachim Daniels (Karlsruhe)
|
||||
<dt>
|
||||
<a href="http://www.cs.chalmers.se/~markus">Markus Forsberg</a> (Chalmers)
|
||||
<dt>
|
||||
<a href="http://www.cs.chalmers.se/~krijo">Kristofer Johannisson</a> (University of Gothenburg)
|
||||
<dt>
|
||||
<a href="http://www.cs.chalmers.se/~janna">Janna Khegai</a> (Chalmers)
|
||||
<dt>
|
||||
<a href="http://www.cse.chalmers.se/~peb">Peter Ljunglöf</a> (University of Gothenburg)
|
||||
<dt>
|
||||
Petri Mäenpää (Nokia)
|
||||
</dl>
|
||||
|
||||
|
||||
At least the following colleagues are thanked for suggestions,
|
||||
bug reports, and other indirect contributions to the code. (Notice:
|
||||
these are early contributors - the list has not been updated since 2004 or so).
|
||||
|
||||
<p>
|
||||
|
||||
<a href="http://www.di.unito.it/~stefano/">Stefano Berardi</a> (Torino),
|
||||
|
||||
Pascal Boldini (Paris),
|
||||
|
||||
<a href="http://www.dur.ac.uk/~dcs0pcc/">Paul Callaghan</a> (Durham),
|
||||
|
||||
Lauri Carlson (Helsinki),
|
||||
|
||||
<a href="http://www.cse.chalmers.se/~koen">Koen Claessen</a> (Chalmers),
|
||||
|
||||
<a href="http://www.cling.gu.se/~cooper">Robin Cooper</a> (Gothenburg),
|
||||
|
||||
<a href="http://www.cse.chalmers.se/~coquand">Thierry Coquand</a> (Chalmers),
|
||||
|
||||
<a
|
||||
href="http://www.xrce.xerox.com/people/dymetman/dymetman.html">Marc
|
||||
Dymetman</a> (XRCE),
|
||||
|
||||
Bertrand Grégoire (Tudor Institure, Luxembourg),
|
||||
|
||||
<a href="http://www.cse.chalmers.se/~reiner">Reiner Hähnle</a> (Chalmers),
|
||||
|
||||
<a href="http://pauillac.inria.fr/~huet/">Gérard Huet</a> (INRIA),
|
||||
|
||||
<a href="http://www.cse.chalmers.se/~patrikj">Patrik Jansson</a> (Chalmers),
|
||||
|
||||
Bernard Jaulin (Paris),
|
||||
|
||||
<a href="http://www.xrce.xerox.com/people/karttunen/karttunen.html">
|
||||
Lauri Karttunen</a> (PARC),
|
||||
|
||||
Matti Kinnunen (Nokia),
|
||||
|
||||
<a
|
||||
href="http://www.xrce.xerox.com/people/lux/">Veronika
|
||||
Lux</a> (XRCE),
|
||||
|
||||
Per Martin-Löf (Stockholm),
|
||||
|
||||
<a href="http://www.cse.chalmers.se/~bengt">Bengt Nordström</a> (Chalmers),
|
||||
|
||||
<a
|
||||
href="http://www.cis.uni-muenchen.de/studenten/stud_homepages/okrslar/reklame.html">
|
||||
Martin Okrslar</a> (CIS),
|
||||
|
||||
Jianmin Pang (Durham),
|
||||
|
||||
<a
|
||||
href="http://www.xrce.xerox.com/people/pogodalla/index.fr.html">Sylvain
|
||||
Pogodalla</a> (XRCE),
|
||||
|
||||
<a href="http://www.inria.fr/Loic.Pottier">Loïc Pottier</a> (INRIA),
|
||||
|
||||
|
||||
<a href="http://www2.parc.com/istl/members/zaenen/">Annie Zaenen</a> (PARC)
|
||||
|
||||
<p>
|
||||
|
||||
The GF logo was designed by Uula Ranta.
|
||||
|
||||
<p>
|
||||
|
||||
From 2001 to 2004, GF enjoyed funding from the
|
||||
<a href="http://www.vinnova.se">Vinnova</a> foundation, within the
|
||||
<a href="http://www.cse.chalmers.se/research/group/Language-technology/ILT.html">
|
||||
Interactive Languge Technology</a> project.
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
64
doc/gf-people.md
Normal file
64
doc/gf-people.md
Normal file
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: "Grammatical Framework: Authors and Acknowledgements"
|
||||
---
|
||||
|
||||
## Current maintainers
|
||||
|
||||
The current maintainers of GF are
|
||||
|
||||
[Krasimir Angelov](http://www.chalmers.se/cse/EN/organization/divisions/computing-science/people/angelov-krasimir),
|
||||
[Aarne Ranta](http://www.cse.chalmers.se/~aarne/),
|
||||
[John J. Camilleri](http://johnjcamilleri.com), and
|
||||
[Inari Listenmaa](https://inariksit.github.io/).
|
||||
|
||||
This page is otherwise not up to date.
|
||||
For detailed data about contributors to the code repositories since 2007, see
|
||||
[here (gf-core)](https://github.com/GrammaticalFramework/gf-core/graphs/contributors)
|
||||
and
|
||||
[here (gf-rgl)](https://github.com/GrammaticalFramework/gf-rgl/graphs/contributors).
|
||||
|
||||
## Previous contributors
|
||||
|
||||
The following people have contributed code to some of the versions:
|
||||
|
||||
- [Thomas Hallgren](http://www.cse.chalmers.se/~hallgren/) (University of Gothenburg)
|
||||
- Grégoire Détrez (University of Gothenburg)
|
||||
- Ramona Enache (University of Gothenburg)
|
||||
- [Björn Bringert](http://www.cse.chalmers.se/alumni/bringert) (University of Gothenburg)
|
||||
- Håkan Burden (University of Gothenburg)
|
||||
- Hans-Joachim Daniels (Karlsruhe)
|
||||
- [Markus Forsberg](http://www.cs.chalmers.se/~markus) (Chalmers)
|
||||
- [Kristofer Johannisson](http://www.cs.chalmers.se/~krijo) (University of Gothenburg)
|
||||
- [Janna Khegai](http://www.cs.chalmers.se/~janna) (Chalmers)
|
||||
- [Peter Ljunglöf](http://www.cse.chalmers.se/~peb) (University of Gothenburg)
|
||||
- Petri Mäenpää (Nokia)
|
||||
- Lauri Alanko (University of Helsinki)
|
||||
|
||||
At least the following colleagues are thanked for suggestions, bug
|
||||
reports, and other indirect contributions to the code.
|
||||
|
||||
- [Stefano Berardi](http://www.di.unito.it/~stefano/) (Torino)
|
||||
- Pascal Boldini (Paris)
|
||||
- [Paul Callaghan](http://www.dur.ac.uk/~dcs0pcc/) (Durham)
|
||||
- Lauri Carlson (Helsinki)
|
||||
- [Koen Claessen](http://www.cse.chalmers.se/~koen) (Chalmers)
|
||||
- [Robin Cooper](http://www.cling.gu.se/~cooper) (Gothenburg)
|
||||
- [Thierry Coquand](http://www.cse.chalmers.se/~coquand) (Chalmers)
|
||||
- [Marc Dymetman](http://www.xrce.xerox.com/people/dymetman/dymetman.html) (XRCE)
|
||||
- Bertrand Grégoire (Tudor Institute, Luxembourg)
|
||||
- [Reiner Hähnle](http://www.cse.chalmers.se/~reiner) (Chalmers)
|
||||
- [Gérard Huet](http://pauillac.inria.fr/~huet/) (INRIA)
|
||||
- [Patrik Jansson](http://www.cse.chalmers.se/~patrikj) (Chalmers)
|
||||
- Bernard Jaulin (Paris)
|
||||
- [Lauri Karttunen](http://www.xrce.xerox.com/people/karttunen/karttunen.html) (PARC)
|
||||
- Matti Kinnunen (Nokia)
|
||||
- [Veronika Lux](http://www.xrce.xerox.com/people/lux/) (XRCE)
|
||||
- Per Martin-Löf (Stockholm)
|
||||
- [Bengt Nordström](http://www.cse.chalmers.se/~bengt) (Chalmers)
|
||||
- [Martin Okrslar](http://www.cis.uni-muenchen.de/studenten/stud_homepages/okrslar/reklame.html) (CIS)
|
||||
- Jianmin Pang (Durham)
|
||||
- [Sylvain Pogodalla](http://www.xrce.xerox.com/people/pogodalla/index.fr.html) (XRCE)
|
||||
- [Loïc Pottier](http://www.inria.fr/Loic.Pottier) (INRIA)
|
||||
- [Annie Zaenen](http://www2.parc.com/istl/members/zaenen/) (PARC)
|
||||
|
||||
The GF logo was designed by Uula Ranta.
|
||||
@@ -1,158 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>GF Quickstart</title>
|
||||
<link rel=stylesheet href="../css/style.css">
|
||||
<meta name = "viewport" content = "width = device-width">
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<img src="Logos/gf0.png">
|
||||
<p>
|
||||
Aarne Ranta
|
||||
<p>
|
||||
October 2011 for GF 3.3
|
||||
|
||||
<p>
|
||||
|
||||
<h1>Grammatical Framework Quick Start</h1>
|
||||
|
||||
</center>
|
||||
|
||||
This Quick Start shows a few examples of how GF can be used.
|
||||
We assume that you have downloaded and installed GF, so that
|
||||
the command <tt>gf</tt> works for you. See download and install
|
||||
instructions <a href="../download/index.html">here</a>.
|
||||
|
||||
<h2>Want to try without downloading?</h2>
|
||||
|
||||
<a href="../demos/phrasebook/">Using GF translation</a> with an existing grammar.
|
||||
|
||||
<p>
|
||||
|
||||
<a href="../demos/gfse/">Writing GF grammars</a> in the cloud, without installing GF.
|
||||
|
||||
|
||||
|
||||
|
||||
<h2>Using GF for translation and generation</h2>
|
||||
|
||||
When you have downloaded and installed GF:
|
||||
<ol>
|
||||
<li> Copy the files
|
||||
<a href="../examples/tutorial/food/Food.gf"><tt>Food.gf</tt></a>,
|
||||
<a href="../examples/tutorial/food/FoodEng.gf"><tt>FoodEng.gf</tt></a>, and
|
||||
<a href="../examples/tutorial/food/FoodIta.gf"><tt>FoodIta.gf</tt></a>.
|
||||
Or go to <tt>GF/examples/tutorial/food/</tt>, if you have downloaded the
|
||||
GF sources.
|
||||
|
||||
<li> Start GF with the shell command (without the prompt <tt>$</tt>)
|
||||
<pre>
|
||||
$ gf FoodIta.gf FoodEng.gf
|
||||
</pre>
|
||||
Alternatively, start GF with <tt>gf</tt> and give the GF command <tt>import FoodIta.gf FoodEng.gf</tt>.
|
||||
|
||||
<li> <b>Translation</b>. Try your first translation by giving the GF command
|
||||
<pre>
|
||||
parse "this cheese is very very Italian" | linearize
|
||||
</pre>
|
||||
Notice that the parser accept the tabulator for word completion.
|
||||
|
||||
<li> <b>Generation</b>. Random-generate sentences in two languages:
|
||||
<pre>
|
||||
generate_random | linearize
|
||||
</pre>
|
||||
|
||||
<li> <b>Other commands</b>. Use the help command
|
||||
<pre>
|
||||
help
|
||||
</pre>
|
||||
<li> <b>More examples</b>. Go to <tt>GF/examples/phrasebook</tt> or some other
|
||||
subdirectory of <tt>GF/examples/</tt>. Or try a resource grammar by, for instance,
|
||||
<pre>
|
||||
import alltenses/LangEng.gfo alltenses/LangGer.gfo
|
||||
|
||||
parse -lang=Eng "I love you" | linearize -treebank
|
||||
</pre>
|
||||
The resource grammars are found relative to the value of <tt>GF_LIB_PATH</tt>, which
|
||||
you may have to set; see <a href="../download/index.html">here</a> for instructions.
|
||||
|
||||
|
||||
|
||||
</ol>
|
||||
|
||||
|
||||
|
||||
<h2>Grammar development</h2>
|
||||
|
||||
Add words to the <tt>Food</tt>
|
||||
grammars and try the above commands again. For instance, add the following lines:
|
||||
<pre>
|
||||
Bread : Kind ; -- in Food.gf
|
||||
Bread = {s = "bread"} ; -- in FoodEng.gf
|
||||
Bread = {s = "pane"} ; -- in FoodIta.gf
|
||||
</pre>
|
||||
and start GF again with the same command. Now you can even translate
|
||||
<i>this bread is very Italian</i>.
|
||||
</ol>
|
||||
To lear more on GF commands and
|
||||
grammar development, go to the one of the tutorials:
|
||||
<ul>
|
||||
<li> <a href="tutorial/gf-tutorial.html">GF Tutorial</a>: older, more programmer-oriented
|
||||
<li> <a href="gf-lrec-2010.pdf">GF Resource Tutorial</a>: newer, more linguist-oriented
|
||||
</ul>
|
||||
To learn about how GF is used for easily writing grammars for 16 languages, consult the
|
||||
<ul>
|
||||
<li> <a href="../lib/doc/synopsis.html">GF Resource Grammar Library</a>.
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
<h2>Run-time grammars and web applications</h2>
|
||||
|
||||
GF has its own "machine language", PGF (Portable Grammar Format),
|
||||
which is recommended for use in applications at run time. To produce a PGF file from
|
||||
the two grammars above, do
|
||||
<pre>
|
||||
gf -make FoodIta.gf FoodEng.gf
|
||||
wrote Food.pgf
|
||||
</pre>
|
||||
You can use this in Haskell and Java programs, and also on web services, such as
|
||||
<ul>
|
||||
<li> the
|
||||
<a href="http://cloud.grammaticalframework.org/minibar/minibar.html">minibar</a>
|
||||
fridge magnets
|
||||
</ul>
|
||||
|
||||
The quickest way to provide a GF web service is to start GF with the <tt>-server</tt> option:
|
||||
<pre>
|
||||
$ gf -server
|
||||
This is GF version 3.3
|
||||
Built on linux/i386 with ghc-7.0, flags: interrupt server cclazy
|
||||
Document root = /usr/local/share/gf-3.3/www
|
||||
Starting HTTP server, open http://localhost:41296/ in your web browser.
|
||||
</pre>
|
||||
You can view it locally by pointing your
|
||||
browser to the URL shown. You can add your own <tt>.pgf</tt> grammar to the service by
|
||||
copying it over to the <tt>documentRoot</tt> directory. Just push "reload" in
|
||||
your browser after each such update.
|
||||
|
||||
<p>
|
||||
|
||||
To build more customized web application, consult the
|
||||
<a href="http://code.google.com/p/grammatical-framework/wiki/SideBar?tm=6">developer wiki</a>.
|
||||
|
||||
|
||||
<h2>User group</h2>
|
||||
|
||||
You are welcome to join the <A HREF="http://groups.google.com/group/gf-dev">User Group</A>
|
||||
to get help and discuss GF-related issues!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
Binary file not shown.
@@ -1,493 +0,0 @@
|
||||
GF Quick Reference
|
||||
Aarne Ranta
|
||||
April 4, 2006
|
||||
|
||||
% NOTE: this is a txt2tags file.
|
||||
% Create an html file from this file using:
|
||||
% txt2tags -thtml gf-reference.t2t
|
||||
|
||||
%!style:../css/style.css
|
||||
%!target:html
|
||||
%!options: --toc
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
This is a quick reference on GF grammars. It aims to
|
||||
cover all forms of expression available when writing
|
||||
grammars. It assumes basic knowledge of GF, which
|
||||
can be acquired from the
|
||||
[GF Tutorial http://www.grammaticalframework.org/doc/tutorial/gf-tutorial.html].
|
||||
Help on GF commands is obtained on line by the
|
||||
help command (``help``), and help on invoking
|
||||
GF with (``gf -help``).
|
||||
|
||||
|
||||
===A complete example===
|
||||
|
||||
This is a complete example of a GF grammar divided
|
||||
into three modules in files. The grammar recognizes the
|
||||
phrases //one pizza// and //two pizzas//.
|
||||
|
||||
File ``Order.gf``:
|
||||
```
|
||||
abstract Order = {
|
||||
cat
|
||||
Order ;
|
||||
Item ;
|
||||
fun
|
||||
One, Two : Item -> Order ;
|
||||
Pizza : Item ;
|
||||
}
|
||||
```
|
||||
File ``OrderEng.gf`` (the top file):
|
||||
```
|
||||
--# -path=.:prelude
|
||||
concrete OrderEng of Order =
|
||||
open Res, Prelude in {
|
||||
flags startcat=Order ;
|
||||
lincat
|
||||
Order = SS ;
|
||||
Item = {s : Num => Str} ;
|
||||
lin
|
||||
One it = ss ("one" ++ it.s ! Sg) ;
|
||||
Two it = ss ("two" ++ it.s ! Pl) ;
|
||||
Pizza = regNoun "pizza" ;
|
||||
}
|
||||
```
|
||||
File ``Res.gf``:
|
||||
```
|
||||
resource Res = open Prelude in {
|
||||
param Num = Sg | Pl ;
|
||||
oper regNoun : Str -> {s : Num => Str} =
|
||||
\dog -> {s = table {
|
||||
Sg => dog ;
|
||||
_ => dog + "s"
|
||||
}
|
||||
} ;
|
||||
}
|
||||
```
|
||||
To use this example, do
|
||||
```
|
||||
% gf -- in shell: start GF
|
||||
> i OrderEng.gf -- in GF: import grammar
|
||||
> p "one pizza" -- parse string
|
||||
> l Two Pizza -- linearize tree
|
||||
```
|
||||
|
||||
|
||||
|
||||
===Modules and files===
|
||||
|
||||
One module per file.
|
||||
File named ``Foo.gf`` contains module named
|
||||
``Foo``.
|
||||
|
||||
Each module has the structure
|
||||
```
|
||||
moduletypename =
|
||||
Inherits ** -- optional
|
||||
open Opens in -- optional
|
||||
{ Judgements }
|
||||
```
|
||||
Inherits are names of modules of the same type.
|
||||
Inheritance can be restricted:
|
||||
```
|
||||
Mo[f,g], -- inherit only f,g from Mo
|
||||
Lo-[f,g] -- inheris all but f,g from Lo
|
||||
```
|
||||
Opens are possible in ``concrete`` and ``resource``.
|
||||
They are names of modules of these two types, possibly
|
||||
qualified:
|
||||
```
|
||||
(M = Mo), -- refer to f as M.f or Mo.f
|
||||
(Lo = Lo) -- refer to f as Lo.f
|
||||
```
|
||||
Module types and judgements in them:
|
||||
```
|
||||
abstract A -- cat, fun, def, data
|
||||
concrete C of A -- lincat, lin, lindef, printname
|
||||
resource R -- param, oper
|
||||
|
||||
interface I -- like resource, but can have
|
||||
oper f : T without definition
|
||||
instance J of I -- like resource, defines opers
|
||||
that I leaves undefined
|
||||
incomplete -- functor: concrete that opens
|
||||
concrete CI of A = one or more interfaces
|
||||
open I in ...
|
||||
concrete CJ of A = -- completion: concrete that
|
||||
CI with instantiates a functor by
|
||||
(I = J) instances of open interfaces
|
||||
```
|
||||
The forms
|
||||
``param``, ``oper``
|
||||
may appear in ``concrete`` as well, but are then
|
||||
not inherited to extensions.
|
||||
|
||||
All modules can moreover have ``flags`` and comments.
|
||||
Comments have the forms
|
||||
```
|
||||
-- till the end of line
|
||||
{- any number of lines between -}
|
||||
--# used for compiler pragmas
|
||||
```
|
||||
A ``concrete`` can be opened like a ``resource``.
|
||||
It is translated as follows:
|
||||
```
|
||||
cat C ---> oper C : Type =
|
||||
lincat C = T T ** {lock_C : {}}
|
||||
|
||||
fun f : G -> C ---> oper f : A* -> C* = \g ->
|
||||
lin f = t t g ** {lock_C = <>}
|
||||
```
|
||||
An ``abstract`` can be opened like an ``interface``.
|
||||
Any ``concrete`` of it then works as an ``instance``.
|
||||
|
||||
|
||||
|
||||
===Judgements===
|
||||
|
||||
```
|
||||
cat C -- declare category C
|
||||
cat C (x:A)(y:B x) -- dependent category C
|
||||
cat C A B -- same as C (x : A)(y : B)
|
||||
fun f : T -- declare function f of type T
|
||||
def f = t -- define f as t
|
||||
def f p q = t -- define f by pattern matching
|
||||
data C = f | g -- set f,g as constructors of C
|
||||
data f : A -> C -- same as
|
||||
fun f : A -> C; data C=f
|
||||
|
||||
lincat C = T -- define lin.type of cat C
|
||||
lin f = t -- define lin. of fun f
|
||||
lin f x y = t -- same as lin f = \x y -> t
|
||||
lindef C = \s -> t -- default lin. of cat C
|
||||
printname fun f = s -- printname shown in menus
|
||||
printname cat C = s -- printname shown in menus
|
||||
printname f = s -- same as printname fun f = s
|
||||
|
||||
param P = C | D Q R -- define parameter type P
|
||||
with constructors
|
||||
C : P, D : Q -> R -> P
|
||||
oper h : T = t -- define oper h of type T
|
||||
oper h = t -- omit type, if inferrable
|
||||
|
||||
flags p=v -- set value of flag p
|
||||
```
|
||||
Judgements are terminated by semicolons (``;``).
|
||||
Subsequent judgments of the same form may share the
|
||||
keyword:
|
||||
```
|
||||
cat C ; D ; -- same as cat C ; cat D ;
|
||||
```
|
||||
Judgements can also share RHS:
|
||||
```
|
||||
fun f,g : A -- same as fun f : A ; g : A
|
||||
```
|
||||
|
||||
|
||||
===Types===
|
||||
|
||||
Abstract syntax (in ``fun``):
|
||||
```
|
||||
C -- basic type, if cat C
|
||||
C a b -- basic type for dep. category
|
||||
(x : A) -> B -- dep. functions from A to B
|
||||
(_ : A) -> B -- nondep. functions from A to B
|
||||
(p,q : A) -> B -- same as (p : A)-> (q : A) -> B
|
||||
A -> B -- same as (_ : A) -> B
|
||||
Int -- predefined integer type
|
||||
Float -- predefined float type
|
||||
String -- predefined string type
|
||||
```
|
||||
Concrete syntax (in ``lincat``):
|
||||
```
|
||||
Str -- token lists
|
||||
P -- parameter type, if param P
|
||||
P => B -- table type, if P param. type
|
||||
{s : Str ; p : P}-- record type
|
||||
{s,t : Str} -- same as {s : Str ; t : Str}
|
||||
{a : A} **{b : B}-- record type extension, same as
|
||||
{a : A ; b : B}
|
||||
A * B * C -- tuple type, same as
|
||||
{p1 : A ; p2 : B ; p3 : C}
|
||||
Ints n -- type of n first integers
|
||||
```
|
||||
Resource (in ``oper``): all those of concrete, plus
|
||||
```
|
||||
Tok -- tokens (subtype of Str)
|
||||
A -> B -- functions from A to B
|
||||
Int -- integers
|
||||
Strs -- list of prefixes (for pre)
|
||||
PType -- parameter type
|
||||
Type -- any type
|
||||
```
|
||||
As parameter types, one can use any finite type:
|
||||
``P`` defined in ``param P``,
|
||||
``Ints n``, and record types of parameter types.
|
||||
|
||||
|
||||
|
||||
===Expressions===
|
||||
|
||||
Syntax trees = full function applications
|
||||
```
|
||||
f a b -- : C if fun f : A -> B -> C
|
||||
1977 -- : Int
|
||||
3.14 -- : Float
|
||||
"foo" -- : String
|
||||
```
|
||||
Higher-Order Abstract syntax (HOAS): functions as arguments:
|
||||
```
|
||||
F a (\x -> c) -- : C if a : A, c : C (x : B),
|
||||
fun F : A -> (B -> C) -> C
|
||||
```
|
||||
Tokens and token lists
|
||||
```
|
||||
"hello" -- : Tok, singleton Str
|
||||
"hello" ++ "world" -- : Str
|
||||
["hello world"] -- : Str, same as "hello" ++ "world"
|
||||
"hello" + "world" -- : Tok, computes to "helloworld"
|
||||
[] -- : Str, empty list
|
||||
```
|
||||
Parameters
|
||||
```
|
||||
Sg -- atomic constructor
|
||||
VPres Sg P2 -- applied constructor
|
||||
{n = Sg ; p = P3} -- record of parameters
|
||||
```
|
||||
Tables
|
||||
```
|
||||
table { -- by full branches
|
||||
Sg => "mouse" ;
|
||||
Pl => "mice"
|
||||
}
|
||||
table { -- by pattern matching
|
||||
Pl => "mice" ;
|
||||
_ => "mouse" -- wildcard pattern
|
||||
}
|
||||
table {
|
||||
n => regn n "cat" -- variable pattern
|
||||
}
|
||||
table Num {...} -- table given with arg. type
|
||||
table ["ox"; "oxen"] -- table as course of values
|
||||
\\_ => "fish" -- same as table {_ => "fish"}
|
||||
\\p,q => t -- same as \\p => \\q => t
|
||||
|
||||
t ! p -- select p from table t
|
||||
case e of {...} -- same as table {...} ! e
|
||||
```
|
||||
Records
|
||||
```
|
||||
{s = "Liz"; g = Fem} -- record in full form
|
||||
{s,t = "et"} -- same as {s = "et";t= "et"}
|
||||
{s = "Liz"} ** -- record extension: same as
|
||||
{g = Fem} {s = "Liz" ; g = Fem}
|
||||
|
||||
<a,b,c> -- tuple, same as {p1=a;p2=b;p3=c}
|
||||
```
|
||||
Functions
|
||||
```
|
||||
\x -> t -- lambda abstract
|
||||
\x,y -> t -- same as \x -> \y -> t
|
||||
\x,_ -> t -- binding not in t
|
||||
```
|
||||
Local definitions
|
||||
```
|
||||
let x : A = d in t -- let definition
|
||||
let x = d in t -- let defin, type inferred
|
||||
let x=d ; y=e in t -- same as
|
||||
let x=d in let y=e in t
|
||||
let {...} in t -- same as let ... in t
|
||||
|
||||
t where {...} -- same as let ... in t
|
||||
```
|
||||
Free variation
|
||||
```
|
||||
variants {x ; y} -- both x and y possible
|
||||
variants {} -- nothing possible
|
||||
```
|
||||
Prefix-dependent choices
|
||||
```
|
||||
pre {"a" ; "an" / v} -- "an" before v, "a" otherw.
|
||||
strs {"a" ; "i" ;"o"}-- list of condition prefixes
|
||||
```
|
||||
Typed expression
|
||||
```
|
||||
<t:T> -- same as t, to help type inference
|
||||
```
|
||||
Accessing bound variables in ``lin``: use fields ``$1, $2, $3,...``.
|
||||
Example:
|
||||
```
|
||||
fun F : (A : Set) -> (El A -> Prop) -> Prop ;
|
||||
lin F A B = {s = ["for all"] ++ A.s ++ B.$1 ++ B.s}
|
||||
```
|
||||
|
||||
|
||||
===Pattern matching===
|
||||
|
||||
These patterns can be used in branches of ``table`` and
|
||||
``case`` expressions. Patterns are matched in the order in
|
||||
which they appear in the grammar.
|
||||
```
|
||||
C -- atomic param constructor
|
||||
C p q -- param constr. applied to patterns
|
||||
x -- variable, matches anything
|
||||
_ -- wildcard, matches anything
|
||||
"foo" -- string
|
||||
56 -- integer
|
||||
{s = p ; y = q} -- record, matches extensions too
|
||||
<p,q> -- tuple, same as {p1=p ; p2=q}
|
||||
p | q -- disjunction, binds to first match
|
||||
x@p -- binds x to what p matches
|
||||
- p -- negation
|
||||
p + "s" -- sequence of two string patterns
|
||||
p* -- repetition of a string pattern
|
||||
```
|
||||
|
||||
===Sample library functions===
|
||||
|
||||
```
|
||||
-- lib/prelude/Predef.gf
|
||||
drop : Int -> Tok -> Tok -- drop prefix of length
|
||||
take : Int -> Tok -> Tok -- take prefix of length
|
||||
tk : Int -> Tok -> Tok -- drop suffix of length
|
||||
dp : Int -> Tok -> Tok -- take suffix of length
|
||||
occur : Tok -> Tok -> PBool -- test if substring
|
||||
occurs : Tok -> Tok -> PBool -- test if any char occurs
|
||||
show : (P:Type) -> P ->Tok -- param to string
|
||||
read : (P:Type) -> Tok-> P -- string to param
|
||||
toStr : (L:Type) -> L ->Str -- find "first" string
|
||||
|
||||
-- lib/prelude/Prelude.gf
|
||||
param Bool = True | False
|
||||
oper
|
||||
SS : Type -- the type {s : Str}
|
||||
ss : Str -> SS -- construct SS
|
||||
cc2 : (_,_ : SS) -> SS -- concat SS's
|
||||
optStr : Str -> Str -- string or empty
|
||||
strOpt : Str -> Str -- empty or string
|
||||
bothWays : Str -> Str -> Str -- X++Y or Y++X
|
||||
init : Tok -> Tok -- all but last char
|
||||
last : Tok -> Tok -- last char
|
||||
prefixSS : Str -> SS -> SS
|
||||
postfixSS : Str -> SS -> SS
|
||||
infixSS : Str -> SS -> SS -> SS
|
||||
if_then_else : (A : Type) -> Bool -> A -> A -> A
|
||||
if_then_Str : Bool -> Str -> Str -> Str
|
||||
```
|
||||
|
||||
|
||||
===Flags===
|
||||
|
||||
Flags can appear, with growing priority,
|
||||
- in files, judgement ``flags`` and without dash (``-``)
|
||||
- as flags to ``gf`` when invoked, with dash
|
||||
- as flags to various GF commands, with dash
|
||||
|
||||
|
||||
Some common flags used in grammars:
|
||||
```
|
||||
startcat=cat use this category as default
|
||||
|
||||
lexer=literals int and string literals recognized
|
||||
lexer=code like program code
|
||||
lexer=text like text: spacing, capitals
|
||||
lexer=textlit text, unknowns as string lits
|
||||
|
||||
unlexer=code like program code
|
||||
unlexer=codelit code, remove string lit quotes
|
||||
unlexer=text like text: punctuation, capitals
|
||||
unlexer=textlit text, remove string lit quotes
|
||||
unlexer=concat remove all spaces
|
||||
unlexer=bind remove spaces around "&+"
|
||||
|
||||
optimize=all_subs best for almost any concrete
|
||||
optimize=values good for lexicon concrete
|
||||
optimize=all usually good for resource
|
||||
optimize=noexpand for resource, if =all too big
|
||||
```
|
||||
For the full set of values for ``FLAG``,
|
||||
use on-line ``h -FLAG``.
|
||||
|
||||
|
||||
|
||||
===File import search paths===
|
||||
|
||||
Colon-separated list of directories searched in the
|
||||
given order:
|
||||
```
|
||||
--# -path=.:../abstract:../common:prelude
|
||||
```
|
||||
This can be (in order of increasing priority), as
|
||||
first line in the file, as flag to ``gf``
|
||||
when invoked, or as flag to the ``i`` command.
|
||||
The prefix ``--#`` is used only in files.
|
||||
|
||||
GF attempts to satisfy an ``import`` command by searching for the
|
||||
import filename in the above search paths, initially qualified
|
||||
relative to the current working directory. If the file is not found in
|
||||
that initial expansion, the search paths are re-qualified relative to
|
||||
the directories given in the ``GF_LIB_PATH`` environment variable. If
|
||||
``GF_LIB_PATH`` is not defined, its default value is
|
||||
``/usr/local/share/gf-3.9/lib`` (assuming you have GF version 3.9).
|
||||
|
||||
If your GF resource grammar libraries are installed somewhere else,
|
||||
you will want to set ``GF_LIB_PATH`` to point there instead. In a
|
||||
pinch, you can point to the ``GF/lib/src/`` folder in your clone of
|
||||
the GF source code repository.
|
||||
|
||||
Developers of resource grammars may find it useful to define multiple
|
||||
directories, colon-separated, in ``GF_LIB_PATH``.
|
||||
|
||||
|
||||
===Alternative grammar formats===
|
||||
|
||||
**Old GF** (before GF 2.0):
|
||||
all judgements in any kinds of modules,
|
||||
division into files uses ``include``s.
|
||||
A file ``Foo.gf`` is recognized as the old format
|
||||
if it lacks a module header.
|
||||
|
||||
**Context-free** (file ``foo.cf``). The form of rules is e.g.
|
||||
```
|
||||
Fun. S ::= NP "is" AP ;
|
||||
```
|
||||
If ``Fun`` is omitted, it is generated automatically.
|
||||
Rules must be one per line. The RHS can be empty.
|
||||
|
||||
**Extended BNF** (file ``foo.ebnf``). The form of rules is e.g.
|
||||
```
|
||||
S ::= (NP+ ("is" | "was") AP | V NP*) ;
|
||||
```
|
||||
where the RHS is a regular expression of categories
|
||||
and quoted tokens: ``"foo", CAT, T U, T|U, T*, T+, T?``, or empty.
|
||||
Rule labels are generated automatically.
|
||||
|
||||
|
||||
**Probabilistic grammars** (not a separate format).
|
||||
You can set the probability of a function ``f`` (in its value category) by
|
||||
```
|
||||
--# prob f 0.009
|
||||
```
|
||||
These are put into a file given to GF using the ``probs=File`` flag
|
||||
on command line. This file can be the grammar file itself.
|
||||
|
||||
**Example-based grammars** (file ``foo.gfe``). Expressions of the form
|
||||
```
|
||||
in Cat "example string"
|
||||
```
|
||||
are preprocessed by using a parser given by the flag
|
||||
```
|
||||
--# -resource=File
|
||||
```
|
||||
and the result is written to ``foo.gf``.
|
||||
|
||||
|
||||
===References===
|
||||
|
||||
[GF Homepage http://www.grammaticalframework.org/]
|
||||
|
||||
A. Ranta, Grammatical Framework: A Type-Theoretical Grammar Formalism.
|
||||
//The Journal of Functional Programming//, vol. 14:2. 2004, pp. 145-189.
|
||||
|
||||
4605
doc/gf-refman.html
4605
doc/gf-refman.html
File diff suppressed because it is too large
Load Diff
2787
doc/gf-refman.md
Normal file
2787
doc/gf-refman.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,8 @@
|
||||
The GF Software System
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!options(html): --toc
|
||||
%!options(html): --toc-level=4
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
%!postproc(html): "#VSPACE" "<hr>"
|
||||
%!postproc(html): "#NORMAL" ""
|
||||
%!postproc(html): "#TINY" ""
|
||||
@@ -13,7 +10,7 @@ The GF Software System
|
||||
|
||||
The GF software system implements the GF programming language. Its
|
||||
components are
|
||||
- the //compiler//,
|
||||
- the //compiler//,
|
||||
translating ``.gf`` source files to ``.gfo`` object files, to
|
||||
``.pgf`` run-time grammars, and to various other formats
|
||||
- the //run-time system//,
|
||||
@@ -43,7 +40,7 @@ The shell maintains a //state//, to which belong
|
||||
|
||||
|
||||
Unless file arguments are provided to the ``gf`` command, the shell starts in an
|
||||
empty state, with no grammars and no history.
|
||||
empty state, with no grammars and no history.
|
||||
|
||||
In the shell, a set of commands
|
||||
is available. Some of these commands may change the grammars in the state. The general
|
||||
@@ -59,7 +56,7 @@ syntax of commands is given by the following BNF grammar:
|
||||
ARGUMENT ::= QUOTED_STRING | TREE
|
||||
VALUE ::= IDENT | QUOTED_STRING
|
||||
```
|
||||
A command pipe is a sequence of commands interpreted in such a way
|
||||
A command pipe is a sequence of commands interpreted in such a way
|
||||
that the output of each command
|
||||
is send as input to the next. The option ``-tr`` causes GF to show a trace,
|
||||
i.e. the intermediate result of the command to which it is attached.
|
||||
@@ -69,7 +66,7 @@ executed one by one, in the order of appearance.
|
||||
|
||||
===GF shell commands===
|
||||
|
||||
The full set of GF shell commands is listed below with explanations.
|
||||
The full set of GF shell commands is listed below with explanations.
|
||||
This list can also be obtained in the GF shell by the command ``help -full``.
|
||||
|
||||
%!include: gf-help-full.txt
|
||||
@@ -77,14 +74,14 @@ This list can also be obtained in the GF shell by the command ``help -full``.
|
||||
==The GF batch compiler==
|
||||
|
||||
With the option ``-batch``, GF can be invoked in batch mode, i.e.
|
||||
without opening the shell, to compile files from ``.gf`` to ``.gfo``.
|
||||
The ``-s`` option ("silent") eliminates all messages except errors.
|
||||
without opening the shell, to compile files from ``.gf`` to ``.gfo``.
|
||||
The ``-s`` option ("silent") eliminates all messages except errors.
|
||||
```
|
||||
$ gf -batch -s LangIta.gf
|
||||
```
|
||||
With the option ``-make``, and as a set of
|
||||
top-level grammar files (with the same abstract syntax) as arguments,
|
||||
GF produces a ``.pgf`` file. The flag ``-optimize-pgf`` minimizes
|
||||
GF produces a ``.pgf`` file. The flag ``-optimize-pgf`` minimizes
|
||||
the size of the ``.pgf`` file, and is recommended for grammars to be shipped.
|
||||
```
|
||||
$ gf -make -optimize-pgf LangIta.gf LangEng.gf LangGer.gf
|
||||
@@ -107,5 +104,3 @@ To run GF from a //script//, redirection of standard input can be used:
|
||||
```
|
||||
The file ``script.gfs`` should then contain a sequence of GF commands, one per line.
|
||||
Unrecognized command lines are skipped without terminating GF.
|
||||
|
||||
|
||||
|
||||
35
doc/gf-video-tutorials.md
Normal file
35
doc/gf-video-tutorials.md
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: "Video tutorials"
|
||||
---
|
||||
|
||||
The GF [YouTube channel](https://www.youtube.com/channel/UCZ96DechSUVcXAhtOId9VVA) keeps a playlist of [all GF videos](https://www.youtube.com/playlist?list=PLrgqBB5thLeT15fUtJ8_Dtk8ppdtH90MK), and more specific playlists for narrower topics.
|
||||
If you make a video about GF, let us know and we'll add it to the suitable playlist(s)!
|
||||
|
||||
- [General introduction to GF](#general-introduction-to-gf)
|
||||
- [Beginner resources](#beginner-resources)
|
||||
- [Resource grammar tutorials](#resource-grammar-tutorials)
|
||||
|
||||
## General introduction to GF
|
||||
|
||||
These videos introduce GF at a high level, and present some use cases.
|
||||
|
||||
__Grammatical Framework: Formalizing the Grammars of the World__
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/x1LFbDQhbso" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
|
||||
__Aarne Ranta: Automatic Translation for Consumers and Producers__
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/An-AmFScw1o" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
|
||||
## Beginner resources
|
||||
|
||||
These videos show how to install GF on your computer (Mac or Windows), and how to play with simple grammars in a [Jupyter notebook](https://github.com/GrammaticalFramework/gf-binder) (any platform, hosted at [mybinder.org](https://mybinder.org)).
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/videoseries?list=PLrgqBB5thLeRa8eViJJnjT8jBhxqCPMF2" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
|
||||
## Resource grammar tutorials
|
||||
|
||||
These videos show incremental improvements to a [miniature version of the resource grammar](https://github.com/inariksit/comp-syntax-2020/tree/master/lab2/grammar/dummy#readme).
|
||||
They assume some prior knowledge of GF, roughly lessons 1-3 from the [GF tutorial](http://www.grammaticalframework.org/doc/tutorial/gf-tutorial.html).
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/videoseries?list=PLrgqBB5thLeTPkp88lnOmRtprCa8g0wX2" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
11
doc/hackers-guide/CompilationOverview.md
Normal file
11
doc/hackers-guide/CompilationOverview.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Compilation
|
||||
|
||||
The GF language is designed to be easy for the programmers to use but be able to run it efficiently we need to reduce it to a more low-level language. The goal of this chapter is to give an overview of the different steps in the compilation. The program transformation goes throught the following phases:
|
||||
|
||||
- renaming - here all identifiers in the grammar are made explicitly qualified. For example, if you had used the identifier PredVP somewhere, the compiler will search for a definition of that identifier in either the current module or in any of the modules imported from the current one. If a definition is found in, say in a module called Sentence, then the unqualified name PredVP will be replaced with the explicit qualification Sentence.PredVP. On the other hand, if the source program is already using an explicit qualification like Sentence.PredVP, then the compiler will check whether PredVP is indeed defined in the module Sentence.
|
||||
|
||||
- type checking - here the compiler will check whether all functions and variables are used correctly with respect to their types. For each term that the compiler checks it will also generate a new version of the term after the type checking. The input and output terms may not need to be the same. For example, the compiler may insert explicit type information. It might fill-in implicit arguments, or it may instantiate meta variables.
|
||||
|
||||
- partial evaluation - here is where the real compilation starts. The compiler will fully evaluate the term for each linearization to a normal. In the process, all uses of operations will be inlined. This is part of reducing the GF language to a simpler language which does not support operations.
|
||||
|
||||
- PMCFG generation - the language that the GF runtime understands is an extension of the PMCFG formalism. Not all features permitted in the GF language are allowed on that level. Most of the uses for that extra features have been eliminated via partial evaluation. If there are any left, then the compilation will abort. The main purpose of the PMCFG generation is to get rid of most of the parameter types in the source grammar. That is possible by generating several specialized linearization rules from a single linearization rule in the source.
|
||||
51
doc/hackers-guide/DESIDERATA.md
Normal file
51
doc/hackers-guide/DESIDERATA.md
Normal file
@@ -0,0 +1,51 @@
|
||||
This is an experiment to develop **a majestic new GF runtime**.
|
||||
|
||||
The reason is that there are several features that we want to have and they all require a major rewrite of the existing C runtime.
|
||||
Instead of beating the old code until it starts doing what we want, it is time to start from scratch.
|
||||
|
||||
# New Features
|
||||
|
||||
The features that we want are:
|
||||
|
||||
- We want to support **even bigger grammars that don't fit in the main memory** anymore. Instead, they should reside on the disc and parts will be loaded on demand.
|
||||
The current design is that all memory allocated for the grammars should be from memory-mapped files. In this way the only limit for the grammar size will
|
||||
be the size of the virtual memory, i.e. 2^64 bytes. The swap file is completely circumvented, while all of the available RAM can be used as a cache for loading parts
|
||||
of the grammar.
|
||||
|
||||
- We want to be able to **update grammars dynamically**. This is a highly desired feature since recompiling large grammars takes hours.
|
||||
Instead, dynamic updates should happen instantly.
|
||||
|
||||
- We want to be able to **store additional information in the PGF**. For example that could be application specific semantic data.
|
||||
Another example is to store the source code of the different grammar rules, to allow the compiler to recompile individual rules.
|
||||
|
||||
- We want to **allow a single file to contain slightly different versions of the grammar**. This will be a kind of a version control system,
|
||||
which will allow different users to store their own grammar extensions while still using the same core content.
|
||||
|
||||
- We want to **avoid the exponential explosion in the size of PMCFG** for some grammars. This happens because PMCFG as a formalism is too low-level.
|
||||
By enriching it with light-weight variables, we can make it more powerful and hopefully avoid the exponential explosion.
|
||||
|
||||
- We want to finally **ditch the old Haskell runtime** which has long outlived its time.
|
||||
|
||||
There are also two bugs in the old C runtime whose fixes will require a lot of changes, so instead of fixing the old runtime we do it here:
|
||||
|
||||
- **Integer literals in the C runtime** are implemented as 32-bit integers, while the Haskell runtime used unlimited integers.
|
||||
Python supports unlimited integers too, so it would be nice to support them in the new runtime as well.
|
||||
|
||||
- The old C runtime assumed that **String literals are terminated with the NULL character**. None of the modern languages (Haskell, Python, Java, etc) make
|
||||
that assumption, so we should drop it too.
|
||||
|
||||
# Consequences
|
||||
|
||||
The desired features will have the following implementation cosequences.
|
||||
|
||||
- The switch from memory-based to disc-based runtime requires one big change. Before it was easy to just keep a pointer from one object to another.
|
||||
Unfortunately this doesn't work with memory-mapped files, since every time when you map a file into memory it may end up at a different virtual address.
|
||||
Instead we must use file offsets. In order to make programming simpler, the new runtime will be **implemented in C++ instead of C**. This allows us to overload
|
||||
the arrow operator (`->`) which will dynamically convert file offsets to in-memory pointers.
|
||||
|
||||
- The choice of C++ also allows us to ditch the old `libgu` library and **use STL** instead.
|
||||
|
||||
- The content of the memory mapped files is platform-specific. For that reason there will be two grammar representations:
|
||||
- **Native Grammar Format** (`.ngf`) - which will be instantly loadable by just mapping it to memory, but will be platform-dependent.
|
||||
- **Portable Grammar Format** (`.pgf`) - which will take longer to load but will be more compact and platform independent.
|
||||
The runtime will be able to load `.pgf` files and convert them to `.ngf`. Conversely `.pgf` can be exported from the current `.ngf`.
|
||||
0
doc/hackers-guide/LambdaCalculus.md
Normal file
0
doc/hackers-guide/LambdaCalculus.md
Normal file
0
doc/hackers-guide/PMCFG.md
Normal file
0
doc/hackers-guide/PMCFG.md
Normal file
20
doc/hackers-guide/README.md
Normal file
20
doc/hackers-guide/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# The Hacker's Guide to GF
|
||||
|
||||
This is the hacker's guide to GF, for the guide to the galaxy, see the full edition [here](https://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy).
|
||||
Here we will limit outselves to the vastly narrower domain of the [GF](https://www.grammaticalframework.org) runtime. This means that we will not meet
|
||||
any [Vogons](https://en.wikipedia.org/wiki/Vogon), but we will touch upon topics like memory management, databases, transactions, compilers,
|
||||
functional programming, theorem proving and sometimes even languages. Subjects that no doubt would interest any curious hacker.
|
||||
|
||||
So, **Don't Panic!** and keep reading. This is a live document and will develop together with the runtime itself.
|
||||
|
||||
**TABLE OF CONTENTS**
|
||||
|
||||
1. Compilation
|
||||
1. [Overview](CompilationOverview.md)
|
||||
1. [Lambda Calculus](LambdaCalculus.md)
|
||||
2. [Parallel Multiple Context-Free Grammars](PMCFG.md)
|
||||
2. Runtime
|
||||
1. [Desiderata](DESIDERATA.md)
|
||||
2. [Memory Model](memory_model.md)
|
||||
3. [Abstract Expressions](abstract_expressions.md)
|
||||
4. [Transactions](transactions.md)
|
||||
192
doc/hackers-guide/abstract_expressions.md
Normal file
192
doc/hackers-guide/abstract_expressions.md
Normal file
@@ -0,0 +1,192 @@
|
||||
# Data Marshalling Strategies
|
||||
|
||||
The runtime is designed to be used from a high-level programming language, which means that there are frequent foreign calls between the host language and C. This also implies that all the data must be frequently marshalled between the binary representations of the two languages. This is usually trivial and well supported for primitive types like numbers and strings but for complex data structures we need to design our own strategy.
|
||||
|
||||
The most central data structure in GF is of course the abstract syntax expression. The other two secondary but closely related structures are types and literals. These are complex structures and no high-level programming language will let us to manipulate them directly unless if they are in the format that the runtime of the language understands. There are three main strategies to deal with complex data accross a language boundry:
|
||||
|
||||
1. Keep the data in the C world and provide only an opaque handle to the host language. This means that all operations over the data must be done in C via foreign calls.
|
||||
2. Design a native host-language representation. For each foreign call the data is copied from the host language to the C representation and vice versa. Copying is obviously bad, but not too bad if the data is small. The added benefit is that now both languages have first-class access to the data. As a bonus, the garbage collector of the host language now understands the data and can immediately release it if part of it becomes unreachable.
|
||||
3. Keep the data in the host language. The C code has only an indirect access via opaque handles and calls back to the host language. The program in the host language has first-class access and the garbage collector can work with the data. No copying is needed.
|
||||
|
||||
The old C runtime used option 1. Obviously, this means that abstract expressions cannot be manipulated directly, but this is not the only problem. When the application constructs abstract expressions from different pieces, a whole a lot of overhead is added. First, the design was such that data in C must always be allocated from a memory pool. This means that even if we want to make a simple function application, we first must allocate a pool which adds memory overhead. In addition, the host language must allocate an object which wraps arround the C structure. The net effect is that while the plain abstract function application requires the allocation of only two pointers, the actually allocated data may be several times bigger if the application builds the expression piece by piece. The situation is better if the expression is entirely created from the runtime and the application just needs to keep a reference to it.
|
||||
|
||||
Another problem is that when the runtime has to create a whole bunch of expressions, for instance as a result from parsing or random and exhaustive generation, then all the expressions are allocated in the same memory pool. The application gets separate handles to each of the produced expressions, but the memory pool is released only after all of the handles become unreachable. Obviously the problem here is that different expressions share the same pool. Unfortunately this is hard to avoid since although the expressions are different, they usually share common subexpression. Identifying the shared parts would be expensive and at the end it might mean that each expression node must be allocated in its own pool.
|
||||
|
||||
The path taken in the new runtime is a combination of strategies 2 and 3. The abstract expressions are stored in the heap of the host language and use a native for that language representation.
|
||||
|
||||
# Abstract Expressions in Different Languages
|
||||
|
||||
In Haskell, abstract expressions are represented with an algebraic data type:
|
||||
```Haskell
|
||||
data Expr =
|
||||
EAbs BindType Var Expr
|
||||
| EApp Expr Expr
|
||||
| ELit Literal
|
||||
| EMeta MetaId
|
||||
| EFun Fun
|
||||
| EVar Int
|
||||
| ETyped Expr Type
|
||||
| EImplArg Expr
|
||||
```
|
||||
while in Python and all other object-oriented languages an expression is represented with objects of different classes:
|
||||
```Python
|
||||
class Expr: pass
|
||||
class ExprAbs(Expr): pass
|
||||
class ExprApp(Expr): pass
|
||||
class ExprLit(Expr): pass
|
||||
class ExprMeta(Expr): pass
|
||||
class ExprFun(Expr): pass
|
||||
class ExprVar(Expr): pass
|
||||
class ExprTyped(Expr): pass
|
||||
class ExprImplArg(Expr): pass
|
||||
```
|
||||
|
||||
The runtime needs its own representation as well but only when an expression is stored in a .ngf file. This happens for instance with all types in the abstract syntax of the grammar. Since the type system allows dependent types, some type signature might contain expressions too. Another appearance for abstract expressions is in function definitions, i.e. in the def rules.
|
||||
|
||||
Expressions in the runtime are represented with C structures which on the other hand may contain tagged references to other structures. The lowest four bits of each reference encode the type of structure that it points to, while the rest contain the file offsets in the memory mapped file. For example, function application is represented as:
|
||||
```C++
|
||||
struct PgfExprApp {
|
||||
static const uint8_t tag = 1;
|
||||
|
||||
PgfExpr fun;
|
||||
PgfExpr arg;
|
||||
};
|
||||
```
|
||||
Here the constant `tag` says that any reference to a PgfExprApp structure must contain the value 1 in its lowest four bits. The fields `fun` and `arg` refer to the function and the argument for that application. The type PgfExpr is defined as:
|
||||
```C++
|
||||
typedef uintptr_t object;
|
||||
typedef object PgfExpr;
|
||||
```
|
||||
In order to dereference an expression, we first neeed to pattern match and then obtain a `ref<>` object:
|
||||
```C++
|
||||
switch (ref<PgfExpr>::get_tag(e)) {
|
||||
...
|
||||
case PgfExprApp::tag: {
|
||||
auto eapp = ref<PgfExprApp>::untagged(e);
|
||||
// do something with eapp->fun and eapp->arg
|
||||
...
|
||||
break;
|
||||
}
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
The representation in the runtime is internal and should never be exposed to the host language. Moreover, these structures live in the memory mapped file and as we discussed in Section "[Memory Model](memory_model.md)" accessing them requires special care. This also means that occasionally the runtime must make a copy from the native representation to the host representation and vice versa. For example, function:
|
||||
```Haskell
|
||||
functionType :: PGF -> Fun -> Maybe Type
|
||||
```
|
||||
must look up the type of an abstract syntax function in the .ngf file and return its type. The type, however, is in the native representation and it must first be copied in the host representation. The converse also happens. When the compiler wants to add a new abstract function to the grammar, it creates its type in the Haskell heap, which the runtime later copies to the native representation in the .ngf file. This is not much different from any other database. The database file usually uses a different data representation than what the host language has.
|
||||
|
||||
In most other runtime operations, copying is not necessary. The only thing that the runtime needs to know is how to create new expressions in the heap of the host and how to pattern match on them. For that it calls back to code implemented differently for each host language. For example in:
|
||||
```Haskell
|
||||
readExpr :: String -> Maybe Expr
|
||||
```
|
||||
the runtime knows how to read an abstract syntax expression, while for the construction of the actual value it calls back to Haskell. Similarly:
|
||||
```Haskell
|
||||
showExpr :: [Var] -> Expr -> String
|
||||
```
|
||||
uses code implemented in Haskell to pattern match on the different algebraic constructors, while the text generation itself happens inside the runtime.
|
||||
|
||||
# Marshaller and Unmarshaller
|
||||
|
||||
The marshaller and the unmarshaller are the two key data structures which bridge together the different representation realms for abstract expressions and types. The structures have two equivalent definitions, one in C++:
|
||||
```C++
|
||||
struct PgfMarshaller {
|
||||
virtual object match_lit(PgfUnmarshaller *u, PgfLiteral lit)=0;
|
||||
virtual object match_expr(PgfUnmarshaller *u, PgfExpr expr)=0;
|
||||
virtual object match_type(PgfUnmarshaller *u, PgfType ty)=0;
|
||||
};
|
||||
|
||||
struct PgfUnmarshaller {
|
||||
virtual PgfExpr eabs(PgfBindType btype, PgfText *name, PgfExpr body)=0;
|
||||
virtual PgfExpr eapp(PgfExpr fun, PgfExpr arg)=0;
|
||||
virtual PgfExpr elit(PgfLiteral lit)=0;
|
||||
virtual PgfExpr emeta(PgfMetaId meta)=0;
|
||||
virtual PgfExpr efun(PgfText *name)=0;
|
||||
virtual PgfExpr evar(int index)=0;
|
||||
virtual PgfExpr etyped(PgfExpr expr, PgfType typ)=0;
|
||||
virtual PgfExpr eimplarg(PgfExpr expr)=0;
|
||||
virtual PgfLiteral lint(size_t size, uintmax_t *v)=0;
|
||||
virtual PgfLiteral lflt(double v)=0;
|
||||
virtual PgfLiteral lstr(PgfText *v)=0;
|
||||
virtual PgfType dtyp(int n_hypos, PgfTypeHypo *hypos,
|
||||
PgfText *cat,
|
||||
int n_exprs, PgfExpr *exprs)=0;
|
||||
virtual void free_ref(object x)=0;
|
||||
};
|
||||
```
|
||||
and one in C:
|
||||
```C
|
||||
typedef struct PgfMarshaller PgfMarshaller;
|
||||
typedef struct PgfMarshallerVtbl PgfMarshallerVtbl;
|
||||
struct PgfMarshallerVtbl {
|
||||
object (*match_lit)(PgfUnmarshaller *u, PgfLiteral lit);
|
||||
object (*match_expr)(PgfUnmarshaller *u, PgfExpr expr);
|
||||
object (*match_type)(PgfUnmarshaller *u, PgfType ty);
|
||||
};
|
||||
struct PgfMarshaller {
|
||||
PgfMarshallerVtbl *vtbl;
|
||||
};
|
||||
|
||||
typedef struct PgfUnmarshaller PgfUnmarshaller;
|
||||
typedef struct PgfUnmarshallerVtbl PgfUnmarshallerVtbl;
|
||||
struct PgfUnmarshallerVtbl {
|
||||
PgfExpr (*eabs)(PgfUnmarshaller *this, PgfBindType btype, PgfText *name, PgfExpr body);
|
||||
PgfExpr (*eapp)(PgfUnmarshaller *this, PgfExpr fun, PgfExpr arg);
|
||||
PgfExpr (*elit)(PgfUnmarshaller *this, PgfLiteral lit);
|
||||
PgfExpr (*emeta)(PgfUnmarshaller *this, PgfMetaId meta);
|
||||
PgfExpr (*efun)(PgfUnmarshaller *this, PgfText *name);
|
||||
PgfExpr (*evar)(PgfUnmarshaller *this, int index);
|
||||
PgfExpr (*etyped)(PgfUnmarshaller *this, PgfExpr expr, PgfType typ);
|
||||
PgfExpr (*eimplarg)(PgfUnmarshaller *this, PgfExpr expr);
|
||||
PgfLiteral (*lint)(PgfUnmarshaller *this, size_t size, uintmax_t *v);
|
||||
PgfLiteral (*lflt)(PgfUnmarshaller *this, double v);
|
||||
PgfLiteral (*lstr)(PgfUnmarshaller *this, PgfText *v);
|
||||
PgfType (*dtyp)(PgfUnmarshaller *this,
|
||||
int n_hypos, PgfTypeHypo *hypos,
|
||||
PgfText *cat,
|
||||
int n_exprs, PgfExpr *exprs);
|
||||
void (*free_ref)(PgfUnmarshaller *this, object x);
|
||||
};
|
||||
struct PgfUnmarshaller {
|
||||
PgfUnmarshallerVtbl *vtbl;
|
||||
};
|
||||
```
|
||||
Which one you will get, depends on whether you import `pgf/pgf.h` from C or C++.
|
||||
|
||||
As we can see, most of the arguments for the different methods are of type `PgfExpr`, `PgfType` or `PgfLiteral`. These are all just type synonyms for the type `object`, which on the other hand is nothing else but a number with enough bits to hold an address if necessary. The interpretation of the number depends on the realm in which the object lives. The following table shows the interpretations for four languages as well as the one used internally in the .ngf files:
|
||||
| | PgfExpr | PgfLiteral | PgfType |
|
||||
|----------|----------------|-------------------|----------------|
|
||||
| Haskell | StablePtr Expr | StablePtr Literal | StablePtr Type |
|
||||
| Python | ExprObject * | PyObject * | TypeObject * |
|
||||
| Java | jobject | jobject | jobject |
|
||||
| .NET | GCHandle | GCHandle | GCHandle |
|
||||
| internal | file offset | file offset | file offset |
|
||||
|
||||
The marshaller is the structure that lets the runtime to pattern match on an expression. When one of the match methods is executed, it checks the kind of expr, literal or type and calls the corresponding method from the unmarshaller which it gets as an argument. The method on the other hand gets as arguments the corresponding sub-expressions and attributes.
|
||||
|
||||
Generally the role of an unmarshaller is to construct things. For example, the variable `unmarshaller` in `PGF2.FFI` is an object which can construct new expressions in the Haskell heap from the already created children. Function `readExpr`, for instance, passes that one to the runtime to instruct it that the result must be in the Haskell realm.
|
||||
|
||||
Constructing objects is not the only use of an unmarshaller. The implementation of `showExpr` passes to `pgf_print_expr` an abstract expression in Haskell and the `marshaller` defined in PGF2.FFI. That marshaller knows how to pattern match on Haskell expressions and calls the right methods from whatever unmarhaller is given to it. What it will get in that particular case is a special unmarshaller which does not produce new representations of abstract expressions, but generates a string.
|
||||
|
||||
|
||||
# Literals
|
||||
|
||||
Finally, we should have a few remarks about how values of the literal types `String`, `Int` and `Float` are represented in the runtime.
|
||||
|
||||
`String` is represented as the structure:
|
||||
```C
|
||||
typedef struct {
|
||||
size_t size;
|
||||
char text[];
|
||||
} PgfText;
|
||||
```
|
||||
Here the first field is the size of the string in number of bytes. The second field is the string itself, encoded in UTF-8. Just like in most modern languages, the string may contain the zero character and that is not an indication for end of string. This means that functions like `strlen` and `strcat` should never be used when working with PgfText. Despite that the text is not zero terminated, the runtime always allocates one more last byte for the text content and sets it to zero. That last byte is not included when calculating the field `size`. The purpose is that with that last zero byte the GDB debugger knows how to show the string properly. Most of the time, this doesn't incur any memory overhead either since `malloc` always allocates memory in size divisible by the size of two machine words. The consequence is that usually there are some byte left unused at the end of every string anyway.
|
||||
|
||||
`Int` is like the integers in Haskell and Python and can have arbitrarily many digits. In the runtime, the value is represented as an array of `uintmax_t` values. Each of these values contains as many decimal digits as it is possible to fit in `uintmax_t`. For example on a 64-bit machine,
|
||||
the maximal value that fits is 18446744073709551616. However, the left-most digit here is at most 1, this means that if we want to represend an arbitrary sequence of digits, the maximal length of the sequence must be at most 19. Similarly on a 32-bit machine each value in the array will store 9 decimal digits. Finally the sign of the number is stored as the sign of the first number in the array which is always threated as `intmax_t`.
|
||||
|
||||
Just to have an example, the number `-774763251095801167872` is represented as the array `{-77, 4763251095801167872}`. Note that this representation is not at all suitable for implementing arithmetics with integers, but is very simple to use for us since the runtime only needs to to parse and linearize numbers.
|
||||
|
||||
`Float` is trivial and is just represented as the type `double` in C/C++. This can also be seen in the type of the method `lflt` in the unmarshaller.
|
||||
|
||||
136
doc/hackers-guide/memory_model.md
Normal file
136
doc/hackers-guide/memory_model.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# The different storage files
|
||||
|
||||
The purpose of the `.ngf` files is to be used as on-disk databases that store grammars. Their format is platform-dependent and they should not be copied from
|
||||
one platform to another. In contrast the `.pgf` files are platform-independent and can be moved around. The runtime can import a `.pgf` file and create an `.ngf` file.
|
||||
Conversely a `.pgf` file can be exported from an already existing `.ngf` file.
|
||||
|
||||
The internal relation between the two files is more interesting. The runtime uses its own memory allocator which always allocates memory from a memory mapped file.
|
||||
The file may be explicit or an anonymous one. The `.ngf` is simply a memory image saved in a file. This means that loading the file is always immediate.
|
||||
You just create a new mapping and the kernel will load memory pages on demand.
|
||||
|
||||
On the other hand a `.pgf` file is a version of the grammar serialized in a platform-independent format. This means that loading this type of file is always slower.
|
||||
Fortunately, you can always create an `.ngf` file from it to speed up later reloads.
|
||||
|
||||
The runtime has three ways to load a grammar:
|
||||
|
||||
#### 1. Loading a `.pgf`
|
||||
```Haskell
|
||||
readPGF :: FilePath -> IO PGF
|
||||
```
|
||||
This loads the `.pgf` into an anonymous memory-mapped file. In practice, this means that instead of allocating memory from an explicit file, the runtime will still
|
||||
use the normal swap file.
|
||||
|
||||
#### 2. Loading a `.pgf` and booting a new `.ngf`
|
||||
```Haskell
|
||||
bootPGF :: FilePath -> FilePath -> IO PGF
|
||||
```
|
||||
The grammar is loaded from a `.pgf` (the first argument) and the memory is mapped to an explicit `.ngf` (second argument). The `.ngf` file is created by the function
|
||||
and a file with the same name should not exist before the call.
|
||||
|
||||
#### 3. Loading an existing memory image
|
||||
```Haskell
|
||||
readNGF :: FilePath -> IO PGF
|
||||
```
|
||||
Once an `.ngf` file exists, it can be mapped back to memory by using this function. This call is always guaranteed to be fast. The same function can also
|
||||
create new empty `.ngf` files. If the file does not exist, then a new one will be created which contains an empty grammar. The grammar could then be extended
|
||||
by dynamically adding functions and categories.
|
||||
|
||||
# The content of an `.ngf` file
|
||||
|
||||
The `.ngf` file is a memory image but this is not the end of the story. The problem is that there is no way to control at which address the memory image would be
|
||||
mapped. On Posix systems, `mmap` takes as hint the mapping address but the kernel may choose to ignore it. There is also the flag `MAP_FIXED`, which makes the hint
|
||||
into a constraint, but then the kernel may fail to satisfy the constraint. For example that address may already be used for something else. Furthermore, if the
|
||||
same file is mapped from several processes (if they all load the same grammar), it would be difficult to find an address which is free in all of them.
|
||||
Last but not least using `MAP_FIXED` is considered a security risk.
|
||||
|
||||
Since the start address of the mapping can change, using traditional memory pointers withing the mapped area is not possible. The only option is to use offsets
|
||||
relative to the beginning of the area. In other words, if normally we would have written `p->x`, now we have the offset `o` which we must use like this:
|
||||
```C++
|
||||
((A*) (current_base+o))->x
|
||||
```
|
||||
|
||||
Writing the explicit pointer arithmetics and typecasts, each time when we dereference a pointer, is not better than Vogon poetry and it
|
||||
becomes worse when using a chain of arrow operators. The solution is to use the operator overloading in C++.
|
||||
There is the type `ref<A>` which wraps around a file offset to a data item of type `A`. The operators `->` and `*`
|
||||
are overloaded for the type and they do the necessary pointer arithmetics and type casts.
|
||||
|
||||
This solves the problem with code readability but creates another problem. How do `->` and `*` know the address of the memory mapped area? Obviously,
|
||||
`current_base` must be a global variable and there must be a way to initialize it. More specifically it must be thread-local to allow different threads to
|
||||
work without collisions.
|
||||
|
||||
A database (a memory-mapped file) in the runtime is represented by the type `DB`. Before any of the data in the database is accessed, the database must
|
||||
be brought into scope. Bringing into scope means that `current_base` is initialized to point to the mapping area for that database. After that any dereferencing
|
||||
of a reference will be done relative to the corresponding database. This is how scopes are defined:
|
||||
```C++
|
||||
{
|
||||
DB_scope scope(db, READER_SCOPE);
|
||||
...
|
||||
}
|
||||
```
|
||||
Here `DB_scope` is a helper type and `db` is a pointer to the database that you want to bring into scope. The constructor for `DB_scope` saves the old value
|
||||
for `current_base` and then sets it to point to the area of the given database. Conversely, the destructor restores the previous value.
|
||||
|
||||
The use of `DB_scope` is reentrant, i.e. you can do this:
|
||||
```C++
|
||||
{
|
||||
DB_scope scope(db1, READER_SCOPE);
|
||||
...
|
||||
{
|
||||
DB_scope scope(db2, READER_SCOPE);
|
||||
...
|
||||
}
|
||||
...
|
||||
}
|
||||
```
|
||||
What you can't do is to have more than one database in scope simultaneously. Fortunately, that is not needed. All API functions start a scope
|
||||
and the internals of the runtime always work with the current database in scope.
|
||||
|
||||
Note the flag `READER_SCOPE`. You can use either `READER_SCOPE` or `WRITER_SCOPE`. In addition to selecting the database, the `DB_scope` also enforces
|
||||
the single writer/multiple readers policy. The main problem is that a writer may have to enlarge the current file, which consequently may mean
|
||||
that the kernel should relocate the mapping area to a new address. If there are readers at the same time, they may break since they expect that the mapped
|
||||
area is at a particular location.
|
||||
|
||||
# Developing writers
|
||||
|
||||
There is one important complication when developing procedures modifying the database. Every call to `DB::malloc` may potentially have to enlarge the mapped area
|
||||
which sometimes leads to changing `current_base`. That would not have been a problem if GCC was not sometimes caching variables in registers. Look at the following code:
|
||||
```C++
|
||||
p->r = foo();
|
||||
```
|
||||
Here `p` is a reference which is used to access another reference `r`. On the other hand, `foo()` is a procedure which directly or indirectly calls `DB::malloc`.
|
||||
GCC compiles assignments by first computing the address to modify, and then it evaluates the right hand side. This means that while `foo()` is being evaluated the address computed on the left-hand side is saved in a register or somewhere in the stack. But now, if it happens that the allocation in `foo()` has changed
|
||||
`current_base`, then the saved address is no longer valid.
|
||||
|
||||
That first problem is solved by overloading the assignment operator for `ref<A>`:
|
||||
```C++
|
||||
ref<A>& operator= (const ref<A>& r) {
|
||||
offset = r.offset;
|
||||
return *this;
|
||||
}
|
||||
```
|
||||
On first sight, nothing special happens here and it looks like the overloading is redundant. However, now the assignments are compiled in a very different way.
|
||||
The overloaded operator is inlined, so there is no real method call and we don't get any overhead. The real difference is that now, whatever is on the left-hand side of the assignment becomes the value of the `this` pointer, and `this` is always the last thing to be evaluated in a method call. This solves the problem.
|
||||
`foo()` is evaluated first and if it changes `current_base`, the change will be taken into account when computing the left-hand side of the assignment.
|
||||
|
||||
Unfortunately, this is not the only problem. A similar thing happens when the arguments of a function are calls to other functions. See this:
|
||||
```C++
|
||||
foo(p->r,bar(),q->r)
|
||||
```
|
||||
Where now `bar()` is the function that performs allocation. The compiler is free to keep in a register the value of `current_base` that it needs for the evaluation of
|
||||
`p->r`, while it evaluates `bar()`. But if `current_base` has changed, then the saved value would be invalid while computing `q->r`. There doesn't seem to be
|
||||
a work around for this. The only solution is to:
|
||||
|
||||
**Never call a function that allocates as an argument to another function**
|
||||
|
||||
Instead we call allocating functions on a separate line and we save the result in a temporary variable.
|
||||
|
||||
|
||||
# Thread-local variables
|
||||
|
||||
A final remark is the compilation of thread-local variables. When a thread-local variable is compiled in a position-dependent code, i.e. in executables, it is
|
||||
compiled efficiently by using the `fs` register which points to the thread-local segment. Unfortunately, that is not the case by default for shared
|
||||
libraries like our runtime. In that case, GCC applies the global-dynamic model which means that access to a thread local variable is internally implemented
|
||||
with a call to the function `__tls_get_addr`. Since `current_base` is used all the time, this adds overhead.
|
||||
|
||||
The solution is to define the variable with the attribute `__attribute__((tls_model("initial-exec")))` which says that it should be treated as if it is defined
|
||||
in an executable. This removes the overhead, but adds the limitation that the runtime should not be loaded with `dlopen`.
|
||||
131
doc/hackers-guide/transactions.md
Normal file
131
doc/hackers-guide/transactions.md
Normal file
@@ -0,0 +1,131 @@
|
||||
# Transactions
|
||||
|
||||
The `.ngf` files that the runtime creates are actual databases which are used to get quick access to the grammars. Like in any database, we also make it possible to dynamically change the data. In our case this means that we can add and remove functions and categories at any time. Moreover, any changes happen in transactions which ensure that changes are not visible until the transaction is commited. The rest of the document describes how the transactions are implemented.
|
||||
|
||||
# Databases and Functional Languages
|
||||
|
||||
The database model of the runtime is specifically designed to be friendly towards pure functional languages like Haskell. In a usual database, updates happen constantly and therefore executing one and the same query at different times would yield different results. In our grammar databases, queries correspond to operations like parsing, linearization and generation. This means that if we had used the usual database model, all these operations would have to be bound to the IO monad. Consider this example:
|
||||
```Haskell
|
||||
main = do
|
||||
gr <- readNGF "Example.ngf"
|
||||
functionType gr "f" >>= print
|
||||
-- modify the grammar gr
|
||||
functionType gr "f" >>= print
|
||||
```
|
||||
Here we ask for the type of a function before and after an arbitrary update in the grammar `gr`. Obviously if we allow that then `functionType` would have to be in the IO monad, e.g.:
|
||||
|
||||
```Haskell
|
||||
functionType :: PGF -> Fun -> IO Type
|
||||
```
|
||||
|
||||
Although this is a possible way to go, it would mean that the programmer would have to do all grammar related work in the IO. This is not nice and against the spirit of functional programming. Moreover, all previous implementations of the runtime have assumed that most operations are pure. If we go along that path then this will cause a major breaking change.
|
||||
|
||||
Fortunately there is an alternative. Read-only operations remain pure functions, but any update should create a new revision of the database rather than modifying the existing one. Compare this example with the previous:
|
||||
```Haskell
|
||||
main = do
|
||||
gr <- readNGF "Example.ngf"
|
||||
print (functionType gr "f")
|
||||
gr2 <- modifyPGF gr $ do
|
||||
-- do all updates here
|
||||
print (functionType gr2 "f")
|
||||
```
|
||||
Here `modifyPGF` allows us to do updates but the updates are performed on a freshly created clone of the grammar `gr`. The original grammar is never ever modified. After the changes the variable `gr2` is a reference to the new revision. While the transaction is in progress we cannot see the currently changing revision, and therefore all read-only operations can remain pure. Only after the transaction is complete do we get to use `gr2`, which will not change anymore.
|
||||
|
||||
Note also that above `functionType` is used with its usual pure type:
|
||||
```Haskell
|
||||
functionType :: PGF -> Fun -> Type
|
||||
```
|
||||
This is safe since the API never exposes database revisions which are not complete. Furthermore, the programmer is free to keep several revisions of the same database simultaneously. In this example:
|
||||
```Haskell
|
||||
main = do
|
||||
gr <- readNGF "Example.ngf"
|
||||
gr2 <- modifyPGF gr $ do
|
||||
-- do all updates here
|
||||
print (functionType gr "f", functionType gr2 "f")
|
||||
```
|
||||
The last line prints the type of function `"f"` in both the old and the new revision. Both are still available.
|
||||
|
||||
The API as described so far would have been complete if all updates were happening in a single thread. In reality we can expect that there might be several threads or processes modifying the database. The database ensures a multiple readers/single writer exclusion but this doesn't mean that another process/thread cannot modify the database while the current one is reading an old revision. In a parallel setting, `modifyPGF` first merges the revision which the process is using with the latest revision in the database. On top of that the specified updates are performed. The final revision after the updates is returned as a result.
|
||||
|
||||
**TODO: Interprocess synhronization is still not implemented**
|
||||
|
||||
**TODO: Merges are still not implemented.**
|
||||
|
||||
The process can also ask for the latest revision by calling `checkoutPGF`, see bellow.
|
||||
|
||||
# Databases and Imperative Languages
|
||||
|
||||
In imperative languages, the state of the program constantly changes and the considerations in the last section do not apply. All read-only operations always work with the latest revision. Bellow is the previous example translated to Python:
|
||||
```Python
|
||||
gr = readNGF("Example.ngf")
|
||||
print(functionType(gr,"f"))
|
||||
with gr.transaction() as t:
|
||||
# do all updates here by using t
|
||||
print(functionType(gr,"f"))
|
||||
```
|
||||
Here the first call to `functionType` returns the old type of "f", while the second call retrives the type after the updates. The transaction itself is initiated by the `with` statement. Inside the with statement `gr` will still refer to the old revision since the new one is not complete yet. If the `with` statement is finished without exceptions then `gr` is updated to point to the new one. If an exception occurs then the new revision is discarded, which corresponds to a transaction rollback. Inside the `with` block, the object `t` of type `Transaction` provides methods for modifying the data.
|
||||
|
||||
# Branches
|
||||
|
||||
Since the database already supports revisions, it is a simple step to support branches as well. A branch is just a revision with a name. When you open a database with `readNGF`, the runtime looks up and returns the revision (branch) with name `master`. There might be other branches as well. You can retrieve a specific branch by calling:
|
||||
```Haskell
|
||||
checkoutPGF :: PGF -> String -> IO (Maybe PGF)
|
||||
```
|
||||
Here the string is the branch name. New branches can be created by using:
|
||||
```Haskell
|
||||
branchPGF :: PGF -> String -> Transaction a -> IO PGF
|
||||
```
|
||||
Here we start with an existing revision, apply a transaction and store the result in a new branch with the given name.
|
||||
|
||||
# Implementation
|
||||
|
||||
The low-level API for transactions consists of only four functions:
|
||||
```C
|
||||
PgfRevision pgf_clone_revision(PgfDB *db, PgfRevision revision,
|
||||
PgfText *name,
|
||||
PgfExn *err);
|
||||
|
||||
void pgf_free_revision(PgfDB *pgf, PgfRevision revision);
|
||||
|
||||
void pgf_commit_revision(PgfDB *db, PgfRevision revision,
|
||||
PgfExn *err);
|
||||
|
||||
PgfRevision pgf_checkout_revision(PgfDB *db, PgfText *name,
|
||||
PgfExn *err);
|
||||
```
|
||||
Here `pgf_clone_revision` makes a copy of an existing revision and — if `name` is not `NULL` — changes its name. The new revision is transient and exists only until it is released with `pgf_free_revision`. Transient revisions can be updated with the API for adding functions and categories. To make a revision persistent, call `pgf_commit_revision`. After the revision is made persistent it will stay in the database even after you call `pgf_free_revision`. Moreover, it will replace the last persistent revision with the same name. The old revision will then become transient and will exist only until all clients call `pgf_free_revision` for it.
|
||||
|
||||
Persistent revisions can never be updated. Instead you clone it to create a new transient revision. That one is updated and finally it replaces the existing persistent revision.
|
||||
|
||||
This design for transactions may sound unusual but it is just another way to present the copy-on-write strategy. There instead of transaction logs, each change to the data is written in a new place and the result is made available only after all changes are in place. This is for instance what the [LMDB](http://www.lmdb.tech/doc/) (Lightning Memory-Mapped Database) does and it has also served as an inspiration for us.
|
||||
|
||||
## Functional Data Structures
|
||||
|
||||
From an imperative point of view, it may sound wasteful that a new copy of the grammar is created for each transaction. Functional programmers on the other hand know that with a functional data structure, you can make a copy which shares as much of the data with the original as possible. Each new version copies only those bits that are different from the old one. For example the main data structure that we use to represent the abstract syntax of a grammar is a size-balanced binary tree as described by:
|
||||
|
||||
- Stephen Adams, "Efficient sets: a balancing act", Journal of Functional Programming 3(4):553-562, October 1993, http://www.swiss.ai.mit.edu/~adams/BB/.
|
||||
|
||||
- J. Nievergelt and E.M. Reingold, "Binary search trees of bounded balance", SIAM journal of computing 2(1), March 1973.
|
||||
|
||||
|
||||
## Garbage Collection
|
||||
|
||||
We use reference counting to keep track of which objects should be kept alive. For instance, `pgf_free_revision` knows that a transient revision should be removed only when its reference count reaches zero. This means that there is no process or thread using it. The function also checks whether the revision is persistent. Persistent revisions are never removed since they can always be retrieved with `checkoutPGF`.
|
||||
|
||||
Clients are supposed to correctly use `pgf_free_revision` to indicate that they don't need a revision any more. Unfortunately, this is not always possible to guarantee. For example many languages with garbage collection will call `pgf_free_revision` from a finalizer method. In some languages, however, the finalizer is not guaranteed to be executed if the process terminates before the garbage collection is done. Haskell is one of those languages. Even in languages with reference counting like Python, the process may get killed by the operating system and then the finalizer may still not be executed.
|
||||
|
||||
The solution is that we count on the database clients to correctly report when a revision is not needed. However, on a fresh database restart we explictly clean all left over transient revisions. This means that even if a client is killed or if it does not correctly release its revisions, the worst that can happen is a memory leak until the next restart.
|
||||
|
||||
|
||||
## Atomicity
|
||||
|
||||
The transactions serve two goals. First they make it possible to isolate readers from seeing unfinished changes from writers. Second, they ensure atomicity. A database change should be either completely done or not done at all. The use of transient revisions ensures the isolation but the atomicity is only partly taken care of.
|
||||
|
||||
Think about what happens when a writer starts updating a transient revision. All the data is allocated in a memory mapped file. From the point of view of the runtime, all changes happen in memory. When all is done, the runtime calls `msync` which tells the kernel to flush all dirty pages to disk. The problem is that the kernel is also free to flush pages at any time. For instance, if there is not enough memory, it may decide to swap out pages earlier and reuse the released physical space to swap in other virtual pages. This would be fine if the transaction eventually succeeds. However, if this doesn't happen then the image in the file is already changed.
|
||||
|
||||
We can avoid the situation by calling [mlock](https://man7.org/linux/man-pages/man2/mlock.2.html) and telling the kernel that certain pages should not be swapped out. The question is which pages to lock. We can lock them all, but this is too much. That would mean that as soon as a page is touched it will never leave the physical memory. Instead, it would have been nice to tell the kernel -- feel free to swap out clean pages but, as soon as they get dirty, keep them in memory until further notice. Unfortunately there is no way to do that directly.
|
||||
|
||||
The work around is to first use [mprotect](https://man7.org/linux/man-pages/man2/mprotect.2.html) and keep all pages as read-only. Any attempt to change a page will cause segmentation fault which we can capture. If the change happens during a transaction then we can immediate lock the page and add it to the list of modified pages. When a transaction is successful we sync all modified pages. If an attempt to change a page happens outside of a transaction, then this is either a bug in the runtime or the client is trying to change an address which it should not change. In any case this prevents unintended changes in the data.
|
||||
|
||||
|
||||
**TODO: atomicity is not implemented yet**
|
||||
@@ -1,69 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>GF Documentation</title>
|
||||
<link rel=stylesheet href="../css/style.css">
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
|
||||
<div class=center>
|
||||
<a href="../"><img src="Logos/gf0.png"></a>
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Grammatical Framework Documents</h1>
|
||||
</div>
|
||||
|
||||
|
||||
<b>Top-5 documents</b>:
|
||||
|
||||
<a href="gf-quickstart.html">Quick start instruction</a>.
|
||||
|
||||
|
||||
<a href="tutorial/gf-tutorial.html">Old Tutorial</a>, application-oriented.
|
||||
|
||||
<a href="gf-lrec-2010.pdf">New Tutorial</a>, linguistics-oriented.
|
||||
|
||||
<a href="gf-refman.html">ReferenceManual</a>.
|
||||
|
||||
<a href="../lib/resource/doc/synopsis.html">LibrarySynopsis</a>.
|
||||
|
||||
|
||||
|
||||
|
||||
<h2>Language and system documentation</h2>
|
||||
|
||||
<ul>
|
||||
|
||||
<li>
|
||||
<a href="gf-reference.html">GF Quick Reference</a>. Also available in
|
||||
<a href="gf-reference.pdf">pdf</a>. Covers all features of GF language
|
||||
in a summary format.
|
||||
|
||||
<li>
|
||||
<a href="gf-refman.html">GF Reference Manual</a>. A full-scale reference
|
||||
manual of the GF language.
|
||||
|
||||
<li>
|
||||
<a href="gf-shell-reference.html">GF Shell Reference</a>.
|
||||
Describes the commands available in the interactive GF shell. Also
|
||||
summarizes how to run GF as a batch compiler.
|
||||
|
||||
<li>
|
||||
<a href="gf-editor-modes.html">Editor modes for GF</a>.
|
||||
Editor modes for GF provides syntax highligting, automatic indentation and
|
||||
other features that makes editing GF grammar files easier.
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Publications</h2>
|
||||
|
||||
<a href="gf-bibliography.html">
|
||||
Bibliography</a>: more publications on GF, as well as background literature.
|
||||
|
||||
|
||||
</body></html>
|
||||
13
doc/index.md
Normal file
13
doc/index.md
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
title: Grammatical Framework Documentation
|
||||
---
|
||||
|
||||
Perhaps you're looking for one of the following:
|
||||
|
||||
- [Tutorial](tutorial/gf-tutorial.html). This is a hands-on introduction to grammar writing in GF.
|
||||
- [Reference Manual](gf-refman.html). A full-scale reference manual of the GF language.
|
||||
- [RGL Tutorial](../lib/doc/rgl-tutorial/index.html)
|
||||
- [RGL Synopsis](../lib/doc/synopsis/index.html). Documentation of the Resource Grammar Library, including the syntax API and lexical paradigms for each language.
|
||||
- [Shell Reference](gf-shell-reference.html). Describes the commands available in the interactive GF shell.
|
||||
Also summarizes how to run GF as a batch compiler.
|
||||
- [Developers Guide](gf-developers/html). Detailed information about building and developing GF.
|
||||
@@ -1,29 +1,26 @@
|
||||
<html>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<title>C Runtime API</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||
<style>
|
||||
body { background: #eee; padding-top: 200px; }
|
||||
|
||||
pre.python {background-color:#ffc; display: none}
|
||||
pre.haskell {background-color:#ffc; display: block}
|
||||
pre.java {background-color:#ffc; display: none}
|
||||
pre.csharp {background-color:#ffc; display: none}
|
||||
pre {
|
||||
background-color:#eee;
|
||||
margin-top: 1em;
|
||||
padding: 0.5em 1em;
|
||||
}
|
||||
pre.python {display: none}
|
||||
pre.haskell {display: block}
|
||||
pre.java {display: none}
|
||||
pre.csharp {display: none}
|
||||
span.python {display: none}
|
||||
span.haskell {display: inline}
|
||||
span.java {display: none}
|
||||
span.csharp {display: none}
|
||||
|
||||
.header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: #ddd;
|
||||
width: 100%;
|
||||
padding: 5pt;
|
||||
border-bottom: solid #bbb 2pt;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script lang="javascript">
|
||||
function change_language(href) {
|
||||
var name = href.split("#")[1];
|
||||
@@ -50,14 +47,28 @@
|
||||
</script>
|
||||
</head>
|
||||
<body onload="change_language(window.location.href); window.addEventListener('hashchange', function(e){change_language(window.location.href);});">
|
||||
<span class="header">
|
||||
<h1>Using the <span class="python">Python</span> <span class="haskell">Haskell</span> <span class="java">Java</span> <span class="csharp">C#</span> binding to the C runtime</h1>
|
||||
|
||||
Choose a language: <a href="#haskell">Haskell</a> <a href="#python">Python</a> <a href="#java">Java</a> <a href="#csharp">C#</a>
|
||||
</span>
|
||||
<div class="container-fluid" style="max-width: 1200px">
|
||||
<div class="header sticky-top border-bottom py-3 bg-white">
|
||||
<a href=".." title="Home">
|
||||
<img src="../doc/Logos/gf1.svg" height="120px" class="float-md-right ml-3 mb-3 bg-white" alt="GF Logo">
|
||||
</a>
|
||||
<h1>
|
||||
Using the
|
||||
<span class="python">Python</span>
|
||||
<span class="haskell">Haskell</span>
|
||||
<span class="java">Java</span>
|
||||
<span class="csharp">C#</span>
|
||||
binding to the C runtime
|
||||
</h1>
|
||||
<h4 class="text-muted">Krasimir Angelov, July 2015 - August 2017</h4>
|
||||
Choose a language:
|
||||
<a href="#haskell" class="mx-1">Haskell</a>
|
||||
<a href="#python" class="mx-1">Python</a>
|
||||
<a href="#java" class="mx-1">Java</a>
|
||||
<a href="#csharp" class="mx-1">C#</a>
|
||||
</div>
|
||||
<main class="py-4">
|
||||
|
||||
<h4>Krasimir Angelov, July 2015 - August 2017</h4>
|
||||
|
||||
<h2>Loading the Grammar</h2>
|
||||
|
||||
Before you use the <span class="python">Python</span> binding you need to import the <span class="haskell">PGF2 module</span><span class="python">pgf module</span><span class="java">pgf package</span><span class="csharp">PGFSharp package</span>:
|
||||
@@ -127,7 +138,7 @@ Concr eng = gr.Languages["AppEng"];
|
||||
|
||||
<h2>Parsing</h2>
|
||||
|
||||
All language specific services are available as
|
||||
All language specific services are available as
|
||||
<span class="python">methods of the class <tt>pgf.Concr</tt></span><span class="haskell">functions that take as an argument an object of type <tt>Concr</tt></span><span class="java">methods of the class <tt>Concr</tt></span><span class="csharp">methods of the class <tt>Concr</tt></span>.
|
||||
For example to invoke the parser, you can call:
|
||||
<pre class="python">
|
||||
@@ -220,10 +231,10 @@ Console.WriteLine(ep.Item1);
|
||||
PhrUtt NoPConj (UttS (UseCl (TTAnt TPres ASimul) PPos (PredVP (DetNP (DetQuant this_Quant NumSg)) (UseComp (CompNP (DetCN (DetQuant IndefArt NumSg) (AdjCN (PositA small_A) (UseN theatre_N)))))))) NoVoc
|
||||
</pre>
|
||||
|
||||
<p>Note that depending on the grammar it is absolutely possible that for
|
||||
a single sentence you might get infinitely many trees.
|
||||
<p>Note that depending on the grammar it is absolutely possible that for
|
||||
a single sentence you might get infinitely many trees.
|
||||
In other cases the number of trees might be finite but still enormous.
|
||||
The parser is specifically designed to be lazy, which means that
|
||||
The parser is specifically designed to be lazy, which means that
|
||||
each tree is returned as soon as it is found before exhausting
|
||||
the full search space. For grammars with a patological number of
|
||||
trees it is advisable to pick only the top <tt>N</tt> trees
|
||||
@@ -246,16 +257,16 @@ parsing with a different start category can be done as follows:</p>
|
||||
</pre>
|
||||
</span>
|
||||
<span class="haskell">
|
||||
There is also the function <tt>parseWithHeuristics</tt> which
|
||||
takes two more paramaters which let you to have a better control
|
||||
There is also the function <tt>parseWithHeuristics</tt> which
|
||||
takes two more paramaters which let you to have a better control
|
||||
over the parser's behaviour:
|
||||
<pre class="haskell">
|
||||
Prelude PGF2> let res = parseWithHeuristics eng (startCat gr) heuristic_factor callbacks
|
||||
</pre>
|
||||
</span>
|
||||
<span class="java">
|
||||
There is also the method <tt>parseWithHeuristics</tt> which
|
||||
takes two more paramaters which let you to have a better control
|
||||
There is also the method <tt>parseWithHeuristics</tt> which
|
||||
takes two more paramaters which let you to have a better control
|
||||
over the parser's behaviour:
|
||||
<pre class="java">
|
||||
Iterable<ExprProb> iterable = eng.parseWithHeuristics(gr.startCat(), heuristic_factor, callbacks);
|
||||
@@ -281,7 +292,7 @@ to factor 0.0. When we increase the factor then parsing becomes faster
|
||||
but at the same time the sorting becomes imprecise. The worst
|
||||
factor is 1.0. In any case the parser always returns the same set of
|
||||
trees but in different order. Our experience is that even a factor
|
||||
of about 0.6-0.8 with the translation grammar still orders
|
||||
of about 0.6-0.8 with the translation grammar still orders
|
||||
the most probable tree on top of the list but further down the list,
|
||||
the trees become shuffled.
|
||||
</p>
|
||||
@@ -457,7 +468,7 @@ the object has the following public final variables:
|
||||
</span>
|
||||
</p>
|
||||
|
||||
The linearization works even if there are functions in the tree
|
||||
The linearization works even if there are functions in the tree
|
||||
that doesn't have linearization definitions. In that case you
|
||||
will just see the name of the function in the generated string.
|
||||
It is sometimes helpful to be able to see whether a function
|
||||
@@ -483,7 +494,7 @@ true
|
||||
|
||||
<p>
|
||||
An already constructed tree can be analyzed and transformed
|
||||
in the host application. For example you can deconstruct
|
||||
in the host application. For example you can deconstruct
|
||||
a tree into a function name and a list of arguments:
|
||||
<pre class="python">
|
||||
>>> e.unpack()
|
||||
@@ -523,8 +534,8 @@ literal. For example the result from:
|
||||
<span class="haskell">
|
||||
The result from <tt>unApp</tt> is <tt>Just</tt> if the expression
|
||||
is an application and <tt>Nothing</tt> in all other cases.
|
||||
Similarly, if the tree is a literal string then the return value
|
||||
from <tt>unStr</tt> will be <tt>Just</tt> with the actual literal.
|
||||
Similarly, if the tree is a literal string then the return value
|
||||
from <tt>unStr</tt> will be <tt>Just</tt> with the actual literal.
|
||||
For example the result from:
|
||||
</span>
|
||||
<pre class="haskell">
|
||||
@@ -534,8 +545,8 @@ Prelude PGF2> readExpr "\"literal\"" >>= unStr
|
||||
<span class="java">
|
||||
The result from <tt>unApp</tt> is not <tt>null</tt> if the expression
|
||||
is an application, and <tt>null</tt> in all other cases.
|
||||
Similarly, if the tree is a literal string then the return value
|
||||
from <tt>unStr</tt> will not be <tt>null</tt> with the actual literal.
|
||||
Similarly, if the tree is a literal string then the return value
|
||||
from <tt>unStr</tt> will not be <tt>null</tt> with the actual literal.
|
||||
For example the output from:
|
||||
</span>
|
||||
<pre class="java">
|
||||
@@ -545,15 +556,15 @@ System.out.println(elit.unStr());
|
||||
<span class="csharp">
|
||||
The result from <tt>UnApp</tt> is not <tt>null</tt> if the expression
|
||||
is an application, and <tt>null</tt> in all other cases.
|
||||
Similarly, if the tree is a literal string then the return value
|
||||
from <tt>UnStr</tt> will not be <tt>null</tt> with the actual literal.
|
||||
Similarly, if the tree is a literal string then the return value
|
||||
from <tt>UnStr</tt> will not be <tt>null</tt> with the actual literal.
|
||||
For example the output from:
|
||||
</span>
|
||||
<pre class="csharp">
|
||||
Expr elit = Expr.ReadExpr("\"literal\"");
|
||||
Console.WriteLine(elit.UnStr());
|
||||
</pre>
|
||||
is just the string "literal".
|
||||
is just the string "literal".
|
||||
<span class="python">Situations like this can be detected
|
||||
in Python by checking the type of the result from <tt>unpack</tt>.
|
||||
It is also possible to get an integer or a floating point number
|
||||
@@ -569,7 +580,7 @@ There are also the methods <tt>UnAbs</tt>, <tt>UnInt</tt>, <tt>UnFloat</tt> and
|
||||
</span>
|
||||
</p>
|
||||
|
||||
Constructing new trees is also easy. You can either use
|
||||
Constructing new trees is also easy. You can either use
|
||||
<tt>readExpr</tt> to read trees from strings, or you can
|
||||
construct new trees from existing pieces. This is possible by
|
||||
<span class="python">
|
||||
@@ -612,7 +623,7 @@ Console.WriteLine(e2);
|
||||
<p>If the host application needs to do a lot of expression manipulations,
|
||||
then it is helpful to use a higher-level API to the grammar,
|
||||
also known as "embedded grammars" in GF. The advantage is that
|
||||
you can construct and analyze expressions in a more compact way.</p>
|
||||
you can construct and analyze expressions in a more compact way.</p>
|
||||
|
||||
<span class="python">
|
||||
<p>In Python you first have to <tt>embed</tt> the grammar by calling:
|
||||
@@ -721,7 +732,7 @@ call the method <tt>default</tt>. The following is an example:
|
||||
def on_DetCN(self,quant,cn):
|
||||
print("Found DetCN")
|
||||
cn.visit(self)
|
||||
|
||||
|
||||
def on_AdjCN(self,adj,cn):
|
||||
print("Found AdjCN")
|
||||
cn.visit(self)
|
||||
@@ -1007,7 +1018,7 @@ Traceback (most recent call last):
|
||||
pgf.PGFError: The concrete syntax is not loaded
|
||||
</pre>
|
||||
|
||||
Before using the concrete syntax, you need to explicitly load it:
|
||||
Before using the concrete syntax, you need to explicitly load it:
|
||||
<pre class="python">
|
||||
>>> eng.load("AppEng.pgf_c")
|
||||
>>> print(eng.lookupMorpho("letter"))
|
||||
@@ -1060,7 +1071,7 @@ Traceback (most recent call last):
|
||||
pgf.PGFError: The concrete syntax is not loaded
|
||||
</pre>
|
||||
|
||||
Before using the concrete syntax, you need to explicitly load it:
|
||||
Before using the concrete syntax, you need to explicitly load it:
|
||||
<pre class="java">
|
||||
eng.load("AppEng.pgf_c")
|
||||
for (MorphoAnalysis an : eng.lookupMorpho("letter")) {
|
||||
@@ -1289,6 +1300,7 @@ graph {
|
||||
}
|
||||
</pre>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ December 2010 for GF 3.2
|
||||
% txt2tags --toc -ttex gf-tutorial.txt
|
||||
|
||||
%!target:html
|
||||
%!encoding: iso-8859-1
|
||||
%!encoding: utf-8
|
||||
%!options: --toc
|
||||
|
||||
%!postproc(tex) : "\\subsection\*" "\\newslide"
|
||||
@@ -618,32 +618,32 @@ and **semantic definitions**.
|
||||
|
||||
|
||||
|
||||
#NEW
|
||||
|
||||
==Slides==
|
||||
|
||||
You can chop this tutorial into a set of slides by the command
|
||||
```
|
||||
htmls gf-tutorial.html
|
||||
```
|
||||
where the program ``htmls`` is distributed with GF (see below), in
|
||||
|
||||
[``GF/src/tools/Htmls.hs`` http://grammaticalframework.org/src/tools/Htmls.hs]
|
||||
|
||||
The slides will appear as a set of files beginning with ``01-gf-tutorial.htmls``.
|
||||
|
||||
Internal links will not work in the slide format, except for those in the
|
||||
upper left corner of each slide, and the links behind the "Contents" link.
|
||||
% #NEW
|
||||
%
|
||||
% ==Slides==
|
||||
%
|
||||
% You can chop this tutorial into a set of slides by the command
|
||||
% ```
|
||||
% htmls gf-tutorial.html
|
||||
% ```
|
||||
% where the program ``htmls`` is distributed with GF (see below), in
|
||||
%
|
||||
% [``GF/src/tools/Htmls.hs`` http://grammaticalframework.org/src/tools/Htmls.hs]
|
||||
%
|
||||
% The slides will appear as a set of files beginning with ``01-gf-tutorial.htmls``.
|
||||
%
|
||||
% Internal links will not work in the slide format, except for those in the
|
||||
% upper left corner of each slide, and the links behind the "Contents" link.
|
||||
|
||||
|
||||
|
||||
#NEW
|
||||
|
||||
#Lchaptwo
|
||||
|
||||
=Lesson 1: Getting Started with GF=
|
||||
|
||||
|
||||
#Lchaptwo
|
||||
|
||||
Goals:
|
||||
- install and run GF
|
||||
- write the first GF grammar: a "Hello World" grammar in three languages
|
||||
@@ -836,8 +836,8 @@ Finnish and an Italian concrete syntaxes:
|
||||
lin
|
||||
Hello recip = {s = "terve" ++ recip.s} ;
|
||||
World = {s = "maailma"} ;
|
||||
Mum = {s = "äiti"} ;
|
||||
Friends = {s = "ystävät"} ;
|
||||
Mum = {s = "äiti"} ;
|
||||
Friends = {s = "ystävät"} ;
|
||||
}
|
||||
|
||||
concrete HelloIta of Hello = {
|
||||
@@ -898,7 +898,7 @@ Parentheses are only needed for grouping.
|
||||
Parsing something that is not in grammar will fail:
|
||||
```
|
||||
> parse "hello dad"
|
||||
Unknown words: dad
|
||||
The parser failed at token 2: "dad"
|
||||
|
||||
> parse "world hello"
|
||||
no tree found
|
||||
@@ -925,7 +925,7 @@ Default of the language flag (``-lang``): the last-imported concrete syntax.
|
||||
**Multilingual generation**:
|
||||
```
|
||||
> parse -lang=HelloEng "hello friends" | linearize
|
||||
terve ystävät
|
||||
terve ystävät
|
||||
ciao amici
|
||||
hello friends
|
||||
```
|
||||
@@ -1037,9 +1037,10 @@ Application programs, using techniques from #Rchapeight:
|
||||
|
||||
#NEW
|
||||
|
||||
#Lchapthree
|
||||
|
||||
=Lesson 2: Designing a grammar for complex phrases=
|
||||
|
||||
#Lchapthree
|
||||
|
||||
Goals:
|
||||
- build a larger grammar: phrases about food in English and Italian
|
||||
@@ -1335,7 +1336,7 @@ Just (?) replace English words with their dictionary equivalents:
|
||||
Phrase, Item, Kind, Quality = {s : Str} ;
|
||||
|
||||
lin
|
||||
Is item quality = {s = item.s ++ "č" ++ quality.s} ;
|
||||
Is item quality = {s = item.s ++ "è" ++ quality.s} ;
|
||||
This kind = {s = "questo" ++ kind.s} ;
|
||||
That kind = {s = "quel" ++ kind.s} ;
|
||||
QKind quality kind = {s = kind.s ++ quality.s} ;
|
||||
@@ -1446,11 +1447,11 @@ linearizations in different languages:
|
||||
> gr -number=2 | l -treebank
|
||||
|
||||
Is (That Cheese) (Very Boring)
|
||||
quel formaggio č molto noioso
|
||||
quel formaggio è molto noioso
|
||||
that cheese is very boring
|
||||
|
||||
Is (That Cheese) Fresh
|
||||
quel formaggio č fresco
|
||||
quel formaggio è fresco
|
||||
that cheese is fresh
|
||||
```
|
||||
|
||||
@@ -1472,14 +1473,14 @@ answer given in another language.
|
||||
You can interrupt the quiz by entering a line consisting of a dot ('.').
|
||||
|
||||
this fish is warm
|
||||
questo pesce č caldo
|
||||
questo pesce è caldo
|
||||
> Yes.
|
||||
Score 1/1
|
||||
|
||||
this cheese is Italian
|
||||
questo formaggio č noioso
|
||||
> No, not questo formaggio č noioso, but
|
||||
questo formaggio č italiano
|
||||
questo formaggio è noioso
|
||||
> No, not questo formaggio è noioso, but
|
||||
questo formaggio è italiano
|
||||
|
||||
Score 1/2
|
||||
this fish is expensive
|
||||
@@ -1756,7 +1757,7 @@ Simultaneous extension and opening:
|
||||
lincat
|
||||
Question = SS ;
|
||||
lin
|
||||
QIs item quality = ss (item.s ++ "č" ++ quality.s) ;
|
||||
QIs item quality = ss (item.s ++ "è" ++ quality.s) ;
|
||||
Pizza = ss "pizza" ;
|
||||
}
|
||||
```
|
||||
@@ -1797,9 +1798,10 @@ where
|
||||
|
||||
#NEW
|
||||
|
||||
#Lchapfour
|
||||
|
||||
=Lesson 3: Grammars with parameters=
|
||||
|
||||
#Lchapfour
|
||||
|
||||
Goals:
|
||||
- implement sophisticated linguistic structures:
|
||||
@@ -2364,10 +2366,10 @@ in English, with special care taken of variations with the suffix
|
||||
|
||||
+ Implement the German **Umlaut** operation on word stems.
|
||||
The operation changes the vowel of the stressed stem syllable as follows:
|
||||
//a// to //ä//, //au// to //äu//, //o// to //ö//, and //u// to //ü//. You
|
||||
//a// to //ä//, //au// to //äu//, //o// to //ö//, and //u// to //ü//. You
|
||||
can assume that the operation only takes syllables as arguments. Test the
|
||||
operation to see whether it correctly changes //Arzt// to //Ärzt//,
|
||||
//Baum// to //Bäum//, //Topf// to //Töpf//, and //Kuh// to //Küh//.
|
||||
operation to see whether it correctly changes //Arzt// to //Ärzt//,
|
||||
//Baum// to //Bäum//, //Topf// to //Töpf//, and //Kuh// to //Küh//.
|
||||
|
||||
|
||||
|
||||
@@ -2473,24 +2475,19 @@ can be used to read a text and return for each word its analyses
|
||||
```
|
||||
The command ``morpho_quiz = mq`` generates inflection exercises.
|
||||
```
|
||||
% gf -path=alltenses:prelude $GF_LIB_PATH/alltenses/IrregFre.gfo
|
||||
% gf alltenses/IrregFre.gfo
|
||||
|
||||
> morpho_quiz -cat=V
|
||||
|
||||
Welcome to GF Morphology Quiz.
|
||||
...
|
||||
|
||||
réapparaître : VFin VCondit Pl P2
|
||||
réapparaitriez
|
||||
> No, not réapparaitriez, but
|
||||
réapparaîtriez
|
||||
réapparaître : VFin VCondit Pl P2
|
||||
réapparaitriez
|
||||
> No, not réapparaitriez, but
|
||||
réapparaîtriez
|
||||
Score 0/1
|
||||
```
|
||||
To create a list for later use, use the command ``morpho_list = ml``
|
||||
```
|
||||
> morpho_list -number=25 -cat=V | write_file exx.txt
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2563,7 +2560,7 @@ We need only number variation for the copula.
|
||||
```
|
||||
copula : Number -> Str =
|
||||
\n -> case n of {
|
||||
Sg => "č" ;
|
||||
Sg => "è" ;
|
||||
Pl => "sono"
|
||||
} ;
|
||||
```
|
||||
@@ -2649,12 +2646,12 @@ The verb //switch off// is called a
|
||||
|
||||
We can define transitive verbs and their combinations as follows:
|
||||
```
|
||||
lincat TV = {s : Number => Str ; part : Str} ;
|
||||
lincat V2 = {s : Number => Str ; part : Str} ;
|
||||
|
||||
fun AppTV : Item -> TV -> Item -> Phrase ;
|
||||
fun AppV2 : Item -> V2 -> Item -> Phrase ;
|
||||
|
||||
lin AppTV subj tv obj =
|
||||
{s = subj.s ++ tv.s ! subj.n ++ obj.s ++ tv.part} ;
|
||||
lin AppV2 subj v2 obj =
|
||||
{s = subj.s ++ v2.s ! subj.n ++ obj.s ++ v2.part} ;
|
||||
```
|
||||
|
||||
**Exercise**. Define the language ``a^n b^n c^n`` in GF, i.e.
|
||||
@@ -2720,11 +2717,11 @@ This topic will be covered in #Rseclexing.
|
||||
|
||||
The symbol ``**`` is used for both record types and record objects.
|
||||
```
|
||||
lincat TV = Verb ** {c : Case} ;
|
||||
lincat V2 = Verb ** {c : Case} ;
|
||||
|
||||
lin Follow = regVerb "folgen" ** {c = Dative} ;
|
||||
```
|
||||
``TV`` becomes a **subtype** of ``Verb``.
|
||||
``V2`` (transitive verb) becomes a **subtype** of ``Verb``.
|
||||
|
||||
If //T// is a subtype of //R//, an object of //T// can be used whenever
|
||||
an object of //R// is required.
|
||||
@@ -2755,7 +2752,11 @@ Thus the labels ``p1, p2,...`` are hard-coded.
|
||||
English indefinite article:
|
||||
```
|
||||
oper artIndef : Str =
|
||||
pre {"a" ; "an" / strs {"a" ; "e" ; "i" ; "o"}} ;
|
||||
pre {
|
||||
("a" | "e" | "i" | "o") => "an" ;
|
||||
_ => "a"
|
||||
} ;
|
||||
|
||||
```
|
||||
Thus
|
||||
```
|
||||
@@ -2772,9 +2773,10 @@ Thus
|
||||
|
||||
#NEW
|
||||
|
||||
#Lchapfive
|
||||
|
||||
=Lesson 4: Using the resource grammar library=
|
||||
|
||||
#Lchapfive
|
||||
|
||||
Goals:
|
||||
- navigate in the GF resource grammar library and use it in applications
|
||||
@@ -2945,7 +2947,7 @@ We need the following combinations:
|
||||
```
|
||||
We also need **lexical insertion**, to form phrases from single words:
|
||||
```
|
||||
mkCN : N -> NP ;
|
||||
mkCN : N -> CN ;
|
||||
mkAP : A -> AP ;
|
||||
```
|
||||
Naming convention: to construct a //C//, use a function ``mk``//C//.
|
||||
@@ -2966,7 +2968,7 @@ can be built as follows:
|
||||
```
|
||||
mkCl
|
||||
(mkNP these_Det
|
||||
(mkCN (mkAP very_AdA (mkAP warm_A)) (mkCN pizza_CN)))
|
||||
(mkCN (mkAP very_AdA (mkAP warm_A)) (mkCN pizza_N)))
|
||||
(mkAP italian_AP)
|
||||
```
|
||||
The task now: to define the concrete syntax of ``Foods`` so that
|
||||
@@ -3305,13 +3307,13 @@ we can write a **functor instantiation**,
|
||||
oper
|
||||
wine_N = mkN "Wein" ;
|
||||
pizza_N = mkN "Pizza" "Pizzen" feminine ;
|
||||
cheese_N = mkN "Käse" "Käsen" masculine ;
|
||||
cheese_N = mkN "Käse" "Käsen" masculine ;
|
||||
fish_N = mkN "Fisch" ;
|
||||
fresh_A = mkA "frisch" ;
|
||||
warm_A = mkA "warm" "wärmer" "wärmste" ;
|
||||
warm_A = mkA "warm" "wärmer" "wärmste" ;
|
||||
italian_A = mkA "italienisch" ;
|
||||
expensive_A = mkA "teuer" ;
|
||||
delicious_A = mkA "köstlich" ;
|
||||
delicious_A = mkA "köstlich" ;
|
||||
boring_A = mkA "langweilig" ;
|
||||
}
|
||||
```
|
||||
@@ -3362,11 +3364,11 @@ Lexicon instance
|
||||
cheese_N = mkN "juusto" ;
|
||||
fish_N = mkN "kala" ;
|
||||
fresh_A = mkA "tuore" ;
|
||||
warm_A = mkA "lämmin" ;
|
||||
warm_A = mkA "lämmin" ;
|
||||
italian_A = mkA "italialainen" ;
|
||||
expensive_A = mkA "kallis" ;
|
||||
delicious_A = mkA "herkullinen" ;
|
||||
boring_A = mkA "tylsä" ;
|
||||
boring_A = mkA "tylsä" ;
|
||||
}
|
||||
```
|
||||
Functor instantiation
|
||||
@@ -3614,9 +3616,10 @@ tenses and moods, e.g. the Romance languages.
|
||||
|
||||
#NEW
|
||||
|
||||
#Lchapsix
|
||||
|
||||
=Lesson 5: Refining semantics in abstract syntax=
|
||||
|
||||
#Lchapsix
|
||||
|
||||
Goals:
|
||||
- include semantic conditions in grammars, by using
|
||||
@@ -3626,7 +3629,7 @@ Goals:
|
||||
- semantic definitions
|
||||
|
||||
These concepts are inherited from **type theory** (more precisely:
|
||||
constructive type theory, or Martin-Löf type theory).
|
||||
constructive type theory, or Martin-Löf type theory).
|
||||
|
||||
Type theory is the basis **logical frameworks**.
|
||||
|
||||
@@ -3714,49 +3717,25 @@ Concrete syntax does not know if a category is a dependent type.
|
||||
```
|
||||
Notice that the ``Kind`` argument is suppressed in linearization.
|
||||
|
||||
Parsing with dependent types is performed in two phases:
|
||||
Parsing with dependent types consists of two phases:
|
||||
+ context-free parsing
|
||||
+ filtering through type checker
|
||||
|
||||
Parsing a type-correct command works as expected:
|
||||
|
||||
By just doing the first phase, the ``kind`` argument is not found:
|
||||
```
|
||||
> parse "dim the light"
|
||||
CAction ? dim (DKindOne light)
|
||||
```
|
||||
Moreover, type-incorrect commands are not rejected:
|
||||
```
|
||||
> parse "dim the fan"
|
||||
CAction ? dim (DKindOne fan)
|
||||
```
|
||||
The term ``?`` is a **metavariable**, returned by the parser
|
||||
for any subtree that is suppressed by a linearization rule.
|
||||
These are the same kind of metavariables as were used #Rsecediting
|
||||
to mark incomplete parts of trees in the syntax editor.
|
||||
|
||||
|
||||
|
||||
#NEW
|
||||
|
||||
===Solving metavariables===
|
||||
|
||||
Use the command ``put_tree = pt`` with the option ``-typecheck``:
|
||||
```
|
||||
> parse "dim the light" | put_tree -typecheck
|
||||
CAction light dim (DKindOne light)
|
||||
```
|
||||
The ``typecheck`` process may fail, in which case an error message
|
||||
is shown and no tree is returned:
|
||||
However, type-incorrect commands are rejected by the typecheck:
|
||||
```
|
||||
> parse "dim the fan" | put_tree -typecheck
|
||||
|
||||
Error in tree UCommand (CAction ? 0 dim (DKindOne fan)) :
|
||||
(? 0 <> fan) (? 0 <> light)
|
||||
> parse "dim the fan"
|
||||
The parsing is successful but the type checking failed with error(s):
|
||||
Couldn't match expected type Device light
|
||||
against the interred type Device fan
|
||||
In the expression: DKindOne fan
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
#NEW
|
||||
|
||||
==Polymorphism==
|
||||
@@ -3782,23 +3761,19 @@ to express Haskell-type library functions:
|
||||
\_,_,_,f,x,y -> f y x ;
|
||||
```
|
||||
|
||||
|
||||
#NEW
|
||||
|
||||
===Dependent types: exercises===
|
||||
|
||||
1. Write an abstract syntax module with above contents
|
||||
and an appropriate English concrete syntax. Try to parse the commands
|
||||
//dim the light// and //dim the fan//, with and without ``solve`` filtering.
|
||||
//dim the light// and //dim the fan//.
|
||||
|
||||
|
||||
2. Perform random and exhaustive generation, with and without
|
||||
``solve`` filtering.
|
||||
2. Perform random and exhaustive generation.
|
||||
|
||||
3. Add some device kinds and actions to the grammar.
|
||||
|
||||
|
||||
|
||||
#NEW
|
||||
|
||||
==Proof objects==
|
||||
@@ -3908,7 +3883,6 @@ fun
|
||||
Classes for new actions can be added incrementally.
|
||||
|
||||
|
||||
|
||||
#NEW
|
||||
|
||||
==Variable bindings==
|
||||
@@ -4177,11 +4151,11 @@ Type checking can be invoked with ``put_term -transform=solve``.
|
||||
|
||||
#NEW
|
||||
|
||||
#Lchapseven
|
||||
|
||||
==Lesson 6: Grammars of formal languages==
|
||||
|
||||
|
||||
#Lchapseven
|
||||
|
||||
Goals:
|
||||
- write grammars for formal languages (mathematical notation, programming languages)
|
||||
- interface between formal and natural langauges
|
||||
@@ -4196,7 +4170,8 @@ We construct a calculator with addition, subtraction, multiplication, and
|
||||
division of integers.
|
||||
```
|
||||
abstract Calculator = {
|
||||
|
||||
flags startcat = Exp ;
|
||||
|
||||
cat Exp ;
|
||||
|
||||
fun
|
||||
@@ -4222,7 +4197,7 @@ We begin with a
|
||||
concrete syntax that always uses parentheses around binary
|
||||
operator applications:
|
||||
```
|
||||
concrete CalculatorP of Calculator = {
|
||||
concrete CalculatorP of Calculator = open Prelude in {
|
||||
|
||||
lincat
|
||||
Exp = SS ;
|
||||
@@ -4516,9 +4491,10 @@ point literals as arguments.
|
||||
|
||||
#NEW
|
||||
|
||||
#Lchapeight
|
||||
|
||||
=Lesson 7: Embedded grammars=
|
||||
|
||||
#Lchapeight
|
||||
|
||||
Goals:
|
||||
- use grammars as parts of programs written in Haskell and JavaScript
|
||||
@@ -4639,7 +4615,7 @@ output. Therefore it can be a part of a pipe and read and write files.
|
||||
The simplest way to translate is to ``echo`` input to the program:
|
||||
```
|
||||
% echo "this wine is delicious" | ./trans Food.pgf
|
||||
questo vino č delizioso
|
||||
questo vino è delizioso
|
||||
```
|
||||
The result is given in all languages except the input language.
|
||||
|
||||
@@ -4732,10 +4708,6 @@ abstract Query = {
|
||||
|
||||
To make it easy to define a transfer function, we export the
|
||||
abstract syntax to a system of Haskell datatypes:
|
||||
```
|
||||
% gf --output-format=haskell Query.pgf
|
||||
```
|
||||
It is also possible to produce the Haskell file together with PGF, by
|
||||
```
|
||||
% gf -make --output-format=haskell QueryEng.gf
|
||||
```
|
||||
@@ -4958,12 +4930,12 @@ syntax name. This file contains the multilingual grammar as a JavaScript object.
|
||||
===Using the JavaScript grammar===
|
||||
|
||||
To perform parsing and linearization, the run-time library
|
||||
``gflib.js`` is used. It is included in ``GF/lib/javascript/``, together with
|
||||
``gflib.js`` is used. It is included in ``/src/runtime/javascript/``, together with
|
||||
some other JavaScript and HTML files; these files can be used
|
||||
as templates for building applications.
|
||||
|
||||
An example of usage is
|
||||
[``translator.html`` http://grammaticalframework.org:41296],
|
||||
[``translator.html`` ../../src/runtime/javascript/translator.html],
|
||||
which is in fact initialized with
|
||||
a pointer to the Food grammar, so that it provides translation between the English
|
||||
and Italian grammars:
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
FILES="darcs.txt transfer-reference.txt transfer-tutorial.txt \
|
||||
transfer.txt"
|
||||
|
||||
for f in $FILES; do
|
||||
h=`basename "$f" ".txt"`.html
|
||||
if [ "$f" -nt "$h" ]; then
|
||||
txt2tags $f
|
||||
else
|
||||
echo "$h is newer than $f, skipping"
|
||||
fi
|
||||
done
|
||||
@@ -1,10 +1,6 @@
|
||||
GF character encoding changes
|
||||
Thomas Hallgren
|
||||
%%mtime(%F)
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
2013-12-18
|
||||
|
||||
==Changes to character encodings in GF grammar files ==
|
||||
|
||||
|
||||
25
download/gfc
25
download/gfc
@@ -1,25 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
prefix="/usr/local"
|
||||
|
||||
case "i386-apple-darwin9.3.0" in
|
||||
*-cygwin)
|
||||
prefix=`cygpath -w "$prefix"`;;
|
||||
esac
|
||||
|
||||
exec_prefix="${prefix}"
|
||||
GF_BIN_DIR="${exec_prefix}/bin"
|
||||
GF_DATA_DIR="${prefix}/share/GF-3.0-beta"
|
||||
|
||||
GFBIN="$GF_BIN_DIR/gf"
|
||||
|
||||
if [ ! -x "${GFBIN}" ]; then
|
||||
GFBIN=`which gf`
|
||||
fi
|
||||
|
||||
if [ ! -x "${GFBIN}" ]; then
|
||||
echo "gf not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec $GFBIN --batch "$@"
|
||||
@@ -16,7 +16,7 @@ GF 3.1.6 released 23 April 2010.
|
||||
- Windows (zipped executable):
|
||||
[``gf-3.1.6-bin-i486-windows.zip`` gf-3.1.6-bin-i486-windows.zip]
|
||||
(1.6 MB)
|
||||
- Ubuntu Linux (gzipped executable):
|
||||
- Ubuntu Linux (gzipped executable):
|
||||
[``gf-3.1.6-bin-i486-linux.gz`` gf-3.1.6-bin-i486-linux.gz]
|
||||
(1.7 MB)
|
||||
- compiled library package:
|
||||
@@ -25,7 +25,7 @@ GF 3.1.6 released 23 April 2010.
|
||||
- full source package (GF system, libraries, examples, documentation):
|
||||
[``gf-3.1.6-src.tar.gz`` gf-3.1.6-src.tar.gz]
|
||||
(11 MB)
|
||||
|
||||
|
||||
GF is also on [Hackage http://hackage.haskell.org/package/gf]
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ What's new? See the [release notes release-3.1.6.html].
|
||||
==Installation instructions==
|
||||
|
||||
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
It finds the libraries relative to the ``.exe`` file.
|
||||
|
||||
To install a binary package for MacOS X or Linux: uncompress the executable and
|
||||
|
||||
201
download/index-3.10.md
Normal file
201
download/index-3.10.md
Normal file
@@ -0,0 +1,201 @@
|
||||
---
|
||||
title: Grammatical Framework Download and Installation
|
||||
...
|
||||
|
||||
**GF 3.10** was released on 2 December 2018.
|
||||
|
||||
What's new? See the [release notes](release-3.10.html).
|
||||
|
||||
## Binary packages
|
||||
|
||||
These binary packages include both the GF core (compiler and runtime) as well as the pre-compiled RGL.
|
||||
|
||||
| Platform | Download | Features | How to install |
|
||||
|:----------------|:---------------------------------------------------|:---------------|:-----------------------------------|
|
||||
| macOS | [gf-3.10.pkg](gf-3.10.pkg) | GF, S, C, J, P | Double-click on the package icon |
|
||||
| Raspbian 10 (buster) | [gf\_3.10-2\_armhf.deb](gf_3.10-2_armhf.deb) | GF,S,C,J,P | `sudo dpkg -i gf_3.10-2_armhf.deb` |
|
||||
| Ubuntu (32-bit) | [gf\_3.10-2\_i386.deb](gf_3.10-2_i386.deb) | GF, S, C, J, P | `sudo dpkg -i gf_3.10-2_i386.deb` |
|
||||
| Ubuntu (64-bit) | [gf\_3.10-2\_amd64.deb](gf_3.10-2_amd64.deb) | GF, S, C, J, P | `sudo dpkg -i gf_3.10-2_amd64.deb` |
|
||||
| Windows | [gf-3.10-bin-windows.zip](gf-3.10-bin-windows.zip) | GF, S | `unzip gf-3.10-bin-windows.zip` |
|
||||
|
||||
<!--
|
||||
| macOS | [gf-3.10-bin-intel-mac.tar.gz](gf-3.10-bin-intel-mac.tar.gz) | GF,S,C,J,P | `sudo tar -C /usr/local -zxf gf-3.10-bin-intel-mac.tar.gz` |
|
||||
-->
|
||||
|
||||
**Features**
|
||||
|
||||
- GF = GF shell and grammar compiler
|
||||
- S = `gf -server` mode
|
||||
- C = C run-time system
|
||||
- J/P = Java/Python binding to the C run-time system
|
||||
|
||||
### Notes
|
||||
|
||||
The Windows package is installed by just unpacking it anywhere. You will
|
||||
probably need to set the `PATH` and `GF_LIB_PATH` environment variables,
|
||||
see Inari's notes on [Installing GF on Windows](http://www.grammaticalframework.org/~inari/gf-windows.html#toc3).
|
||||
|
||||
The Ubuntu `.deb` packages should work on Ubuntu 16.04 and 18.04 and
|
||||
similar Linux distributions. The `.deb` packages were updated
|
||||
to version 3.10-2 after the release of GF 3.10.
|
||||
(Because of a packaging bug the Resource Grammar Library was missing
|
||||
in the 3.10-1 packages.)
|
||||
|
||||
<!-- The Raspbian `.deb` package was created on a Raspberry Pi 3 and will
|
||||
probably work on other ARM-based systems running Debian 9 (stretch) or
|
||||
similar Linux distributions. -->
|
||||
|
||||
The packages for macOS (Mac OS X) should work on at least 10.13 and
|
||||
10.14 (High Sierra and Mojave)
|
||||
|
||||
<!-- The Mac OS and Linux `.tar.gz` packages are designed to be installed in
|
||||
`/usr/local`. You can install them in other locations, but then you need
|
||||
to set the `GF_LIB_PATH` environment variable:
|
||||
|
||||
```
|
||||
export GF_LIB_PATH=/usr/local/share/gf-3.10/lib
|
||||
```
|
||||
|
||||
where `/usr/local` should be replaced with the path to the location
|
||||
where you unpacked the package. -->
|
||||
|
||||
## Installing the latest release from source
|
||||
|
||||
[GF is on Hackage](http://hackage.haskell.org/package/gf), so under
|
||||
normal circumstances the procedure is fairly simple:
|
||||
|
||||
1. Install a recent version of the [Haskell
|
||||
Platform](http://hackage.haskell.org/platform) (see note below)
|
||||
2. `cabal update`
|
||||
3. On Linux: install some C libraries from your Linux distribution (see note below)
|
||||
4. `cabal install gf`
|
||||
|
||||
This installs the GF executable and Haskell libraries, but **does not include the RGL**.
|
||||
|
||||
You can also download the source code release from [GitHub](https://github.com/GrammaticalFramework/gf-core/releases),
|
||||
and follow the instructions below under **Installing from the latest developer source code**.
|
||||
|
||||
### Notes
|
||||
|
||||
**Installation location**
|
||||
|
||||
The above steps installs GF for a single user. The executables are put
|
||||
in `$HOME/.cabal/bin` (or, with recent versions of the Haskell platform
|
||||
on Mac OS X, in `$HOME/Library/Haskell/bin`), so it is a good idea to
|
||||
put a line in your `.bash_profile` or `.profile` to add that directory
|
||||
to you path:
|
||||
|
||||
```
|
||||
PATH=$HOME/.cabal/bin:$PATH
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
PATH=$HOME/Library/Haskell/bin:$PATH
|
||||
```
|
||||
|
||||
**Build tools**
|
||||
|
||||
In order to compile GF you need the build tools **Alex** and **Happy**.
|
||||
These can be installed via Cabal, e.g.:
|
||||
|
||||
```
|
||||
cabal install alex happy
|
||||
```
|
||||
|
||||
or obtained by other means, depending on your OS.
|
||||
|
||||
**Haskeline**
|
||||
|
||||
GF uses [`haskeline`](http://hackage.haskell.org/package/haskeline), which
|
||||
on Linux depends on some non-Haskell libraries that won't be installed
|
||||
automatically by cabal, and therefore need to be installed manually.
|
||||
Here is one way to do this:
|
||||
|
||||
- On Ubuntu: `sudo apt-get install libghc-haskeline-dev`
|
||||
- On Fedora: `sudo dnf install ghc-haskeline-devel`
|
||||
|
||||
**GHC version**
|
||||
|
||||
The GF source code has been updated to compile with GHC 8.4.
|
||||
Using older versions of GHC (e.g. 8.2, 8.0 and 7.10) should still work too.
|
||||
|
||||
## Installing from the latest developer source code
|
||||
|
||||
If you haven't already, clone the repository with:
|
||||
|
||||
```
|
||||
git clone https://github.com/GrammaticalFramework/gf-core.git
|
||||
```
|
||||
|
||||
If you've already cloned the repository previously, update with:
|
||||
|
||||
```
|
||||
git pull
|
||||
```
|
||||
|
||||
Then install with:
|
||||
|
||||
```
|
||||
cabal install
|
||||
```
|
||||
|
||||
or, if you're a Stack user:
|
||||
|
||||
```
|
||||
stack install
|
||||
```
|
||||
|
||||
The above notes for installing from source apply also in these cases.
|
||||
For more info on working with the GF source code, see the
|
||||
[GF Developers Guide](../doc/gf-developers.html).
|
||||
|
||||
## Installing the RGL from source
|
||||
|
||||
To install the RGL from source,
|
||||
you can download a release from [GitHub](https://github.com/GrammaticalFramework/gf-rgl/releases)
|
||||
or get the latest version by cloning the repository:
|
||||
|
||||
```
|
||||
git clone https://github.com/GrammaticalFramework/gf-rgl.git
|
||||
```
|
||||
|
||||
In both cases, once you have the RGL sources you can install them by running:
|
||||
|
||||
```
|
||||
make
|
||||
```
|
||||
|
||||
in the RGL folder.
|
||||
This assumes that you already have GF installed.
|
||||
For more details about building the RGL, see the [RGL README](https://github.com/GrammaticalFramework/gf-rgl/blob/master/README.md).
|
||||
|
||||
## Installing the Python bindings from PyPI
|
||||
|
||||
The Python library is available on PyPI as `pgf`, so it can be installed using:
|
||||
|
||||
```
|
||||
pip install pgf
|
||||
```
|
||||
|
||||
We provide binary wheels for Linux and OSX (with Windows missing so far), which
|
||||
include the C runtime and a ready-to-go. If there is no binary distribution for
|
||||
your platform, this will install the source tarball, which will attempt to build
|
||||
the binding during installation, and requires the GF C runtime to be installed on
|
||||
your system.
|
||||
|
||||
## Older releases
|
||||
|
||||
- [GF 3.9](index-3.9.html) (August 2017)
|
||||
- [GF 3.8](index-3.8.html) (June 2016)
|
||||
- [GF 3.7.1](index-3.7.1.html) (October 2015)
|
||||
- [GF 3.7](index-3.7.html) (June 2015)
|
||||
- [GF 3.6](index-3.6.html) (June 2014)
|
||||
- [GF 3.5](index-3.5.html) (August 2013)
|
||||
- [GF 3.4](index-3.4.html) (January 2013)
|
||||
- [GF 3.3.3](index-3.3.3.html) (March 2012)
|
||||
- [GF 3.3](index-3.3.html) (October 2011)
|
||||
- [GF 3.2.9](index-3.2.9.html) source-only snapshot (September 2011)
|
||||
- [GF 3.2](index-3.2.html) (December 2010)
|
||||
- [GF 3.1.6](index-3.1.6.html) (April 2010)
|
||||
192
download/index-3.11.md
Normal file
192
download/index-3.11.md
Normal file
@@ -0,0 +1,192 @@
|
||||
---
|
||||
title: Grammatical Framework Download and Installation
|
||||
date: 25 July 2021
|
||||
---
|
||||
|
||||
**GF 3.11** was released on 25 July 2021.
|
||||
|
||||
What's new? See the [release notes](release-3.11.html).
|
||||
|
||||
#### Note: GF core and the RGL
|
||||
|
||||
The following instructions explain how to install **GF core**, i.e. the compiler, shell and run-time systems.
|
||||
Obtaining the **Resource Grammar Library (RGL)** is done separately; see the section at the bottom of this page.
|
||||
|
||||
---
|
||||
|
||||
## Installing from a binary package
|
||||
|
||||
Binary packages are available for Debian/Ubuntu, macOS, and Windows and include:
|
||||
|
||||
- GF shell and grammar compiler
|
||||
- `gf -server` mode
|
||||
- C run-time system
|
||||
- Java & Python bindings to the C run-time system
|
||||
|
||||
Unlike in previous versions, the binaries **do not** include the RGL.
|
||||
|
||||
[Binary packages on GitHub](https://github.com/GrammaticalFramework/gf-core/releases/tag/3.11)
|
||||
|
||||
#### Debian/Ubuntu
|
||||
|
||||
There are two versions: `gf-3.11-ubuntu-18.04.deb` for Ubuntu 18.04 (Cosmic), and `gf-3.11-ubuntu-20.04.deb` for Ubuntu 20.04 (Focal).
|
||||
|
||||
To install the package use:
|
||||
|
||||
```
|
||||
sudo apt-get install ./gf-3.11-ubuntu-*.deb
|
||||
```
|
||||
|
||||
<!-- The Ubuntu `.deb` packages should work on Ubuntu 16.04, 18.04 and similar Linux distributions. -->
|
||||
|
||||
#### macOS
|
||||
|
||||
To install the package, just double-click it and follow the installer instructions.
|
||||
|
||||
The packages should work on at least Catalina and Big Sur.
|
||||
|
||||
#### Windows
|
||||
|
||||
To install the package, unpack it anywhere.
|
||||
|
||||
You will probably need to update the `PATH` environment variable to include your chosen install location.
|
||||
|
||||
For more information, see [Using GF on Windows](https://www.grammaticalframework.org/~inari/gf-windows.html) (latest updated for Windows 10).
|
||||
|
||||
## Installing from Hackage
|
||||
|
||||
_Instructions applicable for macOS, Linux, and WSL2 on Windows._
|
||||
|
||||
[GF is on Hackage](http://hackage.haskell.org/package/gf), so under
|
||||
normal circumstances the procedure is fairly simple:
|
||||
|
||||
```
|
||||
cabal update
|
||||
cabal install gf-3.11
|
||||
```
|
||||
|
||||
### Notes
|
||||
|
||||
**GHC version**
|
||||
|
||||
The GF source code is known to be compilable with GHC versions 7.10 through to 8.10.
|
||||
|
||||
**Obtaining Haskell**
|
||||
|
||||
There are various ways of obtaining Haskell, including:
|
||||
|
||||
- ghcup
|
||||
1. Install from https://www.haskell.org/ghcup/
|
||||
2. `ghcup install ghc 8.10.4`
|
||||
3. `ghcup set ghc 8.10.4`
|
||||
- Haskell Platform https://www.haskell.org/platform/
|
||||
- Stack https://haskellstack.org/
|
||||
|
||||
|
||||
**Installation location**
|
||||
|
||||
The above steps install GF for a single user.
|
||||
The executables are put in `$HOME/.cabal/bin` (or on macOS in `$HOME/Library/Haskell/bin`),
|
||||
so you might want to add this directory to your path (in `.bash_profile` or similar):
|
||||
|
||||
```
|
||||
PATH=$HOME/.cabal/bin:$PATH
|
||||
```
|
||||
|
||||
**Haskeline**
|
||||
|
||||
GF uses [`haskeline`](http://hackage.haskell.org/package/haskeline), which
|
||||
on Linux depends on some non-Haskell libraries that won't be installed
|
||||
automatically by Cabal, and therefore need to be installed manually.
|
||||
Here is one way to do this:
|
||||
|
||||
- On Ubuntu: `sudo apt-get install libghc-haskeline-dev`
|
||||
- On Fedora: `sudo dnf install ghc-haskeline-devel`
|
||||
|
||||
## Installing from source code
|
||||
|
||||
**Obtaining**
|
||||
|
||||
To obtain the source code for the **release**,
|
||||
download it from [GitHub](https://github.com/GrammaticalFramework/gf-core/releases).
|
||||
|
||||
Alternatively, to obtain the **latest version** of the source code:
|
||||
|
||||
1. If you haven't already, clone the repository with:
|
||||
```
|
||||
git clone https://github.com/GrammaticalFramework/gf-core.git
|
||||
```
|
||||
2. If you've already cloned the repository previously, update with:
|
||||
```
|
||||
git pull
|
||||
```
|
||||
|
||||
|
||||
**Installing**
|
||||
|
||||
You can then install with:
|
||||
```
|
||||
cabal install
|
||||
```
|
||||
|
||||
or, if you're a Stack user:
|
||||
|
||||
```
|
||||
stack install
|
||||
```
|
||||
|
||||
<!--The above notes for installing from source apply also in these cases.-->
|
||||
For more info on working with the GF source code, see the
|
||||
[GF Developers Guide](../doc/gf-developers.html).
|
||||
|
||||
## Installing the Python bindings from PyPI
|
||||
|
||||
The Python library is available on PyPI as `pgf`, so it can be installed using:
|
||||
|
||||
```
|
||||
pip install pgf
|
||||
```
|
||||
|
||||
We provide binary wheels for Linux and macOS, which include the C runtime and are ready-to-go.
|
||||
If there is no binary distribution for your platform, this will install the source tarball,
|
||||
which will attempt to build the binding during installation,
|
||||
and requires the GF C runtime to be installed on your system.
|
||||
|
||||
---
|
||||
|
||||
## Installing the RGL from a binary release
|
||||
|
||||
Binary releases of the RGL are made available on [GitHub](https://github.com/GrammaticalFramework/gf-rgl/releases).
|
||||
In general the steps to follow are:
|
||||
|
||||
1. Download a binary release and extract it somewhere on your system.
|
||||
2. Set the environment variable `GF_LIB_PATH` to point to wherever you extracted the RGL.
|
||||
|
||||
## Installing the RGL from source
|
||||
|
||||
To compile the RGL, you will need to have GF already installed and in your path.
|
||||
|
||||
1. Obtain the RGL source code, either by:
|
||||
- cloning with `git clone https://github.com/GrammaticalFramework/gf-rgl.git`
|
||||
- downloading a source archive [here](https://github.com/GrammaticalFramework/gf-rgl/archive/master.zip)
|
||||
2. Run `make` in the source code folder.
|
||||
|
||||
For more options, see the [RGL README](https://github.com/GrammaticalFramework/gf-rgl/blob/master/README.md).
|
||||
|
||||
---
|
||||
|
||||
## Older releases
|
||||
|
||||
- [GF 3.10](index-3.10.html) (December 2018)
|
||||
- [GF 3.9](index-3.9.html) (August 2017)
|
||||
- [GF 3.8](index-3.8.html) (June 2016)
|
||||
- [GF 3.7.1](index-3.7.1.html) (October 2015)
|
||||
- [GF 3.7](index-3.7.html) (June 2015)
|
||||
- [GF 3.6](index-3.6.html) (June 2014)
|
||||
- [GF 3.5](index-3.5.html) (August 2013)
|
||||
- [GF 3.4](index-3.4.html) (January 2013)
|
||||
- [GF 3.3.3](index-3.3.3.html) (March 2012)
|
||||
- [GF 3.3](index-3.3.html) (October 2011)
|
||||
- [GF 3.2.9](index-3.2.9.html) source-only snapshot (September 2011)
|
||||
- [GF 3.2](index-3.2.html) (December 2010)
|
||||
- [GF 3.1.6](index-3.1.6.html) (April 2010)
|
||||
@@ -1,11 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TD><B> <TH>
|
||||
%!postproc(html): </B></TD> </TH>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
**GF 3.2.9** source-only snapshot was released on 12 September 2011.
|
||||
|
||||
What's new? Faster grammar compilation!
|
||||
@@ -77,9 +72,3 @@ The above notes for installing from source apply also in this case.
|
||||
- [GF 3.2 index-3.2.html] (December 2011).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TD><B> <TH>
|
||||
%!postproc(html): </B></TD> </TH>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
**GF 3.2** was released on 23 December 2010.
|
||||
|
||||
What's new? See the [Release notes release-3.2.html].
|
||||
@@ -27,7 +22,7 @@ More packages might be added later.
|
||||
|
||||
===Notes===
|
||||
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
It finds the libraries relative to the ``.exe`` file.
|
||||
|
||||
The ``.deb`` packages work on Ubuntu 10.04 and 10.10.
|
||||
@@ -105,8 +100,3 @@ Subsequently:
|
||||
```
|
||||
|
||||
The above notes for installing from source apply also in this case.
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <TD><B> <TH>
|
||||
%!postproc(html): </B></TD> </TH>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
**GF 3.3.3** was released on 3 March 2012.
|
||||
|
||||
What's new? See the [Release notes release-3.3.3.html].
|
||||
@@ -24,7 +18,7 @@ What's new? See the [Release notes release-3.3.3.html].
|
||||
|
||||
===Notes===
|
||||
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
It finds the libraries relative to the ``.exe`` file.
|
||||
|
||||
%The ``.deb`` packages work on Ubuntu 10.04 and 10.10.
|
||||
@@ -127,9 +121,3 @@ For more info, see the [GF Developers Guide ../doc/gf-developers.html].
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TD><B> <TH>
|
||||
%!postproc(html): </B></TD> </TH>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
**GF 3.3** was released on 27 October 2011.
|
||||
|
||||
What's new? See the [Release notes release-3.3.html].
|
||||
@@ -27,7 +22,7 @@ More packages might be added later.
|
||||
|
||||
===Notes===
|
||||
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
The Windows package is installed by just unpacking it anywhere.
|
||||
It finds the libraries relative to the ``.exe`` file.
|
||||
|
||||
%The ``.deb`` packages work on Ubuntu 10.04 and 10.10.
|
||||
@@ -115,9 +110,3 @@ The above notes for installing from source apply also in this case.
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): </HEAD> <STYLE>body { color: #333; } li>code,p>code,pre { color: #730; }</STYLE></HEAD>
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <TD><B> <TH>
|
||||
%!postproc(html): </B></TD> </TH>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
**GF 3.4** was released on 31 January 2013.
|
||||
|
||||
What's new? See the [Release notes release-3.4.html].
|
||||
@@ -20,14 +13,11 @@ What's new? See the [Release notes release-3.4.html].
|
||||
| Fedora (32-bit) | [Fedora RPMs /~hallgren/tmp/Fedora/] | ``sudo rpm -i ...``
|
||||
| Ubuntu (32-bit) | [gf_3.4-1_i386.deb gf_3.4-1_i386.deb] | ``sudo dpkg -i gf_3.4-1_i386.deb``
|
||||
| Ubuntu (64-bit) | [gf_3.4-1_amd64.deb gf_3.4-1_amd64.deb] | ``sudo dpkg -i gf_3.4-1_amd64.deb``
|
||||
| Windows | [gf-3.4-bin-windows.zip gf-3.4-bin-windows.zip] |
|
||||
%| ... | ... | ...
|
||||
|
||||
%More binary packages might be added later.
|
||||
| Windows | [gf-3.4-bin-windows.zip gf-3.4-bin-windows.zip] | -
|
||||
|
||||
===Notes===
|
||||
|
||||
%The Windows package is installed by just unpacking it anywhere.
|
||||
%The Windows package is installed by just unpacking it anywhere.
|
||||
%It finds the libraries relative to the ``.exe`` file.
|
||||
|
||||
The ``.deb`` packages work on Ubuntu 12.04, 12.10 and 13.04.
|
||||
@@ -153,8 +143,3 @@ For more info on working with the GF source code, see the
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): </HEAD> <STYLE>body { color: #333; } li>code,p>code,pre { color: #730; }</STYLE></HEAD>
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <TD><B> <TH>
|
||||
%!postproc(html): </B></TD> </TH>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
**GF 3.5** was released on 6 August 2013.
|
||||
|
||||
What's new? See the [Release notes release-3.5.html].
|
||||
@@ -157,8 +150,3 @@ For more info on working with the GF source code, see the
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): </HEAD> <STYLE>body { color: #333; } li>code,p>code,pre { color: #730; }</STYLE></HEAD>
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
%!postproc(html): <TD><I> <TD><small>
|
||||
%!postproc(html): </I></TD> </small></TD>
|
||||
|
||||
**GF 3.6** was released on 23 June 2014.
|
||||
|
||||
What's new? See the [Release notes release-3.6.html].
|
||||
@@ -177,8 +170,3 @@ For more info on working with the GF source code, see the
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/notes.css
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
%!postproc(html): <TD><I> <TD><small>
|
||||
%!postproc(html): </I></TD> </small></TD>
|
||||
|
||||
**GF 3.7.1** was released on 2 October 2015.
|
||||
|
||||
What's new? See the [Release notes release-3.7.1.html].
|
||||
@@ -46,7 +40,7 @@ The ``.deb`` packages work on Ubuntu 12.04, 14.04 and 15.04.
|
||||
|
||||
The packages for Mac OS X should work on at least 10.9, 10.10 and 10.11 (Mavericks, Yosemite and El Capitan).
|
||||
|
||||
(*) **Note** that for compatibility with OS X 10.11,
|
||||
(*) **Note** that for compatibility with OS X 10.11,
|
||||
``gf-3.7.1.pkg`` will install the ``gf`` executable in ``/usr/local/bin``
|
||||
instead of ``/usr/bin``, so make sure ``/usr/local/bin`` is in your ``$PATH``.
|
||||
Also, if you still have an older version of GF installed in ``/usr/bin``,
|
||||
@@ -180,8 +174,3 @@ For more info on working with the GF source code, see the
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): </HEAD> <STYLE>body { color: #333; } li>code,p>code,pre { color: #730; }</STYLE></HEAD>
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
%!postproc(html): <TD><I> <TD><small>
|
||||
%!postproc(html): </I></TD> </small></TD>
|
||||
|
||||
**GF 3.7** was released on 25 June 2015.
|
||||
|
||||
What's new? See the [Release notes release-3.7.html].
|
||||
@@ -173,8 +166,3 @@ For more info on working with the GF source code, see the
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/notes.css
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
%!postproc(html): <TD><I> <TD><small>
|
||||
%!postproc(html): </I></TD> </small></TD>
|
||||
|
||||
**GF 3.8** was released on 22 June 2016.
|
||||
|
||||
What's new? See the [Release notes release-3.8.html].
|
||||
@@ -49,7 +43,7 @@ Linux distributions.
|
||||
|
||||
The packages for Mac OS X should work on at least 10.9, 10.10 and 10.11 (Mavericks, Yosemite and El Capitan).
|
||||
|
||||
(*) **Note** that for compatibility with OS X 10.11,
|
||||
(*) **Note** that for compatibility with OS X 10.11,
|
||||
``gf-3.8.pkg`` will install the ``gf`` executable in ``/usr/local/bin``
|
||||
instead of ``/usr/bin``, so make sure ``/usr/local/bin`` is in your ``$PATH``.
|
||||
Also, if you still have an older version of GF installed in ``/usr/bin``,
|
||||
@@ -171,8 +165,3 @@ For more info on working with the GF source code, see the
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
Grammatical Framework Download and Installation
|
||||
|
||||
|
||||
%!style:../css/notes.css
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
%!postproc(html): <TD><I> <TD><small>
|
||||
%!postproc(html): </I></TD> </small></TD>
|
||||
|
||||
**GF 3.9** was released on 11 August 2017.
|
||||
|
||||
What's new? See the [Release notes release-3.9.html].
|
||||
@@ -18,10 +12,11 @@ What's new? See the [Release notes release-3.9.html].
|
||||
| macOS | [gf-3.9.pkg gf-3.9.pkg] | //GF+S+C+J+P// | Double-click on the package icon
|
||||
| macOS | [gf-3.9-bin-intel-mac.tar.gz gf-3.9-bin-intel-mac.tar.gz] | //GF+S+C+J+P// | ``sudo tar -C /usr/local -zxf gf-3.9-bin-intel-mac.tar.gz``
|
||||
%| Fedora (32-bit) | [Fedora RPMs /~hallgren/tmp/Fedora/] | //GF+S+C+J+P// | ``sudo rpm -i ...``
|
||||
| Raspian 9.1 | [gf_3.9-1_armhf.deb gf_3.9-1_armhf.deb] | //GF+S+C+J+P// | ``sudo dpkg -i gf_3.9-1_armhf.deb``
|
||||
| Raspbian 9.1 | [gf_3.9-1_armhf.deb gf_3.9-1_armhf.deb] | //GF+S+C+J+P// | ``sudo dpkg -i gf_3.9-1_armhf.deb``
|
||||
| Ubuntu (32-bit) | [gf_3.9-1_i386.deb gf_3.9-1_i386.deb] | //GF+S+C+J+P// | ``sudo dpkg -i gf_3.9-1_i386.deb``
|
||||
| Ubuntu (64-bit) | [gf_3.9-1_amd64.deb gf_3.9-1_amd64.deb] | //GF+S+C+J+P// | ``sudo dpkg -i gf_3.9-1_amd64.deb``
|
||||
| Windows | [gf-3.9-bin-windows.zip gf-3.9-bin-windows.zip] | //GF+S// | ``unzip gf-3.9-bin-windows.zip``
|
||||
|
||||
%| MINGW | [gf-3.9-bin-i686-MINGW32_NT-6.1.tar.gz gf-3.9-bin-i686-MINGW32_NT-6.1.tar.gz] | //GF+S+C// | ``tar -C / gf-3.9-bin-i686-MINGW32_NT-6.1.tar.gz``
|
||||
%| ... | ... | ... | ...
|
||||
|
||||
@@ -195,8 +190,3 @@ with ``stack install`` (assuming you already have Stack set up).
|
||||
- [GF 3.2 index-3.2.html] (December 2010).
|
||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||
- [GF 3.1 old-index.html] (December 2009).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
8
download/index.html
Normal file
8
download/index.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; URL=/download/index-3.11.html" />
|
||||
</head>
|
||||
<body>
|
||||
You are being redirected to <a href="index-3.11.html">the current version</a> of this page.
|
||||
</body>
|
||||
</html>
|
||||
@@ -5,13 +5,13 @@ GF Version 3.1.6 Release Notes
|
||||
=Installation=
|
||||
|
||||
The binaries now work out of the box for each platform and support
|
||||
completions (file names and parsing), because readline has been
|
||||
completions (file names and parsing), because readline has been
|
||||
changed to haskeline.
|
||||
|
||||
To compile from source, GHC 6.12 is now required. But GHC is not needed
|
||||
if the binary executables are used.
|
||||
|
||||
Binaries (``.gfo`` and ``.pgf`` files) compiled with GF 3.1 are incompatible
|
||||
Binaries (``.gfo`` and ``.pgf`` files) compiled with GF 3.1 are incompatible
|
||||
with 3.1.6 and must either be removed; alternatively, the ``-src`` flag can be
|
||||
used when compiling.
|
||||
|
||||
@@ -24,8 +24,8 @@ Grammar language
|
||||
- improved support for dependent types (see ``SUMO``, ``nqueens`` in ``examples``)
|
||||
|
||||
|
||||
Shell commands and options (see ``help`` in GF for more information)
|
||||
- ``eb``: example-based grammar file conversion
|
||||
Shell commands and options (see ``help`` in GF for more information)
|
||||
- ``eb``: example-based grammar file conversion
|
||||
(see ``examples/animals/QuestionI.gf``)
|
||||
- ``vd = visualize_dependency``: show dependency tree
|
||||
- ``vp = visualize_parse``: show parse tree
|
||||
@@ -57,8 +57,3 @@ Internal
|
||||
|
||||
Javascript generation is not updated to the new PGF format.
|
||||
[GF 3.1 old-index.html] should still be used for building Javascript applications.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
66
download/release-3.10.md
Normal file
66
download/release-3.10.md
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
title: GF 3.10 Release Notes
|
||||
date: 2 December 2018
|
||||
...
|
||||
|
||||
## Installation
|
||||
|
||||
See the [download page](index.html).
|
||||
|
||||
## What's new
|
||||
|
||||
In this release, the GF "core" (compiler and runtimes) and RGL have been split into separate repositories.
|
||||
The binary packages on the downloads page contain both GF and the RGL, but the sources are now separate:
|
||||
[gf-core](https://github.com/GrammaticalFramework/gf-core) and
|
||||
[gf-rgl](https://github.com/GrammaticalFramework/gf-rgl).
|
||||
|
||||
Over 300 changes have been pushed to GF and over 600 changes have been made to the RGL
|
||||
since the release of GF 3.9 in August 2017.
|
||||
|
||||
## General
|
||||
|
||||
- Travis integration:
|
||||
GF [](https://travis-ci.org/GrammaticalFramework/gf-core) and
|
||||
RGL [](https://travis-ci.org/GrammaticalFramework/gf-rgl)
|
||||
- A lot of bug fixes and repository cleanup, including things moved to new repositories:
|
||||
- [Phrasebook](https://github.com/GrammaticalFramework/gf-contrib/tree/master/phrasebook)
|
||||
- [Wide coverage translator](https://github.com/GrammaticalFramework/wide-coverage)
|
||||
- [Mobile apps](https://github.com/GrammaticalFramework/gf-offline-translator)
|
||||
- [gftest](https://github.com/GrammaticalFramework/gftest)
|
||||
- [gf-mode](https://github.com/GrammaticalFramework/gf-emacs-mode) for Emacs
|
||||
- [RGL browser](https://github.com/GrammaticalFramework/rgl-source-browser) (live [here](http://www.grammaticalframework.org/~john/rgl-browser/))
|
||||
- A fresh look for the GF website.
|
||||
|
||||
## GF compiler and run-time library
|
||||
|
||||
- Extensive improvements in the C runtime and bindings to it from Python, Java, Haskell, C#
|
||||
- A GF shell which uses the C runtime
|
||||
- Better error messages
|
||||
- GF now has a Stack configuration file
|
||||
- The compiler source code has been updated for compatibility with GHC 8.4.3.
|
||||
- `GF_LIB_PATH` can now be `path1:path2:path3`, not just `path1`
|
||||
- Add TypeScript type definitions for `gflib.js`
|
||||
- New compiler/shell options
|
||||
- added option `-output-format=java` for producing code for embedded grammars in Java
|
||||
- `rf -paragraphs`
|
||||
- `linearize -tabtreebank`
|
||||
- A new function called `completions` is added in the Haskell runtime and used in PGFService. This makes the extraction of completions more platform independent
|
||||
|
||||
## Resource Grammar Library
|
||||
|
||||
- [Bash build script](https://github.com/GrammaticalFramework/gf-rgl/blob/master/Setup.sh), for building the RGL without Haskell
|
||||
- [Windows build script](https://github.com/GrammaticalFramework/gf-rgl/blob/master/Setup.bat), for building the RGL without Haskell on a regular Windows command shell
|
||||
- New languages:
|
||||
- Basque
|
||||
- Portuguese
|
||||
- Big progress with Arabic, Turkish, Persian
|
||||
- Introduction of `Extend` module to combine the functions of `Extra` and `Extensions` in a more disciplined way
|
||||
- Various fixes for several languages.
|
||||
- Various fixes in the translation dictionaries.
|
||||
|
||||
## Apps and Cloud services
|
||||
|
||||
- Sort list of public grammars by age by default
|
||||
- Browser compatibility fixes
|
||||
- Allow public grammars to be deleted in more cases
|
||||
- Show grammar comments in the list of public grammars
|
||||
43
download/release-3.11.md
Normal file
43
download/release-3.11.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: GF 3.11 Release Notes
|
||||
date: 25 July 2021
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
See the [download page](index-3.11.html).
|
||||
|
||||
## What's new
|
||||
|
||||
From this release, the binary GF core packages do not contain the RGL.
|
||||
The RGL's release cycle is now completely separate from GF's. See [RGL releases](https://github.com/GrammaticalFramework/gf-rgl/releases).
|
||||
|
||||
Over 500 changes have been pushed to GF core
|
||||
since the release of GF 3.10 in December 2018.
|
||||
|
||||
## General
|
||||
|
||||
- Make the test suite work again.
|
||||
- Compatibility with new versions of GHC, including multiple Stack files for the different versions.
|
||||
- Support for newer version of Ubuntu 20.04 in the precompiled binaries.
|
||||
- Updates to build scripts and CI workflows.
|
||||
- Bug fixes and code cleanup.
|
||||
|
||||
## GF compiler and run-time library
|
||||
|
||||
- Add CoNLL output to `visualize_tree` shell command.
|
||||
- Add canonical GF as output format in the compiler.
|
||||
- Add PGF JSON as output format in the compiler.
|
||||
- Deprecate JavaScript runtime in favour of updated [TypeScript runtime](https://github.com/GrammaticalFramework/gf-typescript).
|
||||
- Improvements in time & space requirements when compiling certain grammars.
|
||||
- Improvements to Haskell export.
|
||||
- Improvements to the GF shell.
|
||||
- Improvements to canonical GF compilation.
|
||||
- Improvements to the C runtime.
|
||||
- Improvements to `gf -server` mode.
|
||||
- Clearer compiler error messages.
|
||||
|
||||
## Other
|
||||
|
||||
- Web page and documentation improvements.
|
||||
- Add WordNet module to GFSE.
|
||||
@@ -1,9 +1,6 @@
|
||||
GF Version 3.2 Release Notes
|
||||
December 2010
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <H1> <H1><IMG src="../doc/Logos/gf0.png">
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -34,8 +31,3 @@ See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
|
||||
- GF compiler: GPL
|
||||
- Run-time libraries and Resource Grammar Library: LGPL + BSD
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF Version 3.3.3 Release Notes
|
||||
March 2012
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><IMG src="../doc/Logos/gf0.png">
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -25,8 +21,3 @@ See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
- Fix for a bug that prevented the shell commands ``abstract_info``,
|
||||
``generate_random`` and ``generate_trees`` from working properly.
|
||||
- Various other small improvements and bug fixes.
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
GF Version 3.3 Release Notes
|
||||
October 2011
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta name = "viewport" content = "width = device-width"><TITLE>
|
||||
%!postproc(html): <H1> <H1><IMG src="../doc/Logos/gf0.png">
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
|
||||
==New features==
|
||||
|
||||
- Source language extension: it is now possible to override the oper definitions in an interface, by using the
|
||||
- Source language extension: it is now possible to override the oper definitions in an interface, by using the
|
||||
header syntax ``instance Foo of Bar - [f,g,h]``.
|
||||
- New functionalities in GF shell commands (more information with ``help`` command-name).
|
||||
- ``aw`` = ``align_words`` option ``-giza`` prints word alignments in Giza++ format.
|
||||
@@ -29,8 +25,3 @@ See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
and the web-based grammar editor.
|
||||
- Faster grammar compilation (also included in the GF 3.2.9 source-only
|
||||
snapshot).
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF Version 3.4 Release Notes
|
||||
January 2013
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -46,8 +42,3 @@ See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
- Some new functionality in the web-based grammar editor, e.g. preliminary
|
||||
support for public grammars.
|
||||
- Various other small improvements and bug fixes.
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF 3.5 Release Notes
|
||||
August 2013
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -70,7 +66,3 @@ of GF 3.4.
|
||||
[``network-2.4.1.1`` https://github.com/haskell/network/commit/f2168b1f8978b4ad9c504e545755f0795ac869ce].
|
||||
- Various other small improvements and bug fixes.
|
||||
%- [...]
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF 3.6 Release Notes
|
||||
June 2014
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -26,7 +22,7 @@ Closed [issues http://code.google.com/p/grammatical-framework/issues/list]:
|
||||
as ``--# -coding=``//enc//, instead of ``flags coding=``//enc//.
|
||||
See the separate document
|
||||
[GF character encoding changes encoding-change.html] for more details.
|
||||
- Record update: in record objects (but not types) of form ``r ** s``, the values assigned
|
||||
- Record update: in record objects (but not types) of form ``r ** s``, the values assigned
|
||||
in ``s`` now overwrite those in ``r``. In previous versions, record extensions with
|
||||
overlapping assignments in ``r`` and ``s`` were not supported, and their behaviour was
|
||||
unpredictable.
|
||||
@@ -107,8 +103,3 @@ Closed [issues http://code.google.com/p/grammatical-framework/issues/list]:
|
||||
- ``c-wordforword``: this works as ``c-translate`` but does a
|
||||
word-for-word lookup to create a (potentially very low quality)
|
||||
translation that can be used if all else fails.
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF 3.7.1 Release Notes
|
||||
October 2015
|
||||
|
||||
%!style:../css/notes.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -18,10 +14,10 @@ Over 170 changes have been pushed to the source repository since
|
||||
|
||||
====New features and notable changes====
|
||||
|
||||
- GF shell: ``cc -trace`` (preliminary): you can now do things like
|
||||
|
||||
- GF shell: ``cc -trace`` (preliminary): you can now do things like
|
||||
|
||||
``cc -trace mkV "debug"``
|
||||
|
||||
|
||||
to see a trace of all opers with their arguments and results during the
|
||||
computation of ``mkV "debug"``.
|
||||
|
||||
@@ -29,7 +25,7 @@ Over 170 changes have been pushed to the source repository since
|
||||
from the GF shell by starting GF with ``gf -cshell`` or ``gf -crun``.
|
||||
Only limited functionality is available when running the shell in these
|
||||
modes (use the ``help`` command in the shell for details):
|
||||
|
||||
|
||||
- You can only import ``.pgf`` files, not source files.
|
||||
- The ``-retain`` flag can not be used and the commands that require it to
|
||||
work are not available.
|
||||
@@ -77,8 +73,3 @@ Over 170 changes have been pushed to the source repository since
|
||||
you can leave ``&+`` uninterpreted instead of gluing the adjacent tokens.
|
||||
This means that the output is left in a format that can be parsed in
|
||||
a subsequent request.
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF 3.7 Release Notes
|
||||
June 2015
|
||||
|
||||
%!style:../css/style.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -40,7 +36,7 @@ Over 800 changes have been pushed to the source repository since
|
||||
``BIND``, ``SOFT_BIND``, ``SOFT_SPACE``, ``CAPIT``, ``ALL_CAPIT`` and
|
||||
``nonExist``.
|
||||
- It is now possible to define callbacks for literals from the Haskell
|
||||
binding to the C runtime. This is used for instance in
|
||||
binding to the C runtime. This is used for instance in
|
||||
the Wide Coverage translator on the Web.
|
||||
|
||||
|
||||
@@ -103,8 +99,3 @@ Over 800 changes have been pushed to the source repository since
|
||||
unused for 24 hours, to keep memory use down in long running servers.
|
||||
- PGF service: limit the number of parallel calls to the C run-time parse
|
||||
function to 4 by default. The limit can be changed with the ``-j`` flag.
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF 3.8 Release Notes
|
||||
June 2016
|
||||
|
||||
%!style:../css/notes.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -25,7 +21,7 @@ Roughly 400 changes have been pushed to the source repository since
|
||||
[universal dependency http://universaldependencies.org/] diagrams
|
||||
in various formats, see ``help vd``.
|
||||
- The C runtime now includes an experimental library for managing
|
||||
and querying ontologies built on top of the abstract syntax of
|
||||
and querying ontologies built on top of the abstract syntax of
|
||||
a grammar. Since the ontology is based on an abstract syntax,
|
||||
it is language independent by design. For now the library is
|
||||
only used in the GF Offline Translator. The library uses
|
||||
@@ -100,7 +96,3 @@ Roughly 400 changes have been pushed to the source repository since
|
||||
translations in the domain they cover.
|
||||
You can change the order in which the selected grammars are tried
|
||||
by dragging them up and down in the list.
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
GF 3.9 Release Notes
|
||||
August 2017
|
||||
|
||||
%!style:../css/notes.css
|
||||
%!postproc(html): <TITLE> <meta charset="UTF-8"><meta name = "viewport" content = "width = device-width"> <TITLE>
|
||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
||||
|
||||
==Installation==
|
||||
|
||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||
@@ -36,7 +32,7 @@ very innefficient for some grammars.
|
||||
|
||||
- A new .NET binding for the GF runtime is available.
|
||||
|
||||
- The API in the Java binding is extended and it covers more from
|
||||
- The API in the Java binding is extended and it covers more from
|
||||
the full functionality of the C runtime.
|
||||
|
||||
|
||||
@@ -66,8 +62,3 @@ the full functionality of the C runtime.
|
||||
|
||||
- PGF service: support for language-specific depencency configurations in
|
||||
``command=deptree``.
|
||||
|
||||
|
||||
--------------------
|
||||
|
||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
||||
|
||||
BIN
favicon.ico
Normal file
BIN
favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
228
gf.cabal
228
gf.cabal
@@ -1,19 +1,19 @@
|
||||
name: gf
|
||||
version: 3.10
|
||||
version: 3.11.0-git
|
||||
|
||||
cabal-version: >= 1.22
|
||||
cabal-version: 1.22
|
||||
build-type: Custom
|
||||
license: OtherLicense
|
||||
license-file: LICENSE
|
||||
category: Natural Language Processing, Compiler
|
||||
synopsis: Grammatical Framework
|
||||
description: GF, Grammatical Framework, is a programming language for multilingual grammar applications
|
||||
homepage: http://www.grammaticalframework.org/
|
||||
homepage: https://www.grammaticalframework.org/
|
||||
bug-reports: https://github.com/GrammaticalFramework/gf-core/issues
|
||||
maintainer: Thomas Hallgren
|
||||
tested-with: GHC==7.6.3, GHC==7.8.3, GHC==7.10.3, GHC==8.0.2
|
||||
tested-with: GHC==7.10.3, GHC==8.0.2, GHC==8.10.4
|
||||
|
||||
data-dir: src
|
||||
extra-source-files: WebSetup.hs
|
||||
data-files:
|
||||
www/*.html
|
||||
www/*.css
|
||||
@@ -41,39 +41,34 @@ data-files:
|
||||
|
||||
custom-setup
|
||||
setup-depends:
|
||||
base,
|
||||
Cabal >=1.22.0.0,
|
||||
directory,
|
||||
filepath,
|
||||
process >=1.0.1.1
|
||||
base >= 4.9.1 && < 4.15,
|
||||
Cabal >= 1.22.0.0,
|
||||
directory >= 1.3.0 && < 1.4,
|
||||
filepath >= 1.4.1 && < 1.5,
|
||||
process >= 1.0.1.1 && < 1.7
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
type: git
|
||||
location: https://github.com/GrammaticalFramework/gf-core.git
|
||||
|
||||
flag interrupt
|
||||
Description: Enable Ctrl+Break in the shell
|
||||
Default: True
|
||||
Default: True
|
||||
|
||||
flag server
|
||||
Description: Include --server mode
|
||||
Default: True
|
||||
Default: True
|
||||
|
||||
flag network-uri
|
||||
description: Get Network.URI from the network-uri package
|
||||
default: True
|
||||
|
||||
--flag new-comp
|
||||
-- Description: Make -new-comp the default
|
||||
-- Default: True
|
||||
|
||||
flag c-runtime
|
||||
Description: Include functionality from the C run-time library (which must be installed already)
|
||||
Default: False
|
||||
|
||||
Library
|
||||
executable gf
|
||||
hs-source-dirs: src/programs, src/compiler
|
||||
main-is: gf-main.hs
|
||||
default-language: Haskell2010
|
||||
build-depends: base >= 4.6 && <5,
|
||||
build-depends: pgf2,
|
||||
base >= 4.6 && <5,
|
||||
array,
|
||||
containers,
|
||||
bytestring,
|
||||
@@ -81,77 +76,19 @@ Library
|
||||
random,
|
||||
pretty,
|
||||
mtl,
|
||||
exceptions
|
||||
hs-source-dirs: src/runtime/haskell
|
||||
exceptions,
|
||||
ghc-prim,
|
||||
filepath, directory>=1.2, time,
|
||||
process, haskeline, parallel>=3, json
|
||||
ghc-options: -threaded
|
||||
|
||||
other-modules:
|
||||
-- not really part of GF but I have changed the original binary library
|
||||
-- and we have to keep the copy for now.
|
||||
Data.Binary
|
||||
Data.Binary.Put
|
||||
Data.Binary.Get
|
||||
Data.Binary.Builder
|
||||
Data.Binary.IEEE754
|
||||
|
||||
--ghc-options: -fwarn-unused-imports
|
||||
--if impl(ghc>=7.8)
|
||||
-- ghc-options: +RTS -A20M -RTS
|
||||
ghc-prof-options: -fprof-auto
|
||||
extensions:
|
||||
|
||||
exposed-modules:
|
||||
PGF
|
||||
PGF.Internal
|
||||
PGF.Haskell
|
||||
|
||||
other-modules:
|
||||
PGF.Data
|
||||
PGF.Macros
|
||||
PGF.Binary
|
||||
PGF.Optimize
|
||||
PGF.Printer
|
||||
PGF.CId
|
||||
PGF.Expr
|
||||
PGF.Generate
|
||||
PGF.Linearize
|
||||
PGF.Morphology
|
||||
PGF.Paraphrase
|
||||
PGF.Parse
|
||||
PGF.Probabilistic
|
||||
PGF.SortTop
|
||||
PGF.Tree
|
||||
PGF.Type
|
||||
PGF.TypeCheck
|
||||
PGF.Forest
|
||||
PGF.TrieMap
|
||||
PGF.VisualizeTree
|
||||
PGF.ByteCode
|
||||
PGF.OldBinary
|
||||
PGF.Utilities
|
||||
|
||||
if flag(c-runtime)
|
||||
exposed-modules: PGF2
|
||||
other-modules: PGF2.FFI PGF2.Expr PGF2.Type
|
||||
GF.Interactive2 GF.Command.Commands2
|
||||
hs-source-dirs: src/runtime/haskell-bind
|
||||
build-tools: hsc2hs
|
||||
extra-libraries: pgf gu
|
||||
c-sources: src/runtime/haskell-bind/utils.c
|
||||
cc-options: -std=c99
|
||||
|
||||
---- GF compiler as a library:
|
||||
|
||||
build-depends: filepath, directory, time, time-compat, old-locale,
|
||||
process, haskeline, parallel>=3
|
||||
|
||||
hs-source-dirs: src/compiler
|
||||
exposed-modules:
|
||||
GF
|
||||
GF.Support
|
||||
GF.Text.Pretty
|
||||
GF.Text.Lexing
|
||||
GF.Grammar.Canonical
|
||||
|
||||
other-modules:
|
||||
GF.Main GF.Compiler GF.Interactive
|
||||
|
||||
GF.Compile GF.CompileInParallel GF.CompileOne GF.Compile.GetGrammar
|
||||
@@ -172,25 +109,21 @@ Library
|
||||
GF.Command.TreeOperations
|
||||
GF.Compile.CFGtoPGF
|
||||
GF.Compile.CheckGrammar
|
||||
GF.Compile.Compute.AppPredefined
|
||||
GF.Compile.Compute.ConcreteNew
|
||||
-- GF.Compile.Compute.ConcreteNew1
|
||||
GF.Compile.Compute.Predef
|
||||
GF.Compile.Compute.Value
|
||||
GF.Compile.Compute.Concrete
|
||||
GF.Compile.ExampleBased
|
||||
GF.Compile.Export
|
||||
GF.Compile.GenerateBC
|
||||
GF.Compile.GeneratePMCFG
|
||||
GF.Compile.GrammarToPGF
|
||||
GF.Compile.Multi
|
||||
GF.Compile.Optimize
|
||||
GF.Compile.OptimizePGF
|
||||
GF.Compile.PGFtoHaskell
|
||||
GF.Compile.PGFtoJava
|
||||
GF.Haskell
|
||||
GF.Compile.ConcreteToHaskell
|
||||
GF.Compile.PGFtoJS
|
||||
GF.Compile.PGFtoProlog
|
||||
GF.Compile.PGFtoPython
|
||||
GF.Compile.GrammarToCanonical
|
||||
GF.Grammar.CanonicalJSON
|
||||
GF.Compile.PGFtoJSON
|
||||
GF.Compile.ReadFiles
|
||||
GF.Compile.Rename
|
||||
GF.Compile.SubExOpt
|
||||
@@ -200,7 +133,6 @@ Library
|
||||
GF.Compile.TypeCheck.Concrete
|
||||
GF.Compile.TypeCheck.ConcreteNew
|
||||
GF.Compile.TypeCheck.Primitives
|
||||
GF.Compile.TypeCheck.RConcrete
|
||||
GF.Compile.TypeCheck.TC
|
||||
GF.Compile.Update
|
||||
GF.Data.BacktrackM
|
||||
@@ -258,90 +190,38 @@ Library
|
||||
GF.System.Directory
|
||||
GF.System.Process
|
||||
GF.System.Signal
|
||||
GF.System.NoSignal
|
||||
GF.Text.Clitics
|
||||
GF.Text.Coding
|
||||
GF.Text.Lexing
|
||||
GF.Text.Transliterations
|
||||
Paths_gf
|
||||
|
||||
if flag(c-runtime)
|
||||
cpp-options: -DC_RUNTIME
|
||||
|
||||
if flag(server)
|
||||
build-depends: httpd-shed>=0.4.0.3, network>=2.3 && <2.7, json,
|
||||
cgi>=3001.2.2.0
|
||||
if flag(network-uri)
|
||||
build-depends: network-uri>=2.6, network>=2.6
|
||||
else
|
||||
build-depends: network<2.6
|
||||
|
||||
cpp-options: -DSERVER_MODE
|
||||
other-modules:
|
||||
GF.Server
|
||||
PGFService
|
||||
RunHTTP
|
||||
SimpleEditor.Convert
|
||||
SimpleEditor.JSON
|
||||
SimpleEditor.Syntax
|
||||
URLEncoding
|
||||
CGI
|
||||
CGIUtils
|
||||
Cache
|
||||
Fold
|
||||
hs-source-dirs: src/server src/server/transfer
|
||||
|
||||
if flag(interrupt)
|
||||
cpp-options: -DUSE_INTERRUPT
|
||||
other-modules: GF.System.UseSignal
|
||||
else
|
||||
other-modules: GF.System.NoSignal
|
||||
|
||||
if impl(ghc>=7.8)
|
||||
build-tools: happy>=1.19, alex>=3.1
|
||||
-- ghc-options: +RTS -A20M -RTS
|
||||
else
|
||||
build-tools: happy, alex>=3
|
||||
|
||||
ghc-options: -fno-warn-tabs
|
||||
|
||||
-- not really part of GF but I have changed the original binary library
|
||||
-- and we have to keep the copy for now.
|
||||
Data.Binary
|
||||
Data.Binary.Put
|
||||
Data.Binary.Get
|
||||
Data.Binary.Builder
|
||||
Data.Binary.IEEE754
|
||||
|
||||
if os(windows)
|
||||
build-depends: Win32
|
||||
build-depends:
|
||||
Win32 >= 2.3.1.1 && < 2.7
|
||||
else
|
||||
build-depends: unix, terminfo>=0.4
|
||||
|
||||
if impl(ghc>=8.2)
|
||||
ghc-options: -fhide-source-paths
|
||||
|
||||
Executable gf
|
||||
hs-source-dirs: src/programs
|
||||
main-is: gf-main.hs
|
||||
default-language: Haskell2010
|
||||
build-depends: gf, base
|
||||
ghc-options: -threaded
|
||||
--ghc-options: -fwarn-unused-imports
|
||||
|
||||
if impl(ghc>=7.0)
|
||||
ghc-options: -rtsopts -with-rtsopts=-I5
|
||||
if impl(ghc<7.8)
|
||||
ghc-options: -with-rtsopts=-K64M
|
||||
|
||||
ghc-prof-options: -auto-all
|
||||
|
||||
if impl(ghc>=8.2)
|
||||
ghc-options: -fhide-source-paths
|
||||
|
||||
executable pgf-shell
|
||||
--if !flag(c-runtime)
|
||||
buildable: False
|
||||
main-is: pgf-shell.hs
|
||||
hs-source-dirs: src/runtime/haskell-bind/examples
|
||||
build-depends: gf, base, containers, mtl, lifted-base
|
||||
default-language: Haskell2010
|
||||
if impl(ghc>=7.0)
|
||||
ghc-options: -rtsopts
|
||||
build-depends:
|
||||
terminfo >=0.4.0 && < 0.5,
|
||||
unix >= 2.7.2 && < 2.8
|
||||
|
||||
test-suite gf-tests
|
||||
type: exitcode-stdio-1.0
|
||||
main-is: run.hs
|
||||
type: exitcode-stdio-1.0
|
||||
main-is: run.hs
|
||||
hs-source-dirs: testsuite
|
||||
build-depends: base>=4.3 && <5, Cabal>=1.8, directory, filepath, process
|
||||
default-language: Haskell2010
|
||||
build-depends:
|
||||
base >= 4.9.1 && < 4.15,
|
||||
Cabal >= 1.8,
|
||||
directory >= 1.3.0 && < 1.4,
|
||||
filepath >= 1.4.1 && < 1.5,
|
||||
process >= 1.4.3 && < 1.7
|
||||
build-tool-depends: gf:gf
|
||||
default-language: Haskell2010
|
||||
|
||||
735
index.html
735
index.html
@@ -1,418 +1,416 @@
|
||||
<!DOCTYPE html>
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>GF - Grammatical Framework</TITLE>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="css/newstyle.css" title="GF">
|
||||
<link rel="alternate" href="https://github.com/GrammaticalFramework/gf-core/" title="GF GitHub repository">
|
||||
<meta name = "viewport" content = "width = device-width">
|
||||
<script type="text/javascript">
|
||||
function sitesearch() {
|
||||
var q=document.forms[0].q.value;
|
||||
var site=" site:www.grammaticalframework.org";
|
||||
var search=encodeURIComponent(q+site)
|
||||
document.location.href="http://www.google.com/search?q="+search
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<meta name="keywords" content="machine translation">
|
||||
</HEAD>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<body class=new>
|
||||
<title>GF - Grammatical Framework</title>
|
||||
<meta name="keywords" content="machine translation">
|
||||
|
||||
<div class="header sky blue">
|
||||
<img class="gflogo" src="doc/Logos/gf1.svg" alt="">
|
||||
<H1>Grammatical Framework</H1>
|
||||
<small class=tagline>A programming language for multilingual grammar applications</small>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" crossorigin="anonymous">
|
||||
|
||||
<link rel="alternate" href="https://github.com/GrammaticalFramework/gf-core/" title="GF GitHub repository">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container-fluid my-5" style="max-width:1200px">
|
||||
|
||||
<div class="text-center">
|
||||
<img style="height:250px" src="doc/Logos/gf1.svg" alt="GF Logo">
|
||||
<h1 class="display-4" style="text-shadow: 1px 1px 5px #999;">Grammatical Framework</h1>
|
||||
<h4 class="text-black-50">A programming language for multilingual grammar applications</h4>
|
||||
</div>
|
||||
|
||||
<div class=menu>
|
||||
<div class="row mt-4">
|
||||
|
||||
<div class=links>
|
||||
<h4>Use GF</h4>
|
||||
<ul>
|
||||
<li><a href="http://cloud.grammaticalframework.org/">GF Cloud<img class=right src="src/www/P/gf-cloud.png" alt="GF Cloud Service" title="GF Cloud Service"></a>
|
||||
<li><A HREF="demos/index.html">Other Demos</A>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><A HREF="http://www.grammaticalframework.org/download/index.html"><b>Download GF</b></A>
|
||||
<li><a href="doc/gf-editor-modes.html">GF Editor Modes</a>
|
||||
</ul>
|
||||
<div class="col-sm-6 col-md-3 mb-4">
|
||||
<h3>Get started</h3>
|
||||
<ul class="mb-2">
|
||||
<li><a href="https://www.youtube.com/watch?v=x1LFbDQhbso">Google Tech Talk</a></li>
|
||||
<li>
|
||||
<a href="//cloud.grammaticalframework.org/">
|
||||
GF Cloud
|
||||
<img src="src/www/P/gf-cloud.png" style="height:30px" class="ml-2" alt="Cloud logo">
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="doc/tutorial/gf-tutorial.html">Tutorial</a>
|
||||
/
|
||||
<a href="lib/doc/rgl-tutorial/index.html">RGL Tutorial</a>
|
||||
</li>
|
||||
<li><a href="doc/gf-video-tutorials.html">Video Tutorials</a></li>
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><A HREF="http://groups.google.com/group/gf-dev">User Group</A>
|
||||
<li><a href="https://github.com/GrammaticalFramework/gf-core/issues">Bug Reports</a>
|
||||
(<a href="http://code.google.com/p/grammatical-framework/issues/list">old</a>)
|
||||
</ul>
|
||||
</div>
|
||||
<a href="download/index.html" class="btn btn-primary ml-3">
|
||||
<i class="fas fa-download mr-1"></i>
|
||||
Download GF
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class=links>
|
||||
<h4>Learn GF</h4>
|
||||
<ul>
|
||||
<li><a href="https://www.youtube.com/watch?v=x1LFbDQhbso">Google Tech Talk</a>
|
||||
<li><A HREF="doc/gf-quickstart.html">QuickStart</A>
|
||||
<li><A HREF="doc/gf-reference.html">QuickRefCard</A>
|
||||
<li><A HREF="doc/gf-shell-reference.html">GF Shell Reference</A>
|
||||
<li><a href="http://school.grammaticalframework.org/"><b>GF Summer School</b></a>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><A HREF="gf-book">The GF Book</A>
|
||||
<li><A HREF="doc/tutorial/gf-tutorial.html">GF Tutorial</A>
|
||||
<li><A HREF="doc/gf-refman.html">Reference Manual</A>
|
||||
<li><A HREF="http://www.molto-project.eu/sites/default/files/MOLTO_D2.3.pdf">Best Practices</A> <small>[PDF]</small>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><A HREF="lib/doc/synopsis.html">Library Synopsis</A>
|
||||
<li><A HREF="doc/gf-lrec-2010.pdf">Library Tutorial</A> <small>[PDF]</small>
|
||||
<li><A HREF="http://www.postcrashgames.com/gf_world/">Coverage Map</A>
|
||||
</ul>
|
||||
<div class="col-sm-6 col-md-3 mb-4">
|
||||
<h3>Learn more</h3>
|
||||
|
||||
</div>
|
||||
<div class=links>
|
||||
<h4>Develop GF</h4>
|
||||
<ul>
|
||||
<li><a href="doc/gf-developers.html">GF Developers Guide</a>
|
||||
<li><A HREF="https://github.com/GrammaticalFramework/">GF on GitHub</A>
|
||||
<li><a href="/~hallgren/gf-experiment/browse/">Browse Source Code</a>
|
||||
<li><A HREF="doc/gf-people.html">Authors</A>
|
||||
</ul>
|
||||
<h4>Develop Applications</h4>
|
||||
<ul>
|
||||
<li><a href="http://hackage.haskell.org/package/gf-3.9/docs/PGF.html">PGF library API (Old Runtime)</a>
|
||||
<li><a href="doc/runtime-api.html">PGF library API (New Runtime)</a>
|
||||
<li><a href="https://github.com/GrammaticalFramework/gf-offline-translator/tree/master/android">GF on Android (new)</a>
|
||||
<li><A HREF="/android/">GF on Android (old) </A>
|
||||
</ul>
|
||||
</div>
|
||||
<div class=links>
|
||||
<h4>Related to GF</h4>
|
||||
<ul>
|
||||
<li><A HREF="doc/gf-bibliography.html">Publications</A>
|
||||
<li><A HREF="http://remu.grammaticalframework.org/">The REMU Project</A>
|
||||
<li><A HREF="http://www.molto-project.eu">The MOLTO Project</A>
|
||||
<li><a href="http://en.wikipedia.org/wiki/Grammatical_Framework">GF on Wikipedia</a>
|
||||
<li><p><a href="Http://www.digitalgrammars.com/">Digital Grammars AB</a>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="mb-2">
|
||||
<li><a href="gf-book">The GF Book</a></li>
|
||||
<li><a href="doc/gf-refman.html">Reference Manual</a></li>
|
||||
<li><a href="doc/gf-shell-reference.html">Shell Reference</a></li>
|
||||
<li><a href="http://www.molto-project.eu/sites/default/files/MOLTO_D2.3.pdf">Best Practices</a> <small>[PDF]</small></li>
|
||||
<li><a href="https://www.mitpressjournals.org/doi/pdf/10.1162/COLI_a_00378">Scaling Up (Computational Linguistics 2020)</a></li>
|
||||
</ul>
|
||||
|
||||
<a href="lib/doc/synopsis/index.html" class="btn btn-primary ml-3">
|
||||
<i class="fab fa-readme mr-1"></i>
|
||||
RGL Synopsis
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
document.write('<div style="float: right; margin-top: 3ex;"> <form onsubmit="return sitesearch()" method=get action="http://www.google.com/search"> <input type=search name="q" placeholder="site search"> <input type=submit value="Search"> </form></div>')
|
||||
</script>
|
||||
<div class="col-sm-6 col-md-3 mb-4">
|
||||
<h3>Develop</h3>
|
||||
<ul class="mb-2">
|
||||
<li><a href="doc/gf-developers.html">Developers Guide</a></li>
|
||||
<!-- <li><a href="/~hallgren/gf-experiment/browse/">Browse Source Code</a></li> -->
|
||||
<li>PGF library API:<br>
|
||||
<a href="http://hackage.haskell.org/package/gf/docs/PGF.html">Haskell</a> /
|
||||
<a href="doc/runtime-api.html">C runtime</a>
|
||||
</li>
|
||||
<li><a href="http://hackage.haskell.org/package/gf/docs/GF.html">GF compiler API</a></li>
|
||||
<!-- <li><a href="src/ui/android/README">GF on Android (new)</a></li>
|
||||
<li><a href="/android/">GF on Android (old) </a></li> -->
|
||||
<li><a href="doc/gf-editor-modes.html">Text Editor Support</a></li>
|
||||
<li><a href="http://www.grammaticalframework.org/~john/rgl-browser/">RGL source browser</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<H2 class=noclear>News</H2>
|
||||
|
||||
<div class=news2>
|
||||
|
||||
<table class=news>
|
||||
<tr><td>2018-07-25:<td>The GF repository has been split in two:
|
||||
<a href="https://github.com/GrammaticalFramework/gf-core">gf-core</a> and
|
||||
<a href="https://github.com/GrammaticalFramework/gf-rgl">gf-rgl</a>.
|
||||
The original <a href="https://github.com/GrammaticalFramework/GF">GF</a> repository is now archived.
|
||||
<tr><td>2017-08-11:<td><strong>GF 3.9 released!</strong>
|
||||
<a href="download/release-3.9.html">Release notes</a>.
|
||||
<tr><td>2017-06-29:<td>GF is moving to <a href="https://github.com/GrammaticalFramework/GF/">GitHub</a>!
|
||||
<tr><td>2017-03-13:<td><strong>GF Summer School in Riga (Latvia), 14-25 August 2017</strong>
|
||||
<a href="http://school.grammaticalframework.org/2017/">Summer
|
||||
School web page</a>.
|
||||
<tr><td>2016-09-07:<td><strong>Google Tech Talk on GF</strong> <a
|
||||
href="https://www.youtube.com/watch?v=x1LFbDQhbso">on Youtube</a>.
|
||||
<tr><td>2016-07-05:<td>GitHub mirror temporarily not updated, due to server migration.
|
||||
<tr><td>2016-06-22:<td><strong>GF 3.8 released!</strong>
|
||||
<a href="download/release-3.8.html">Release notes</a>.
|
||||
<tr><td>2015-06-21:<td><strong>Summer School in Rule-Based Machine
|
||||
Translation in Alacant/Alicante (Spain), 11-21 July 2016</strong>
|
||||
featuring GF, Apertium, Matxin, and TectoMT.
|
||||
<a href="http://xixona.dlsi.ua.es/rbmt-summer-school/2016/">Summer
|
||||
School web page</a>.
|
||||
<tr><td>2016-06-14:<td>New resource grammar language: Nynorsk.
|
||||
<tr><td>2015-10-02:<td><strong>GF 3.7.1 released!</strong>
|
||||
<a href="download/release-3.7.1.html">Release notes</a>.
|
||||
<tr><td>2015-06-25:<td><strong>GF 3.7 released!</strong>
|
||||
<a href="download/release-3.7.html">Release notes</a>.
|
||||
<tr><td>2015-03-13:<td>New resource grammar language: Mongolian.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
<tr><td>2015-02-09:<td><strong>GF Summer School in Gozo (Malta), 13-24 July 2015</strong>
|
||||
<a href="http://school.grammaticalframework.org/2015/">Summer
|
||||
School web page</a>.
|
||||
<tr><td>2014-06-23:<td><strong>GF 3.6 released!</strong>
|
||||
<a href="download/release-3.6.html">Release notes</a>.
|
||||
<tr><td>2014-03-11:
|
||||
<td>A company for commercial applications of GF has been founded:
|
||||
<a href="http://www.digitalgrammars.com/">Digital Grammars</a>.
|
||||
<tr><td>2013-11-25:
|
||||
<td>The default character encoding in GF grammar files will be changed
|
||||
from Latin-1 to UTF-8. See
|
||||
<a href="download/encoding-change.html">GF character encoding changes</a>
|
||||
for details.
|
||||
<tr><td>2013-10-18:<td>New resource grammar language: Estonian.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
<tr><td>2013-09-18:<td>New <a href="https://github.com/GrammaticalFramework/gf-contrib">GF contributions repository</a>, hosted on GitHub.
|
||||
<tr><td>2013-08-06:<td><strong>GF 3.5 released!</strong>
|
||||
<a href="download/release-3.5.html">Release notes</a>.
|
||||
<tr><td>2013-07-26:<td>Started a page with <A HREF="lib/doc/rgl-publications.html">RGL Documentation and Publications</A>.
|
||||
<tr><td>2013-06-24:<td>We are now running the IRC channel <a href="https://webchat.freenode.net/?channels=gf"><strong><code>#gf</code></strong></a> on the Freenode network.
|
||||
<tr><td>2013-06-19:<td>New resource grammar language: Maltese.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
<tr><td>2013-04-25:<td>New resource grammar language: Greek.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
<tr><td>2013-01-31:<td><strong>GF 3.4 released!</strong>
|
||||
<a href="download/release-3.4.html">Release notes</a>.
|
||||
<tr><td>2012-12-10:<td>
|
||||
<a href="http://www.postcrashgames.com/gf_world/">Resource Grammar Library
|
||||
coverage map</a>, created by Tommi Nieminen.
|
||||
<!--
|
||||
<tr><td>2012-11-18:<td>
|
||||
<A HREF="http://school.grammaticalframework.org/2013">GF Summer School</A>
|
||||
in Frauenchiemsee, 18-30 August 2013.
|
||||
<tr><td>2012-11-18:<td>New resource grammar language: Chinese.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
Complete but not yet perfect.
|
||||
<tr><td>2012-06-29:<td>GF sources now mirrored in GitHub, with change
|
||||
statistics and other browsing features.
|
||||
See <a href="https://github.com/GrammaticalFramework/GF/"><tt>github.com/GrammaticalFramework/GF</tt></a>
|
||||
<tr><td>2012-05-07:<td>New resource grammar language: Japanese.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
<tr><td>2012-03-23:<td>There will be a
|
||||
<a href="gf-tutorial-icfp-2012/">GF tutorial at ICFP 2012</a>
|
||||
in Copenhagen.
|
||||
<tr><td>2012-03-03:<td><strong>GF 3.3.3 released!</strong>
|
||||
<a href="download/release-3.3.3.html">Release notes</a>.
|
||||
<tr><td>2012-02-24:<td>New resource grammar languages: Hindi, Sindhi.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
<tr><td>2011-12-29:<td>New resource grammar languages: Latvian, Thai.
|
||||
See <a href="lib/doc/synopsis.html">library synopsis</a>.
|
||||
<tr><td>2011-10-27:<td><strong>GF 3.3 released!</strong>
|
||||
<a href="download/release-3.3.html">Release notes</a>.
|
||||
<tr><td>2011-09-20:<td>There is now a page collecting
|
||||
<a href="doc/gf-editor-modes.html">editor modes for GF</a>.
|
||||
Contributions are welcome!
|
||||
<tr><td>2011-09-12:<td><strong>GF 3.2.9</strong> source snapshot with faster grammar compilation available. See <a href="download/index.html">Downloads</a>.
|
||||
<tr><td>2011-04-22:<td><a href="android/tutorial/">JPGF Android Tutorial</a> added.
|
||||
<tr><td>2011-04-15:<td>The <a href="gf-book">GF Book</a> is available.
|
||||
<tr><td>2011-01-13:<td><a href="http://www.molto-project.eu/node/1177">Phrasedroid
|
||||
available on the Android Market</a>.
|
||||
<tr><td>2011-01-04:<td>GF is part of the
|
||||
<a href="http://www.clt.gu.se/clt-toolkit">CLT Toolkit</a>.
|
||||
<tr><td>2010-12-23:<td><strong>GF 3.2 released!</strong>
|
||||
<a href="download/release-3.2.html">Release notes</a>.
|
||||
-->
|
||||
</table>
|
||||
<div class="col-sm-6 col-md-3 mb-4">
|
||||
<h3>Contribute</h3>
|
||||
<ul class="mb-2">
|
||||
<li>
|
||||
<a href="https://web.libera.chat/?channels=#gf">
|
||||
<i class="fas fa-hashtag"></i>
|
||||
IRC
|
||||
</a>
|
||||
/
|
||||
<a href="https://discord.gg/EvfUsjzmaz">
|
||||
<i class="fab fa-discord"></i>
|
||||
Discord
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://stackoverflow.com/questions/tagged/gf">
|
||||
<i class="fab fa-stack-overflow"></i>
|
||||
Stack Overflow
|
||||
</a>
|
||||
</li>
|
||||
<li><a href="https://groups.google.com/group/gf-dev">Mailing List</a></li>
|
||||
<li><a href="https://github.com/GrammaticalFramework/gf-core/issues">Issue Tracker</a></li>
|
||||
<li><a href="//school.grammaticalframework.org/2020/">Summer School</a></li>
|
||||
<li><a href="doc/gf-people.html">Authors</a></li>
|
||||
</ul>
|
||||
<a href="https://github.com/GrammaticalFramework/" class="btn btn-primary ml-3">
|
||||
<i class="fab fa-github mr-1"></i>
|
||||
GF on GitHub
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<H2>What is GF</H2>
|
||||
<P>
|
||||
<h2>What is GF?</h2>
|
||||
<p>
|
||||
GF, Grammatical Framework, is a programming language for
|
||||
<B>multilingual grammar applications</B>. It is
|
||||
</P>
|
||||
<UL>
|
||||
<LI>a <B>special-purpose language for grammars</B>, like
|
||||
<strong>multilingual grammar applications</strong>. It is
|
||||
</p>
|
||||
<ul>
|
||||
<li>a <strong>special-purpose language for grammars</strong>, like
|
||||
<a href="http://dinosaur.compilertools.net/yacc/">YACC</a>,
|
||||
<a href="http://www.gnu.org/software/bison/">Bison</a>,
|
||||
<a href="http://www.haskell.org/happy/">Happy</a>,
|
||||
<a href="http://bnfc.digitalgrammars.com/">BNFC</a>,
|
||||
but not restricted to programming languages
|
||||
<LI>a <B>functional programming language</B>, like
|
||||
</li>
|
||||
<li>a <strong>functional programming language</strong>, like
|
||||
<a href="http://www.haskell.org/">Haskell</a>,
|
||||
<a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)">Lisp</a>,
|
||||
<a href="http://ocaml.org/">OCaml</a>,
|
||||
<a href="http://www.smlnj.org/">SML</a>,
|
||||
<a href="http://schemers.org/">Scheme</a>,
|
||||
but specialized to grammar writing
|
||||
<LI>a <B>development platform for natural language grammars</B>, like
|
||||
</li>
|
||||
<li>a <strong>development platform for natural language grammars</strong>, like
|
||||
<a href="http://moin.delph-in.net/LkbTop">LKB</a>,
|
||||
<a href="http://www2.parc.com/isl/groups/nltt/xle/">XLE</a>,
|
||||
<a href="http://www.issco.unige.ch/en/research/projects/regulus/news.shtml">Regulus</a>,
|
||||
but based on functional programming and type theory
|
||||
<LI>a <B>categorial grammar formalism</B>, like
|
||||
</li>
|
||||
<li>a <strong>categorial grammar formalism</strong>, like
|
||||
<a href="http://www.loria.fr/equipes/calligramme/acg/">ACG</a>,
|
||||
<a href="http://openccg.sourceforge.net/">CCG</a>,
|
||||
but specialized for multilingual grammars,
|
||||
<LI>a <B>logical framework</B>, like
|
||||
</li>
|
||||
<li>a <strong>logical framework</strong>, like
|
||||
<a href="http://wiki.portal.chalmers.se/agda/pmwiki.php">Agda</a>,
|
||||
<a href="http://coq.inria.fr/">Coq</a>,
|
||||
<a href="http://www.cl.cam.ac.uk/research/hvg/Isabelle/">Isabelle</a>,
|
||||
but equipped with concrete syntax in addition to logic
|
||||
<li>a <b>platform for machine translation</b>, like
|
||||
</li>
|
||||
<li>a <strong>platform for machine translation</strong>, like
|
||||
<a href="http://www.statmt.org/moses/">Moses</a>,
|
||||
<a href="http://www.apertium.org/">Apertium</a>,
|
||||
but based on deep structural analysis (and usually applied for
|
||||
limited fragments of language).
|
||||
</UL>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<P>
|
||||
<p>
|
||||
Don't worry if you don't know most of the references above - but if you do know at
|
||||
least one, it may help you to get a first idea of what GF is.
|
||||
</P>
|
||||
<H2>Applications</H2>
|
||||
<P>
|
||||
GF can be used for building
|
||||
</P>
|
||||
<UL>
|
||||
<LI><A HREF="http://cloud.grammaticalframework.org/translator/">translation systems</A>
|
||||
<LI><A HREF="http://cloud.grammaticalframework.org/minibar/minibar.html">multilingual web gadgets</A>
|
||||
<LI><A HREF="http://www.cs.chalmers.se/~hallgren/Alfa/Tutorial/GFplugin.html">natural-language interfaces</A>
|
||||
<LI><A HREF="http://www.youtube.com/watch?v=1bfaYHWS6zU">dialogue systems</A>
|
||||
<LI><A HREF="lib/doc/synopsis.html">natural language resources</A>
|
||||
</UL>
|
||||
|
||||
<H2>Availability</H2>
|
||||
<P>
|
||||
GF is <B>open-source</B>, licensed under <A HREF="LICENSE">GPL</A> (the program) and
|
||||
<A HREF="./LICENSE">LGPL</A> and <A HREF="./LICENSE">BSD</A> (the libraries). It
|
||||
is available for
|
||||
</P>
|
||||
<UL>
|
||||
<LI>Linux
|
||||
<LI>Mac OS X
|
||||
<LI>Windows
|
||||
<li>Android mobile platform (via Java; runtime)
|
||||
<LI>via compilation to JavaScript, almost any platform that has a web browser (runtime)
|
||||
</UL>
|
||||
|
||||
<H2>Projects</H2>
|
||||
<P>
|
||||
GF was first created in 1998 at
|
||||
<A HREF="http://www.xrce.xerox.com/">Xerox Research Centre Europe</A>,
|
||||
Grenoble, in the project
|
||||
Multilingual Document Authoring. At Xerox, it was used for prototypes including
|
||||
a restaurant phrase book,
|
||||
a database query system,
|
||||
a formalization of an alarm system instructions with translations to 5 languages, and
|
||||
an authoring system for medical drug descriptions.
|
||||
</P>
|
||||
<P>
|
||||
Later projects using GF and involving third parties include, in chronological order,
|
||||
</P>
|
||||
<UL>
|
||||
<LI><A HREF="http://www.cs.chalmers.se/~hallgren/Alfa/Tutorial/GFplugin.html">GF-Alfa</A>:
|
||||
natural language interface to formal proofs
|
||||
<LI><A HREF="http://efficient.citi.tudor.lu/index_noframe.html">Efficient</A>:
|
||||
authoring tool for business models.
|
||||
<LI><A HREF="http://www.key-project.org/">GF-KeY</A>:
|
||||
authoring and translation of software specifications
|
||||
<LI><A HREF="http://www.talk-project.org">TALK</A>:
|
||||
multilingual and multimodal spoken dialogue systems
|
||||
<LI><A HREF="http://webalt.math.helsinki.fi/">WebALT</A>:
|
||||
multilingual generation of mathematical exercises (commercial project)
|
||||
<LI><A HREF="http://spraakbanken.gu.se/sal/">SALDO</A>:
|
||||
Swedish morphological dictionary based on rules developed for GF and
|
||||
<A HREF="http://www.cse.chalmers.se/alumni/markus/FM/">Functional Morphology</A>
|
||||
<LI><a href="http://www.molto-project.eu">MOLTO</a>:
|
||||
multilingual online translation
|
||||
<LI><a href="http://remu.grammaticalframework.org">REMU</a>:
|
||||
reliable multilingual digital communication.
|
||||
</UL>
|
||||
<p>
|
||||
Here is a <a
|
||||
href="http://videos.xrce.xerox.com/index.php/videos/index/618">talk
|
||||
about GF at XRCE</a>,
|
||||
14 years later.
|
||||
|
||||
<P>
|
||||
Academically, GF has been used in at least ten PhD theses and resulted
|
||||
in more than a hundred
|
||||
scientific publications (see <A HREF="doc/gf-bibliography.html">GF publication list</A>).
|
||||
</P>
|
||||
<H2>Programming in GF</H2>
|
||||
<P>
|
||||
GF is easy to learn by following the <A HREF="doc/tutorial/gf-tutorial.html">tutorial</A>.
|
||||
You can write your first translator in 15 minutes.
|
||||
</P>
|
||||
<P>
|
||||
GF has an interactive command interpreter, as well as a batch compiler.
|
||||
Grammars can be compiled to parser and translator code in many different
|
||||
formats. These components can then be embedded in applications written
|
||||
in other programming languages. The formats currently supported are:
|
||||
</P>
|
||||
<UL>
|
||||
<LI>Haskell
|
||||
<li>Java, in particular the Android platform
|
||||
<LI>JavaScript
|
||||
<LI>Speech recognition: HTK/ATK, Nuance, JSGF
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
The GF programming language is high-level and advanced, featuring
|
||||
</P>
|
||||
<UL>
|
||||
<LI>static type checking
|
||||
<LI>higher-order functions
|
||||
<LI>dependent types
|
||||
<LI>pattern matching with data constructors and regular expressions
|
||||
<LI>module system with multiple inheritance and parametrized modules
|
||||
</UL>
|
||||
|
||||
<h3>Getting help</h3>
|
||||
<p>
|
||||
If you need some help with GF, the first places to start are the <a href="doc/tutorial/gf-tutorial.html">Tutorial</a> and <a href="doc/gf-refman.html">Reference</a> pages.
|
||||
The printed <a href="gf-book">book</a> contains all the material in the tutorial and some extra bits, and is the recommended reference for GF.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
We run the IRC channel <strong><code>#gf</code></strong> on the Freenode network, where you are welcome to look for help with small questions or just start a general discussion.
|
||||
IRC logs (in raw format) are available <a href="irc/">here</a>.
|
||||
If you have a larger question which the community may benefit from, we recommend you ask it on the <a href="http://groups.google.com/group/gf-dev">mailing list</a>.
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
<H2>Libraries</H2>
|
||||
<P>
|
||||
Libraries are at the heart of modern software engineering. In natural language
|
||||
applications, libraries are a way to cope with thousands of details involved in
|
||||
syntax, lexicon, and inflection. The
|
||||
<A HREF="lib/doc/synopsis.html">GF resource grammar library</A> has
|
||||
support for an increasing number of languages, currently including
|
||||
</P>
|
||||
<ol class=languages>
|
||||
<LI>Afrikaans
|
||||
<LI>Amharic (partial)
|
||||
<LI>Arabic (partial)
|
||||
<LI>Bulgarian
|
||||
<LI>Catalan
|
||||
<LI>Chinese
|
||||
<LI>Danish
|
||||
<LI>Dutch
|
||||
<LI>English
|
||||
<LI>Estonian
|
||||
<LI>Finnish
|
||||
<LI>French
|
||||
<LI>German
|
||||
<li>Greek ancient (partial)
|
||||
<li>Greek modern
|
||||
<li>Hebrew (fragments)
|
||||
<LI>Hindi
|
||||
<LI><A HREF="http://www.interlingua.com/">Interlingua</A>
|
||||
<LI>Japanese
|
||||
<LI>Italian
|
||||
<LI>Latin (fragments)
|
||||
<LI>Latvian
|
||||
<li>Maltese
|
||||
<li>Mongolian
|
||||
<LI>Nepali
|
||||
<LI>Norwegian bokmål
|
||||
<LI>Norwegian nynorsk
|
||||
<LI>Persian
|
||||
<LI>Polish
|
||||
<li>Punjabi
|
||||
<LI>Romanian
|
||||
<LI>Russian
|
||||
<LI>Sindhi
|
||||
<LI>Slovene (partial)
|
||||
<LI>Spanish
|
||||
<li>Swahili (fragments)
|
||||
<LI>Swedish
|
||||
<LI>Thai
|
||||
<LI>Turkish (fragments)
|
||||
<LI>Urdu
|
||||
</ol>
|
||||
<div class="row">
|
||||
|
||||
<P>
|
||||
Adding a language to the resource library takes 3 to 9
|
||||
months - contributions
|
||||
are welcome! You can start with the <A HREF="doc/gf-lrec-2010.pdf">resource grammarian's tutorial</A>.
|
||||
<div class="col-md-6">
|
||||
<h2>Applications & availability</h2>
|
||||
<p>
|
||||
GF can be used for building
|
||||
<a href="//cloud.grammaticalframework.org/translator/">translation systems</a>,
|
||||
<a href="//cloud.grammaticalframework.org/minibar/minibar.html">multilingual web gadgets</a>,
|
||||
<a href="http://www.cse.chalmers.se/~hallgren/Alfa/Tutorial/GFplugin.html">natural-language interfaces</a>,
|
||||
<a href="http://www.youtube.com/watch?v=1bfaYHWS6zU">dialogue systems</a>, and
|
||||
<a href="lib/doc/synopsis/index.html">natural language resources</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
GF is <strong>open-source</strong>, licensed under <a href="LICENSE">GPL</a> (the program) and
|
||||
<a href="LICENSE">LGPL</a> and <a href="LICENSE">BSD</a> (the libraries). It
|
||||
is available for
|
||||
</p>
|
||||
<ul>
|
||||
<li>Linux</li>
|
||||
<li>macOS</li>
|
||||
<li>Windows</li>
|
||||
<li>Android mobile platform (via Java; runtime)</li>
|
||||
<li>iOS mobile platform (iPhone, iPad)</li>
|
||||
<li>via compilation to JavaScript, almost any platform that has a web browser (runtime)</li>
|
||||
</ul>
|
||||
|
||||
<h2>Programming in GF</h2>
|
||||
<p>
|
||||
GF is easy to learn by following the <a href="doc/tutorial/gf-tutorial.html">tutorial</a>.
|
||||
You can write your first translator in 15 minutes.
|
||||
</p>
|
||||
<p>
|
||||
GF has an interactive command interpreter, as well as a batch compiler.
|
||||
Grammars can be compiled to parser and translator code in many different
|
||||
formats. These components can then be embedded in applications written
|
||||
in other programming languages. The formats currently supported are:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Haskell</li>
|
||||
<li>Java, in particular the Android platform</li>
|
||||
<li>JavaScript</li>
|
||||
<li>Speech recognition: HTK/ATK, Nuance, JSGF</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
The GF programming language is high-level and advanced, featuring:
|
||||
</p>
|
||||
<ul>
|
||||
<li>static type checking</li>
|
||||
<li>higher-order functions</li>
|
||||
<li>dependent types</li>
|
||||
<li>pattern matching with data constructors and regular expressions</li>
|
||||
<li>module system with multiple inheritance and parametrized modules</li>
|
||||
</ul>
|
||||
|
||||
<h3>Getting help</h3>
|
||||
<p>
|
||||
If you need some help with GF, the first places to start are the <a href="doc/tutorial/gf-tutorial.html">Tutorial</a> and <a href="doc/gf-refman.html">Reference</a> pages.
|
||||
The printed <a href="gf-book">book</a> contains all the material in the tutorial and some extra bits, and is the recommended reference for GF.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
We run the IRC channel <strong><code>#gf</code></strong> on the Libera network, where you are welcome to look for help with small questions or just start a general discussion.
|
||||
You can <a href="https://web.libera.chat/?channels=#gf">open a web chat</a>
|
||||
or <a href="https://www.grammaticalframework.org/irc/?C=M;O=D">browse the channel logs</a>.
|
||||
</p>
|
||||
<p>
|
||||
There is also a <a href="https://discord.gg/EvfUsjzmaz">GF server on Discord</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
For bug reports and feature requests, please create an issue in the
|
||||
<a href="https://github.com/GrammaticalFramework/gf-core/issues">GF Core</a> or
|
||||
<a href="https://github.com/GrammaticalFramework/gf-rgl/issues">RGL</a> repository.
|
||||
|
||||
For programming questions, consider asking them on <a href="https://stackoverflow.com/questions/tagged/gf">Stack Overflow with the <code>gf</code> tag</a>.
|
||||
If you have a more general question to the community, we recommend you ask it on the <a href="http://groups.google.com/group/gf-dev">mailing list</a>.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<h2>News</h2>
|
||||
<dl class="row">
|
||||
<dt class="col-sm-3 text-center text-nowrap">2021-07-25</dt>
|
||||
<dd class="col-sm-9">
|
||||
<strong>GF 3.11 released.</strong>
|
||||
<a href="download/release-3.11.html">Release notes</a>
|
||||
</dd>
|
||||
<dt class="col-sm-3 text-center text-nowrap">2021-05-05</dt>
|
||||
<dd class="col-sm-9">
|
||||
<a href="https://cloud.grammaticalframework.org/wordnet/">GF WordNet</a> now supports languages for which there are no other WordNets. New additions: Afrikaans, German, Korean, Maltese, Polish, Somali, Swahili.
|
||||
</dd>
|
||||
<dt class="col-sm-3 text-center text-nowrap">2021-03-01</dt>
|
||||
<dd class="col-sm-9">
|
||||
<a href="//school.grammaticalframework.org/2020/">Seventh GF Summer School</a>, in Singapore and online, 26 July – 6 August 2021.
|
||||
</dd>
|
||||
<dt class="col-sm-3 text-center text-nowrap">2020-09-29</dt>
|
||||
<dd class="col-sm-9">
|
||||
<a href="https://www.mitpressjournals.org/doi/pdf/10.1162/COLI_a_00378">Abstract Syntax as Interlingua</a>: Scaling Up the Grammatical Framework from Controlled Languages to Robust Pipelines. A paper in Computational Linguistics (2020) summarizing much of the development in GF in the past ten years.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h2>Projects</h2>
|
||||
<p>
|
||||
GF was first created in 1998 at
|
||||
<a href="http://www.xrce.xerox.com/">Xerox Research Centre Europe</a>,
|
||||
Grenoble, in the project
|
||||
Multilingual Document Authoring. At Xerox, it was used for prototypes including
|
||||
a restaurant phrase book,
|
||||
a database query system,
|
||||
a formalization of an alarm system instructions with translations to 5 languages, and
|
||||
an authoring system for medical drug descriptions.
|
||||
</p>
|
||||
<p>
|
||||
Later projects using GF and involving third parties include, in chronological order:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="http://www.cse.chalmers.se/~hallgren/Alfa/Tutorial/GFplugin.html">GF-Alfa</a>:
|
||||
natural language interface to formal proofs
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://efficient.citi.tudor.lu/index_noframe.html">Efficient</a>:
|
||||
authoring tool for business models.
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://www.key-project.org/">GF-KeY</a>:
|
||||
authoring and translation of software specifications
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://www.talk-project.org">TALK</a>:
|
||||
multilingual and multimodal spoken dialogue systems
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://webalt.math.helsinki.fi/">WebALT</a>:
|
||||
multilingual generation of mathematical exercises (commercial project)
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://spraakbanken.gu.se/sal/">SALDO</a>:
|
||||
Swedish morphological dictionary based on rules developed for GF and
|
||||
<a href="http://www.cse.chalmers.se/alumni/markus/FM/">Functional Morphology</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="//www.molto-project.eu">MOLTO</a>:
|
||||
multilingual online translation
|
||||
</li>
|
||||
<li>
|
||||
<a href="//remu.grammaticalframework.org">REMU</a>:
|
||||
reliable multilingual digital communication
|
||||
</li>
|
||||
</ul>
|
||||
<!-- <p>
|
||||
Here is a <a
|
||||
href="http://videos.xrce.xerox.com/index.php/videos/index/618">talk
|
||||
about GF at XRCE</a>,
|
||||
14 years later.
|
||||
</p> -->
|
||||
|
||||
<p>
|
||||
Academically, GF has been used in at least ten PhD theses and resulted
|
||||
in more than a hundred scientific publications.
|
||||
<!-- (see <a href="doc/gf-bibliography.html">GF publication list</a>). -->
|
||||
</p>
|
||||
|
||||
<h2>Libraries</h2>
|
||||
<p>
|
||||
Libraries are at the heart of modern software engineering. In natural language
|
||||
applications, libraries are a way to cope with thousands of details involved in
|
||||
syntax, lexicon, and inflection. The
|
||||
<a href="lib/doc/synopsis/index.html">GF resource grammar library</a> (RGL) has
|
||||
support for an increasing number of languages, currently including
|
||||
Afrikaans,
|
||||
Amharic (partial),
|
||||
Arabic (partial),
|
||||
Basque (partial),
|
||||
Bulgarian,
|
||||
Catalan,
|
||||
Chinese,
|
||||
Czech (partial),
|
||||
Danish,
|
||||
Dutch,
|
||||
English,
|
||||
Estonian,
|
||||
Finnish,
|
||||
French,
|
||||
German,
|
||||
Greek ancient (partial),
|
||||
Greek modern,
|
||||
Hebrew (fragments),
|
||||
Hindi,
|
||||
Hungarian (partial),
|
||||
Interlingua,
|
||||
Italian,
|
||||
Japanese,
|
||||
Korean (partial),
|
||||
Latin (partial),
|
||||
Latvian,
|
||||
Maltese,
|
||||
Mongolian,
|
||||
Nepali,
|
||||
Norwegian bokmål,
|
||||
Norwegian nynorsk,
|
||||
Persian,
|
||||
Polish,
|
||||
Punjabi,
|
||||
Romanian,
|
||||
Russian,
|
||||
Sindhi,
|
||||
Slovak (partial),
|
||||
Slovene (partial),
|
||||
Somali (partial),
|
||||
Spanish,
|
||||
Swahili (fragments),
|
||||
Swedish,
|
||||
Thai,
|
||||
Turkish (fragments),
|
||||
and
|
||||
Urdu.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Adding a language to the resource library takes 3 to 9
|
||||
months - contributions
|
||||
are welcome! You can start with the <a href="lib/doc/rgl-tutorial/index.html">resource grammarian's tutorial</a>.
|
||||
</p>
|
||||
|
||||
</div><!-- .col-6 -->
|
||||
|
||||
</div><!-- .row -->
|
||||
|
||||
</div><!-- .container -->
|
||||
|
||||
<footer class="bg-light mt-5 py-4">
|
||||
<div class="container mb-3">
|
||||
<div class="text-center text-muted">
|
||||
<img style="height:50px; filter: opacity(.5) grayscale(1);" class="mb-3" src="doc/Logos/gf0.svg" alt="GF Logo"><br>
|
||||
Grammatical Framework is free and open source,<br>
|
||||
with some support from <a href="https://www.digitalgrammars.com/">Digital Grammars AB</a>.
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script type="text/javascript">
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
@@ -423,5 +421,6 @@ try {
|
||||
var pageTracker = _gat._getTracker("UA-7811807-3");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}</script>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -68,7 +68,7 @@ import qualified Data.ByteString.Lazy as L
|
||||
import Data.ByteString.Base (inlinePerformIO)
|
||||
import qualified Data.ByteString.Base as S
|
||||
#else
|
||||
import Data.ByteString.Internal (inlinePerformIO)
|
||||
import Data.ByteString.Internal (accursedUnutterablePerformIO)
|
||||
import qualified Data.ByteString.Internal as S
|
||||
--import qualified Data.ByteString.Lazy.Internal as L
|
||||
#endif
|
||||
@@ -199,7 +199,7 @@ defaultSize = 32 * k - overhead
|
||||
|
||||
-- | Sequence an IO operation on the buffer
|
||||
unsafeLiftIO :: (Buffer -> IO Buffer) -> Builder
|
||||
unsafeLiftIO f = Builder $ \ k buf -> inlinePerformIO $ do
|
||||
unsafeLiftIO f = Builder $ \ k buf -> accursedUnutterablePerformIO $ do
|
||||
buf' <- f buf
|
||||
return (k buf')
|
||||
{-# INLINE unsafeLiftIO #-}
|
||||
@@ -101,6 +101,10 @@ import GHC.Word
|
||||
--import GHC.Int
|
||||
#endif
|
||||
|
||||
-- Control.Monad.Fail import will become redundant in GHC 8.8+
|
||||
import qualified Control.Monad.Fail as Fail
|
||||
|
||||
|
||||
-- | The parse state
|
||||
data S = S {-# UNPACK #-} !B.ByteString -- current chunk
|
||||
L.ByteString -- the rest of the input
|
||||
@@ -126,6 +130,11 @@ instance Monad Get where
|
||||
(a, s') -> unGet (k a) s')
|
||||
{-# INLINE (>>=) #-}
|
||||
|
||||
#if !(MIN_VERSION_base(4,13,0))
|
||||
fail = failDesc
|
||||
#endif
|
||||
|
||||
instance Fail.MonadFail Get where
|
||||
fail = failDesc
|
||||
|
||||
instance MonadFix Get where
|
||||
@@ -414,7 +423,7 @@ readN n f = fmap f $ getBytes n
|
||||
getPtr :: Storable a => Int -> Get a
|
||||
getPtr n = do
|
||||
(fp,o,_) <- readN n B.toForeignPtr
|
||||
return . B.inlinePerformIO $ withForeignPtr fp $ \p -> peek (castPtr $ p `plusPtr` o)
|
||||
return . B.accursedUnutterablePerformIO $ withForeignPtr fp $ \p -> peek (castPtr $ p `plusPtr` o)
|
||||
{- INLINE getPtr -}
|
||||
|
||||
------------------------------------------------------------------------
|
||||
@@ -19,7 +19,9 @@ module GF(
|
||||
module GF.Grammar.Printer,
|
||||
module GF.Infra.Ident,
|
||||
-- ** Binary serialisation
|
||||
module GF.Grammar.Binary
|
||||
module GF.Grammar.Binary,
|
||||
-- * Canonical GF
|
||||
module GF.Compile.GrammarToCanonical
|
||||
) where
|
||||
import GF.Main
|
||||
import GF.Compiler
|
||||
@@ -36,3 +38,5 @@ import GF.Grammar.Macros
|
||||
import GF.Grammar.Printer
|
||||
import GF.Infra.Ident
|
||||
import GF.Grammar.Binary
|
||||
|
||||
import GF.Compile.GrammarToCanonical
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module GF.Command.Abstract(module GF.Command.Abstract,Expr,showExpr,Term) where
|
||||
|
||||
import PGF(CId,mkCId,Expr,showExpr)
|
||||
import PGF2(Expr,showExpr)
|
||||
import GF.Grammar.Grammar(Term)
|
||||
|
||||
type Ident = String
|
||||
@@ -11,7 +11,7 @@ type Pipe = [Command]
|
||||
|
||||
data Command
|
||||
= Command Ident [Option] Argument
|
||||
deriving (Eq,Ord,Show)
|
||||
deriving Show
|
||||
|
||||
data Option
|
||||
= OOpt Ident
|
||||
@@ -29,13 +29,7 @@ data Argument
|
||||
| ATerm Term
|
||||
| ANoArg
|
||||
| AMacro Ident
|
||||
deriving (Eq,Ord,Show)
|
||||
|
||||
valCIdOpts :: String -> CId -> [Option] -> CId
|
||||
valCIdOpts flag def opts =
|
||||
case [v | OFlag f (VId v) <- opts, f == flag] of
|
||||
(v:_) -> mkCId v
|
||||
_ -> def
|
||||
deriving Show
|
||||
|
||||
valIntOpts :: String -> Int -> [Option] -> Int
|
||||
valIntOpts flag def opts =
|
||||
@@ -49,6 +43,18 @@ valStrOpts flag def opts =
|
||||
v:_ -> valueString v
|
||||
_ -> def
|
||||
|
||||
maybeIntOpts :: String -> a -> (Int -> a) -> [Option] -> a
|
||||
maybeIntOpts flag def fn opts =
|
||||
case [v | OFlag f (VInt v) <- opts, f == flag] of
|
||||
(v:_) -> fn v
|
||||
_ -> def
|
||||
|
||||
maybeStrOpts :: String -> a -> (String -> a) -> [Option] -> a
|
||||
maybeStrOpts flag def fn opts =
|
||||
case listFlags flag opts of
|
||||
v:_ -> fn (valueString v)
|
||||
_ -> def
|
||||
|
||||
listFlags flag opts = [v | OFlag f v <- opts, f == flag]
|
||||
|
||||
valueString v =
|
||||
|
||||
@@ -3,8 +3,7 @@ import GF.Command.Abstract(Option,Expr,Term)
|
||||
import GF.Text.Pretty(render)
|
||||
import GF.Grammar.Printer() -- instance Pretty Term
|
||||
import GF.Grammar.Macros(string2term)
|
||||
import qualified PGF as H(showExpr)
|
||||
import qualified PGF.Internal as H(Literal(LStr),Expr(ELit)) ----
|
||||
import PGF2(mkStr,unStr,showExpr)
|
||||
|
||||
data CommandInfo m = CommandInfo {
|
||||
exec :: [Option] -> CommandArguments -> m CommandOutput,
|
||||
@@ -38,21 +37,19 @@ class Monad m => TypeCheckArg m where typeCheckArg :: Expr -> m Expr
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
data CommandArguments = Exprs [Expr] | Strings [String] | Term Term
|
||||
data CommandArguments = Exprs [(Expr,Float)] | Strings [String] | Term Term
|
||||
|
||||
newtype CommandOutput = Piped (CommandArguments,String) ---- errors, etc
|
||||
|
||||
-- ** Converting command output
|
||||
fromStrings ss = Piped (Strings ss, unlines ss)
|
||||
fromExprs es = Piped (Exprs es,unlines (map (H.showExpr []) es))
|
||||
fromExprs show_p es = Piped (Exprs es,unlines (map (\(e,p) -> (if show_p then (++) ("["++show p++"] ") else id) (showExpr [] e)) es))
|
||||
fromString s = Piped (Strings [s], s)
|
||||
pipeWithMessage es msg = Piped (Exprs es,msg)
|
||||
pipeMessage msg = Piped (Exprs [],msg)
|
||||
pipeExprs es = Piped (Exprs es,[]) -- only used in emptyCommandInfo
|
||||
void = Piped (Exprs [],"")
|
||||
|
||||
stringAsExpr = H.ELit . H.LStr -- should be a pattern macro
|
||||
|
||||
-- ** Converting command input
|
||||
|
||||
toStrings args =
|
||||
@@ -61,23 +58,23 @@ toStrings args =
|
||||
Exprs es -> zipWith showAsString (True:repeat False) es
|
||||
Term t -> [render t]
|
||||
where
|
||||
showAsString first t =
|
||||
case t of
|
||||
H.ELit (H.LStr s) -> s
|
||||
_ -> ['\n'|not first] ++
|
||||
H.showExpr [] t ---newline needed in other cases than the first
|
||||
showAsString first (e,p) =
|
||||
case unStr e of
|
||||
Just s -> s
|
||||
Nothing -> ['\n'|not first] ++
|
||||
showExpr [] e ---newline needed in other cases than the first
|
||||
|
||||
toExprs args =
|
||||
case args of
|
||||
Exprs es -> es
|
||||
Strings ss -> map stringAsExpr ss
|
||||
Term t -> [stringAsExpr (render t)]
|
||||
Exprs es -> map fst es
|
||||
Strings ss -> map mkStr ss
|
||||
Term t -> [mkStr (render t)]
|
||||
|
||||
toTerm args =
|
||||
case args of
|
||||
Term t -> t
|
||||
Strings ss -> string2term $ unwords ss -- hmm
|
||||
Exprs es -> string2term $ unwords $ map (H.showExpr []) es -- hmm
|
||||
Exprs es -> string2term $ unwords $ map (showExpr [] . fst) es -- hmm
|
||||
|
||||
-- ** Creating documentation
|
||||
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
|
||||
{-# LANGUAGE FlexibleInstances, UndecidableInstances, CPP #-}
|
||||
module GF.Command.Commands (
|
||||
PGFEnv,HasPGFEnv(..),pgf,mos,pgfEnv,pgfCommands,
|
||||
HasPGF(..),pgfCommands,
|
||||
options,flags,
|
||||
) where
|
||||
import Prelude hiding (putStrLn,(<>)) -- GHC 8.4.1 clash with Text.PrettyPrint
|
||||
import Prelude hiding (putStrLn,(<>))
|
||||
|
||||
import PGF
|
||||
|
||||
import PGF.Internal(lookStartCat,functionsToCat,lookValCat,restrictPGF,hasLin)
|
||||
import PGF.Internal(abstract,funs,cats,Expr(EFun)) ----
|
||||
import PGF.Internal(ppFun,ppCat)
|
||||
import PGF.Internal(optimizePGF)
|
||||
import PGF2
|
||||
|
||||
import GF.Compile.Export
|
||||
import GF.Compile.ToAPI
|
||||
@@ -28,27 +23,28 @@ import GF.Command.TreeOperations ---- temporary place for typecheck and compute
|
||||
|
||||
import GF.Data.Operations
|
||||
|
||||
import PGF.Internal (encodeFile)
|
||||
import Data.Char
|
||||
import Data.List(intersperse,nub)
|
||||
import Data.Maybe
|
||||
import qualified Data.Map as Map
|
||||
import GF.Text.Pretty
|
||||
import Data.List (sort)
|
||||
import Control.Monad(mplus)
|
||||
import qualified Control.Monad.Fail as Fail
|
||||
--import Debug.Trace
|
||||
|
||||
|
||||
data PGFEnv = Env {pgf::PGF,mos::Map.Map Language Morpho}
|
||||
class (Functor m,Monad m,MonadSIO m) => HasPGF m where getPGF :: m (Maybe PGF)
|
||||
|
||||
pgfEnv pgf = Env pgf mos
|
||||
where mos = Map.fromList [(la,buildMorpho pgf la) | la <- languages pgf]
|
||||
instance (Monad m,HasPGF m,Fail.MonadFail m) => TypeCheckArg m where
|
||||
typeCheckArg e = do mb_pgf <- getPGF
|
||||
case mb_pgf of
|
||||
Just pgf -> either fail
|
||||
(return . fst)
|
||||
(inferExpr pgf e)
|
||||
Nothing -> fail "Import a grammar before using this command"
|
||||
|
||||
class (Functor m,Monad m,MonadSIO m) => HasPGFEnv m where getPGFEnv :: m PGFEnv
|
||||
|
||||
instance (Monad m,HasPGFEnv m) => TypeCheckArg m where
|
||||
typeCheckArg e = (either (fail . render . ppTcError) (return . fst)
|
||||
. flip inferExpr e . pgf) =<< getPGFEnv
|
||||
|
||||
pgfCommands :: HasPGFEnv m => Map.Map String (CommandInfo m)
|
||||
pgfCommands :: HasPGF m => Map.Map String (CommandInfo m)
|
||||
pgfCommands = Map.fromList [
|
||||
("aw", emptyCommandInfo {
|
||||
longname = "align_words",
|
||||
@@ -61,7 +57,7 @@ pgfCommands = Map.fromList [
|
||||
"by the view flag. The target format is png, unless overridden by the",
|
||||
"flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick)."
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
exec = needPGF $ \ opts arg pgf -> do
|
||||
let es = toExprs arg
|
||||
let langs = optLangs pgf opts
|
||||
if isOpt "giza" opts
|
||||
@@ -73,7 +69,7 @@ pgfCommands = Map.fromList [
|
||||
let grph = if null es then [] else lsrc ++ "\n--end_source--\n\n"++ltrg++"\n-end_target--\n\n"++align
|
||||
return $ fromString grph
|
||||
else do
|
||||
let grphs = map (graphvizAlignment pgf langs) es
|
||||
let grphs = map (graphvizWordAlignment langs graphvizDefaults) es
|
||||
if isFlag "view" opts || isFlag "format" opts
|
||||
then do
|
||||
let view = optViewGraph opts
|
||||
@@ -95,6 +91,7 @@ pgfCommands = Map.fromList [
|
||||
("view", "program to open the resulting file")
|
||||
]
|
||||
}),
|
||||
|
||||
("ca", emptyCommandInfo {
|
||||
longname = "clitic_analyse",
|
||||
synopsis = "print the analyses of all words into stems and clitics",
|
||||
@@ -105,16 +102,17 @@ pgfCommands = Map.fromList [
|
||||
"by the flag '-clitics'. The list of stems is given as the list of words",
|
||||
"of the language given by the '-lang' flag."
|
||||
],
|
||||
exec = getEnv $ \opts ts env -> case opts of
|
||||
_ | isOpt "raw" opts ->
|
||||
return . fromString .
|
||||
unlines . map (unwords . map (concat . intersperse "+")) .
|
||||
map (getClitics (isInMorpho (optMorpho env opts)) (optClitics opts)) .
|
||||
concatMap words $ toStrings ts
|
||||
_ ->
|
||||
return . fromStrings .
|
||||
getCliticsText (isInMorpho (optMorpho env opts)) (optClitics opts) .
|
||||
concatMap words $ toStrings ts,
|
||||
exec = needPGF $ \opts ts pgf -> do
|
||||
concr <- optLang pgf opts
|
||||
case opts of
|
||||
_ | isOpt "raw" opts ->
|
||||
return . fromString .
|
||||
unlines . map (unwords . map (concat . intersperse "+")) .
|
||||
map (getClitics (not . null . lookupMorpho concr) (optClitics opts)) .
|
||||
concatMap words $ toStrings ts
|
||||
_ -> return . fromStrings .
|
||||
getCliticsText (not . null . lookupMorpho concr) (optClitics opts) .
|
||||
concatMap words $ toStrings ts,
|
||||
flags = [
|
||||
("clitics","the list of possible clitics (comma-separated, no spaces)"),
|
||||
("lang", "the language of analysis")
|
||||
@@ -146,19 +144,19 @@ pgfCommands = Map.fromList [
|
||||
],
|
||||
flags = [
|
||||
("file","the file to be converted (suffix .gfe must be given)"),
|
||||
("lang","the language in which to parse"),
|
||||
("probs","file with probabilities to rank the parses")
|
||||
("lang","the language in which to parse")
|
||||
],
|
||||
exec = getEnv $ \ opts _ env@(Env pgf mos) -> do
|
||||
exec = needPGF $ \opts _ pgf -> do
|
||||
let file = optFile opts
|
||||
pgf <- optProbs opts pgf
|
||||
let printer = if (isOpt "api" opts) then exprToAPI else (showExpr [])
|
||||
let conf = configureExBased pgf (optMorpho env opts) (optLang pgf opts) printer
|
||||
concr <- optLang pgf opts
|
||||
let conf = configureExBased pgf concr printer
|
||||
(file',ws) <- restricted $ parseExamplesInGrammar conf file
|
||||
if null ws then return () else putStrLn ("unknown words: " ++ unwords ws)
|
||||
return (fromString ("wrote " ++ file')),
|
||||
needsTypeCheck = False
|
||||
}),
|
||||
|
||||
("gr", emptyCommandInfo {
|
||||
longname = "generate_random",
|
||||
synopsis = "generate random trees in the current abstract syntax",
|
||||
@@ -173,54 +171,53 @@ pgfCommands = Map.fromList [
|
||||
explanation = unlines [
|
||||
"Generates a list of random trees, by default one tree.",
|
||||
"If a tree argument is given, the command completes the Tree with values to",
|
||||
"all metavariables in the tree. The generation can be biased by probabilities,",
|
||||
"given in a file in the -probs flag."
|
||||
"all metavariables in the tree. The generation can be biased by probabilities",
|
||||
"if the grammar was compiled with option -probs"
|
||||
],
|
||||
options = [
|
||||
("show_probs", "show the probability of each result")
|
||||
],
|
||||
flags = [
|
||||
("cat","generation category"),
|
||||
("lang","uses only functions that have linearizations in all these languages"),
|
||||
("number","number of trees generated"),
|
||||
("depth","the maximum generation depth"),
|
||||
("probs", "file with biased probabilities (format 'f 0.4' one by line)")
|
||||
("number","number of trees generated")
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
pgf <- optProbs opts (optRestricted opts pgf)
|
||||
exec = needPGF $ \opts arg pgf -> do
|
||||
gen <- newStdGen
|
||||
let dp = valIntOpts "depth" 4 opts
|
||||
let ts = case mexp (toExprs arg) of
|
||||
Just ex -> generateRandomFromDepth gen pgf ex (Just dp)
|
||||
Nothing -> generateRandomDepth gen pgf (optType pgf opts) (Just dp)
|
||||
returnFromExprs $ take (optNum opts) ts
|
||||
Just ex -> generateRandomFrom gen pgf ex
|
||||
Nothing -> generateRandom gen pgf (optType pgf opts)
|
||||
returnFromExprs (isOpt "show_probs" opts) $ take (optNum opts) ts
|
||||
}),
|
||||
|
||||
("gt", emptyCommandInfo {
|
||||
longname = "generate_trees",
|
||||
synopsis = "generates a list of trees, by default exhaustive",
|
||||
explanation = unlines [
|
||||
"Generates all trees of a given category. By default, ",
|
||||
"the depth is limited to 4, but this can be changed by a flag.",
|
||||
"Generates all trees of a given category.",
|
||||
"If a Tree argument is given, the command completes the Tree with values",
|
||||
"to all metavariables in the tree."
|
||||
],
|
||||
options = [
|
||||
("show_probs", "show the probability of each result")
|
||||
],
|
||||
flags = [
|
||||
("cat","the generation category"),
|
||||
("depth","the maximum generation depth"),
|
||||
("lang","excludes functions that have no linearization in this language"),
|
||||
("number","the number of trees generated")
|
||||
],
|
||||
examples = [
|
||||
mkEx "gt -- all trees in the startcat, to depth 4",
|
||||
mkEx "gt -- all trees in the startcat",
|
||||
mkEx "gt -cat=NP -number=16 -- 16 trees in the category NP",
|
||||
mkEx "gt -cat=NP -depth=2 -- trees in the category NP to depth 2",
|
||||
mkEx "gt (AdjCN ? (UseN ?)) -- trees of form (AdjCN ? (UseN ?))"
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
let pgfr = optRestricted opts pgf
|
||||
let dp = valIntOpts "depth" 4 opts
|
||||
let ts = case mexp (toExprs arg) of
|
||||
Just ex -> generateFromDepth pgfr ex (Just dp)
|
||||
Nothing -> generateAllDepth pgfr (optType pgf opts) (Just dp)
|
||||
returnFromExprs $ take (optNumInf opts) ts
|
||||
exec = needPGF $ \opts arg pgf -> do
|
||||
let es = case mexp (toExprs arg) of
|
||||
Just ex -> generateAllFrom pgf ex
|
||||
Nothing -> generateAll pgf (optType pgf opts)
|
||||
returnFromExprs (isOpt "show_probs" opts) $ takeOptNum opts es
|
||||
}),
|
||||
|
||||
("i", emptyCommandInfo {
|
||||
longname = "import",
|
||||
synopsis = "import a grammar from source code or compiled .pgf file",
|
||||
@@ -241,33 +238,28 @@ pgfCommands = Map.fromList [
|
||||
("probs","file with biased probabilities for generation")
|
||||
],
|
||||
options = [
|
||||
-- ["gfo", "src", "no-cpu", "cpu", "quiet", "verbose"]
|
||||
("retain","retain operations (used for cc command)"),
|
||||
("src", "force compilation from source"),
|
||||
("v", "be verbose - show intermediate status information")
|
||||
],
|
||||
needsTypeCheck = False
|
||||
}),
|
||||
|
||||
("l", emptyCommandInfo {
|
||||
longname = "linearize",
|
||||
synopsis = "convert an abstract syntax expression to string",
|
||||
explanation = unlines [
|
||||
"Shows the linearization of a Tree by the grammars in scope.",
|
||||
"Shows the linearization of a tree by the grammars in scope.",
|
||||
"The -lang flag can be used to restrict this to fewer languages.",
|
||||
"A sequence of string operations (see command ps) can be given",
|
||||
"as options, and works then like a pipe to the ps command, except",
|
||||
"that it only affect the strings, not e.g. the table labels.",
|
||||
"These can be given separately to each language with the unlexer flag",
|
||||
"whose results are prepended to the other lexer flags. The value of the",
|
||||
"unlexer flag is a space-separated list of comma-separated string operation",
|
||||
"sequences; see example."
|
||||
"that it only affect the strings, not e.g. the table labels."
|
||||
],
|
||||
examples = [
|
||||
mkEx "l -lang=LangSwe,LangNor no_Utt -- linearize tree to LangSwe and LangNor",
|
||||
mkEx "gr -lang=LangHin -cat=Cl | l -table -to_devanagari -- hindi table",
|
||||
mkEx "l -unlexer=\"LangAra=to_arabic LangHin=to_devanagari\" -- different unlexers"
|
||||
mkEx "gr -lang=LangHin -cat=Cl | l -table -to_devanagari -- hindi table"
|
||||
],
|
||||
exec = getEnv $ \ opts ts (Env pgf mos) -> return . fromStrings . optLins pgf opts $ toExprs ts,
|
||||
exec = needPGF $ \ opts ts pgf -> return . fromStrings . optLins pgf opts $ toExprs ts,
|
||||
options = [
|
||||
("all", "show all forms and variants, one by line (cf. l -list)"),
|
||||
("bracket","show tree structure with brackets and paths to nodes"),
|
||||
@@ -275,33 +267,13 @@ pgfCommands = Map.fromList [
|
||||
("list","show all forms and variants, comma-separated on one line (cf. l -all)"),
|
||||
("multi","linearize to all languages (default)"),
|
||||
("table","show all forms labelled by parameters"),
|
||||
("tabtreebank","show the tree and its linearizations on a tab-separated line"),
|
||||
("treebank","show the tree and tag linearizations with language names")
|
||||
] ++ stringOpOptions,
|
||||
flags = [
|
||||
("lang","the languages of linearization (comma-separated, no spaces)"),
|
||||
("unlexer","set unlexers separately to each language (space-separated)")
|
||||
]
|
||||
}),
|
||||
("lc", emptyCommandInfo {
|
||||
longname = "linearize_chunks",
|
||||
synopsis = "linearize a tree that has metavariables in maximal chunks without them",
|
||||
explanation = unlines [
|
||||
"A hopefully temporary command, intended to work around the type checker that fails",
|
||||
"trees where a function node is a metavariable."
|
||||
],
|
||||
examples = [
|
||||
mkEx "l -lang=LangSwe,LangNor -chunks ? a b (? c d)"
|
||||
],
|
||||
exec = getEnv $ \ opts ts (Env pgf mos) -> return . fromStrings $ optLins pgf (opts ++ [OOpt "chunks"]) (toExprs ts),
|
||||
options = [
|
||||
("treebank","show the tree and tag linearizations with language names")
|
||||
] ++ stringOpOptions,
|
||||
flags = [
|
||||
("lang","the languages of linearization (comma-separated, no spaces)")
|
||||
],
|
||||
needsTypeCheck = False
|
||||
]
|
||||
}),
|
||||
|
||||
("ma", emptyCommandInfo {
|
||||
longname = "morpho_analyse",
|
||||
synopsis = "print the morphological analyses of all words in the string",
|
||||
@@ -309,18 +281,20 @@ pgfCommands = Map.fromList [
|
||||
"Prints all the analyses of space-separated words in the input string,",
|
||||
"using the morphological analyser of the actual grammar (see command pg)"
|
||||
],
|
||||
exec = getEnv $ \opts ts env -> case opts of
|
||||
_ | isOpt "missing" opts ->
|
||||
return . fromString . unwords .
|
||||
morphoMissing (optMorpho env opts) .
|
||||
concatMap words $ toStrings ts
|
||||
_ | isOpt "known" opts ->
|
||||
return . fromString . unwords .
|
||||
morphoKnown (optMorpho env opts) .
|
||||
concatMap words $ toStrings ts
|
||||
_ -> return . fromString . unlines .
|
||||
map prMorphoAnalysis . concatMap (morphos env opts) .
|
||||
concatMap words $ toStrings ts,
|
||||
exec = needPGF $ \opts ts pgf -> do
|
||||
concr <- optLang pgf opts
|
||||
case opts of
|
||||
_ | isOpt "missing" opts ->
|
||||
return . fromString . unwords .
|
||||
morphoMissing concr .
|
||||
concatMap words $ toStrings ts
|
||||
_ | isOpt "known" opts ->
|
||||
return . fromString . unwords .
|
||||
morphoKnown concr .
|
||||
concatMap words $ toStrings ts
|
||||
_ -> return . fromString . unlines .
|
||||
map prMorphoAnalysis . concatMap (morphos pgf opts) .
|
||||
concatMap words $ toStrings ts,
|
||||
flags = [
|
||||
("lang","the languages of analysis (comma-separated, no spaces)")
|
||||
],
|
||||
@@ -334,18 +308,16 @@ pgfCommands = Map.fromList [
|
||||
longname = "morpho_quiz",
|
||||
synopsis = "start a morphology quiz",
|
||||
syntax = "mq (-cat=CAT)? (-probs=FILE)? TREE?",
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
let lang = optLang pgf opts
|
||||
exec = needPGF $ \ opts arg pgf -> do
|
||||
lang <- optLang pgf opts
|
||||
let typ = optType pgf opts
|
||||
pgf <- optProbs opts pgf
|
||||
let mt = mexp (toExprs arg)
|
||||
restricted $ morphologyQuiz mt pgf lang typ
|
||||
return void,
|
||||
flags = [
|
||||
("lang","language of the quiz"),
|
||||
("cat","category of the quiz"),
|
||||
("number","maximum number of questions"),
|
||||
("probs","file with biased probabilities for generation")
|
||||
("number","maximum number of questions")
|
||||
]
|
||||
}),
|
||||
|
||||
@@ -356,24 +328,25 @@ pgfCommands = Map.fromList [
|
||||
"Shows all trees returned by parsing a string in the grammars in scope.",
|
||||
"The -lang flag can be used to restrict this to fewer languages.",
|
||||
"The default start category can be overridden by the -cat flag.",
|
||||
"See also the ps command for lexing and character encoding.",
|
||||
"",
|
||||
"The -openclass flag is experimental and allows some robustness in ",
|
||||
"the parser. For example if -openclass=\"A,N,V\" is given, the parser",
|
||||
"will accept unknown adjectives, nouns and verbs with the resource grammar."
|
||||
"See also the ps command for lexing and character encoding."
|
||||
],
|
||||
exec = needPGF $ \opts ts pgf ->
|
||||
return $
|
||||
foldr (joinPiped . fromParse1 opts) void
|
||||
(concat [
|
||||
[(s,parse concr (optType pgf opts) s) |
|
||||
concr <- optLangs pgf opts]
|
||||
| s <- toStrings ts]),
|
||||
options = [
|
||||
("show_probs", "show the probability of each result")
|
||||
],
|
||||
exec = getEnv $ \ opts ts (Env pgf mos) ->
|
||||
return $ fromParse opts (concat [map ((,) s) (par pgf opts s) | s <- toStrings ts]),
|
||||
flags = [
|
||||
("cat","target category of parsing"),
|
||||
("lang","the languages of parsing (comma-separated, no spaces)"),
|
||||
("openclass","list of open-class categories for robust parsing"),
|
||||
("depth","maximal depth for proof search if the abstract syntax tree has meta variables")
|
||||
],
|
||||
options = [
|
||||
("bracket","prints the bracketed string from the parser")
|
||||
("number","limit the results to the top N trees")
|
||||
]
|
||||
}),
|
||||
|
||||
("pg", emptyCommandInfo { -----
|
||||
longname = "print_grammar",
|
||||
synopsis = "print the actual grammar with the given printer",
|
||||
@@ -393,9 +366,8 @@ pgfCommands = Map.fromList [
|
||||
" " ++ opt ++ "\t\t" ++ expl |
|
||||
((opt,_),expl) <- outputFormatsExpl, take 1 expl /= "*"
|
||||
]),
|
||||
exec = getEnv $ \opts _ env -> prGrammar env opts,
|
||||
exec = needPGF $ \opts _ pgf -> prGrammar pgf opts,
|
||||
flags = [
|
||||
--"cat",
|
||||
("file", "set the file name when printing with -pgf option"),
|
||||
("lang", "select languages for the some options (default all languages)"),
|
||||
("printer","select the printing format (see flag values above)")
|
||||
@@ -415,6 +387,7 @@ pgfCommands = Map.fromList [
|
||||
mkEx ("pg -funs | ? grep \" S ;\" -- show functions with value cat S")
|
||||
]
|
||||
}),
|
||||
|
||||
("pt", emptyCommandInfo {
|
||||
longname = "put_tree",
|
||||
syntax = "pt OPT? TREE",
|
||||
@@ -428,11 +401,12 @@ pgfCommands = Map.fromList [
|
||||
examples = [
|
||||
mkEx "pt -compute (plus one two) -- compute value"
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) ->
|
||||
returnFromExprs . takeOptNum opts . treeOps pgf opts $ toExprs arg,
|
||||
exec = needPGF $ \opts arg pgf ->
|
||||
returnFromExprs False . takeOptNum opts . map (flip (,) 0) . treeOps pgf opts $ toExprs arg,
|
||||
options = treeOpOptions undefined{-pgf-},
|
||||
flags = [("number","take at most this many trees")] ++ treeOpFlags undefined{-pgf-}
|
||||
}),
|
||||
|
||||
("rf", emptyCommandInfo {
|
||||
longname = "read_file",
|
||||
synopsis = "read string or tree input from a file",
|
||||
@@ -445,10 +419,9 @@ pgfCommands = Map.fromList [
|
||||
],
|
||||
options = [
|
||||
("lines","return the list of lines, instead of the singleton of all contents"),
|
||||
("paragraphs","return the list of paragraphs, as separated by empty lines"),
|
||||
("tree","convert strings into trees")
|
||||
],
|
||||
exec = getEnv $ \ opts _ (Env pgf mos) -> do
|
||||
exec = needPGF $ \ opts _ pgf -> do
|
||||
let file = valStrOpts "file" "_gftmp" opts
|
||||
let exprs [] = ([],empty)
|
||||
exprs ((n,s):ls) | null s
|
||||
@@ -457,12 +430,12 @@ pgfCommands = Map.fromList [
|
||||
Just e -> let (es,err) = exprs ls
|
||||
in case inferExpr pgf e of
|
||||
Right (e,t) -> (e:es,err)
|
||||
Left tcerr -> (es,"on line" <+> n <> ':' $$ nest 2 (ppTcError tcerr) $$ err)
|
||||
Left err -> (es,"on line" <+> n <> ':' $$ nest 2 err $$ err)
|
||||
Nothing -> let (es,err) = exprs ls
|
||||
in (es,"on line" <+> n <> ':' <+> "parse error" $$ err)
|
||||
returnFromLines ls = case exprs ls of
|
||||
(es, err) | null es -> return $ pipeMessage $ render (err $$ "no trees found")
|
||||
| otherwise -> return $ pipeWithMessage es (render err)
|
||||
| otherwise -> return $ pipeWithMessage (map (flip (,) 0) es) (render err)
|
||||
|
||||
s <- restricted $ readFile file
|
||||
case opts of
|
||||
@@ -471,56 +444,26 @@ pgfCommands = Map.fromList [
|
||||
_ | isOpt "tree" opts ->
|
||||
returnFromLines [(1::Int,s)]
|
||||
_ | isOpt "lines" opts -> return (fromStrings $ lines s)
|
||||
_ | isOpt "paragraphs" opts -> return (fromStrings $ toParagraphs $ lines s)
|
||||
_ -> return (fromString s),
|
||||
flags = [("file","the input file name")]
|
||||
}),
|
||||
("rt", emptyCommandInfo {
|
||||
longname = "rank_trees",
|
||||
synopsis = "show trees in an order of decreasing probability",
|
||||
explanation = unlines [
|
||||
"Order trees from the most to the least probable, using either",
|
||||
"even distribution in each category (default) or biased as specified",
|
||||
"by the file given by flag -probs=FILE, where each line has the form",
|
||||
"'function probability', e.g. 'youPol_Pron 0.01'."
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
let ts = toExprs arg
|
||||
pgf <- optProbs opts pgf
|
||||
let tds = rankTreesByProbs pgf ts
|
||||
if isOpt "v" opts
|
||||
then putStrLn $
|
||||
unlines [showExpr [] t ++ "\t--" ++ show d | (t,d) <- tds]
|
||||
else return ()
|
||||
returnFromExprs $ map fst tds,
|
||||
flags = [
|
||||
("probs","probabilities from this file (format 'f 0.6' per line)")
|
||||
],
|
||||
options = [
|
||||
("v","show all trees with their probability scores")
|
||||
],
|
||||
examples = [
|
||||
mkEx "p \"you are here\" | rt -probs=probs | pt -number=1 -- most probable result"
|
||||
]
|
||||
}),
|
||||
|
||||
("tq", emptyCommandInfo {
|
||||
longname = "translation_quiz",
|
||||
syntax = "tq -from=LANG -to=LANG (-cat=CAT)? (-probs=FILE)? TREE?",
|
||||
synopsis = "start a translation quiz",
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
let from = optLangFlag "from" pgf opts
|
||||
let to = optLangFlag "to" pgf opts
|
||||
exec = needPGF $ \ opts arg pgf -> do
|
||||
from <- optLangFlag "from" pgf opts
|
||||
to <- optLangFlag "to" pgf opts
|
||||
let typ = optType pgf opts
|
||||
let mt = mexp (toExprs arg)
|
||||
pgf <- optProbs opts pgf
|
||||
restricted $ translationQuiz mt pgf from to typ
|
||||
return void,
|
||||
flags = [
|
||||
("from","translate from this language"),
|
||||
("to","translate to this language"),
|
||||
("cat","translate in this category"),
|
||||
("number","the maximum number of questions"),
|
||||
("probs","file with biased probabilities for generation")
|
||||
("number","the maximum number of questions")
|
||||
],
|
||||
examples = [
|
||||
mkEx ("tq -from=Eng -to=Swe -- any trees in startcat"),
|
||||
@@ -528,7 +471,6 @@ pgfCommands = Map.fromList [
|
||||
]
|
||||
}),
|
||||
|
||||
|
||||
("vd", emptyCommandInfo {
|
||||
longname = "visualize_dependency",
|
||||
synopsis = "show word dependency tree graphically",
|
||||
@@ -546,7 +488,7 @@ pgfCommands = Map.fromList [
|
||||
"flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).",
|
||||
"See also 'vp -showdep' for another visualization of dependencies."
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
exec = needPGF $ \ opts arg pgf -> do
|
||||
let absname = abstractName pgf
|
||||
let es = toExprs arg
|
||||
let debug = isOpt "v" opts
|
||||
@@ -559,8 +501,8 @@ pgfCommands = Map.fromList [
|
||||
mclab <- case cnclabels of
|
||||
"" -> return Nothing
|
||||
_ -> (Just . getCncDepLabels) `fmap` restricted (readFile cnclabels)
|
||||
let lang = optLang pgf opts
|
||||
let grphs = map (graphvizDependencyTree outp debug mlab mclab pgf lang) es
|
||||
concr <- optLang pgf opts
|
||||
let grphs = map (graphvizDependencyTree outp debug mlab mclab concr) es
|
||||
if isOpt "conll2latex" opts
|
||||
then return $ fromString $ conlls2latexDoc $ stanzas $ unlines $ toStrings arg
|
||||
else if isFlag "view" opts && valStrOpts "output" "" opts == "latex"
|
||||
@@ -595,7 +537,6 @@ pgfCommands = Map.fromList [
|
||||
]
|
||||
}),
|
||||
|
||||
|
||||
("vp", emptyCommandInfo {
|
||||
longname = "visualize_parse",
|
||||
synopsis = "show parse tree graphically",
|
||||
@@ -607,9 +548,8 @@ pgfCommands = Map.fromList [
|
||||
"by the view flag. The target format is png, unless overridden by the",
|
||||
"flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick)."
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
let es = toExprs arg
|
||||
let lang = optLang pgf opts
|
||||
exec = needPGF $ \opts arg pgf -> do
|
||||
let es = toExprs arg
|
||||
let gvOptions = GraphvizOptions {noLeaves = isOpt "noleaves" opts && not (isOpt "showleaves" opts),
|
||||
noFun = isOpt "nofun" opts || not (isOpt "showfun" opts),
|
||||
noCat = isOpt "nocat" opts && not (isOpt "showcat" opts),
|
||||
@@ -622,10 +562,11 @@ pgfCommands = Map.fromList [
|
||||
leafEdgeStyle = valStrOpts "leafedgestyle" "dashed" opts
|
||||
}
|
||||
let depfile = valStrOpts "file" "" opts
|
||||
concr <- optLang pgf opts
|
||||
mlab <- case depfile of
|
||||
"" -> return Nothing
|
||||
_ -> (Just . getDepLabels) `fmap` restricted (readFile depfile)
|
||||
let grphs = map (graphvizParseTreeDep mlab pgf lang gvOptions) es
|
||||
let grphs = map (graphvizDependencyTree "dot" False mlab Nothing concr) es
|
||||
if isFlag "view" opts || isFlag "format" opts
|
||||
then do
|
||||
let view = optViewGraph opts
|
||||
@@ -660,7 +601,6 @@ pgfCommands = Map.fromList [
|
||||
]
|
||||
}),
|
||||
|
||||
|
||||
("vt", emptyCommandInfo {
|
||||
longname = "visualize_tree",
|
||||
synopsis = "show a set of trees graphically",
|
||||
@@ -673,7 +613,7 @@ pgfCommands = Map.fromList [
|
||||
"flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).",
|
||||
"With option -mk, use for showing library style function names of form 'mkC'."
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) ->
|
||||
exec = needPGF $ \opts arg pgf ->
|
||||
let es = toExprs arg in
|
||||
if isOpt "mk" opts
|
||||
then return $ fromString $ unlines $ map (tree2mk pgf) es
|
||||
@@ -685,7 +625,7 @@ pgfCommands = Map.fromList [
|
||||
else do
|
||||
let funs = not (isOpt "nofun" opts)
|
||||
let cats = not (isOpt "nocat" opts)
|
||||
let grphs = map (graphvizAbstractTree pgf (funs,cats)) es
|
||||
let grphs = map (graphvizAbstractTree pgf (graphvizDefaults{noFun=funs,noCat=cats})) es
|
||||
if isFlag "view" opts || isFlag "format" opts
|
||||
then do
|
||||
let view = optViewGraph opts
|
||||
@@ -707,6 +647,7 @@ pgfCommands = Map.fromList [
|
||||
("view","program to open the resulting file (default \"open\")")
|
||||
]
|
||||
}),
|
||||
|
||||
("ai", emptyCommandInfo {
|
||||
longname = "abstract_info",
|
||||
syntax = "ai IDENTIFIER or ai EXPR",
|
||||
@@ -719,205 +660,150 @@ pgfCommands = Map.fromList [
|
||||
"If a whole expression is given it prints the expression with refined",
|
||||
"metavariables and the type of the expression."
|
||||
],
|
||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||
exec = needPGF $ \opts arg pgf -> do
|
||||
case toExprs arg of
|
||||
[EFun id] -> case Map.lookup id (funs (abstract pgf)) of
|
||||
Just fd -> do putStrLn $ render (ppFun id fd)
|
||||
let (_,_,_,prob) = fd
|
||||
putStrLn ("Probability: "++show prob)
|
||||
return void
|
||||
Nothing -> case Map.lookup id (cats (abstract pgf)) of
|
||||
Just cd -> do putStrLn $
|
||||
render (ppCat id cd $$
|
||||
if null (functionsToCat pgf id)
|
||||
then empty
|
||||
else ' ' $$
|
||||
vcat [ppFun fid (ty,0,Just ([],[]),0) | (fid,ty) <- functionsToCat pgf id] $$
|
||||
' ')
|
||||
let (_,_,prob) = cd
|
||||
putStrLn ("Probability: "++show prob)
|
||||
return void
|
||||
Nothing -> do putStrLn ("unknown category of function identifier "++show id)
|
||||
return void
|
||||
[e] -> case inferExpr pgf e of
|
||||
Left tcErr -> error $ render (ppTcError tcErr)
|
||||
Right (e,ty) -> do putStrLn ("Expression: "++showExpr [] e)
|
||||
putStrLn ("Type: "++showType [] ty)
|
||||
putStrLn ("Probability: "++show (probTree pgf e))
|
||||
return void
|
||||
[e] -> case unApp e of
|
||||
Just (id, []) -> case functionType pgf id of
|
||||
Just ty -> do putStrLn (showFun pgf id ty)
|
||||
putStrLn ("Probability: "++show (exprProbability pgf e))
|
||||
return void
|
||||
Nothing -> case categoryContext pgf id of
|
||||
Just hypos -> do putStrLn ("cat "++id++if null hypos then "" else ' ':showContext [] hypos)
|
||||
let ls = [showFun pgf fn ty | fn <- functionsByCat pgf id, Just ty <- [functionType pgf fn]]
|
||||
if null ls
|
||||
then return ()
|
||||
else putStrLn (unlines ("":ls))
|
||||
putStrLn ("Probability: "++show (categoryProbability pgf id))
|
||||
return void
|
||||
Nothing -> do putStrLn ("unknown category of function identifier "++show id)
|
||||
return void
|
||||
_ -> case inferExpr pgf e of
|
||||
Left err -> error err
|
||||
Right (e,ty) -> do putStrLn ("Expression: "++showExpr [] e)
|
||||
putStrLn ("Type: "++showType [] ty)
|
||||
putStrLn ("Probability: "++show (exprProbability pgf e))
|
||||
return void
|
||||
_ -> do putStrLn "a single identifier or expression is expected from the command"
|
||||
return void,
|
||||
needsTypeCheck = False
|
||||
})
|
||||
]
|
||||
where
|
||||
getEnv exec opts ts = liftSIO . exec opts ts =<< getPGFEnv
|
||||
|
||||
par pgf opts s = case optOpenTypes opts of
|
||||
[] -> [parse_ pgf lang (optType pgf opts) (Just dp) s | lang <- optLangs pgf opts]
|
||||
open_typs -> [parseWithRecovery pgf lang (optType pgf opts) open_typs (Just dp) s | lang <- optLangs pgf opts]
|
||||
where
|
||||
dp = valIntOpts "depth" 4 opts
|
||||
|
||||
fromParse opts = foldr (joinPiped . fromParse1 opts) void
|
||||
needPGF exec opts ts = do
|
||||
mb_pgf <- getPGF
|
||||
case mb_pgf of
|
||||
Just pgf -> liftSIO $ exec opts ts pgf
|
||||
_ -> fail "Import a grammar before using this command"
|
||||
|
||||
joinPiped (Piped (es1,ms1)) (Piped (es2,ms2)) = Piped (jA es1 es2,ms1+++-ms2)
|
||||
where
|
||||
jA (Exprs es1) (Exprs es2) = Exprs (es1++es2)
|
||||
-- ^ fromParse1 always output Exprs
|
||||
|
||||
fromParse1 opts (s,(po,bs))
|
||||
| isOpt "bracket" opts = pipeMessage (showBracketedString bs)
|
||||
| otherwise =
|
||||
case po of
|
||||
ParseOk ts -> fromExprs ts
|
||||
ParseFailed i -> pipeMessage $ "The parser failed at token "
|
||||
++ show i ++": "
|
||||
++ show (words s !! max 0 (i-1))
|
||||
-- ++ " in " ++ show s
|
||||
ParseIncomplete -> pipeMessage "The sentence is not complete"
|
||||
TypeError errs ->
|
||||
pipeMessage . render $
|
||||
"The parsing is successful but the type checking failed with error(s):"
|
||||
$$ nest 2 (vcat (map (ppTcError . snd) errs))
|
||||
fromParse1 opts (s,po) =
|
||||
case po of
|
||||
ParseOk ts -> fromExprs (isOpt "show_probs" opts) (takeOptNum opts ts)
|
||||
ParseFailed i t -> pipeMessage $ "The parser failed at token "
|
||||
++ show i ++": "
|
||||
++ show t
|
||||
ParseIncomplete -> pipeMessage "The sentence is not complete"
|
||||
|
||||
optLins pgf opts ts = case opts of
|
||||
_ | isOpt "groups" opts ->
|
||||
concatMap snd $ groupResults
|
||||
[[(lang, s) | lang <- optLangs pgf opts,s <- linear pgf opts lang t] | t <- ts]
|
||||
_ -> concatMap (optLin pgf opts) ts
|
||||
optLins pgf opts ts = concatMap (optLin pgf opts) ts
|
||||
optLin pgf opts t =
|
||||
case opts of
|
||||
_ | isOpt "treebank" opts && isOpt "chunks" opts ->
|
||||
(showCId (abstractName pgf) ++ ": " ++ showExpr [] t) :
|
||||
[showCId lang ++ ": " ++ li | (lang,li) <- linChunks pgf opts t] --linear pgf opts lang t | lang <- optLangs pgf opts]
|
||||
_ | isOpt "treebank" opts ->
|
||||
(showCId (abstractName pgf) ++ ": " ++ showExpr [] t) :
|
||||
[showCId lang ++ ": " ++ s | lang <- optLangs pgf opts, s<-linear pgf opts lang t]
|
||||
_ | isOpt "tabtreebank" opts ->
|
||||
return $ concat $ intersperse "\t" $ (showExpr [] t) :
|
||||
[s | lang <- optLangs pgf opts, s <- linear pgf opts lang t]
|
||||
_ | isOpt "chunks" opts -> map snd $ linChunks pgf opts t
|
||||
_ -> [s | lang <- optLangs pgf opts, s<-linear pgf opts lang t]
|
||||
linChunks pgf opts t =
|
||||
[(lang, unwords (intersperse "<+>" (map (unlines . linear pgf opts lang) (treeChunks t)))) | lang <- optLangs pgf opts]
|
||||
(abstractName pgf ++ ": " ++ showExpr [] t) :
|
||||
[concreteName concr ++ ": " ++ s | concr <- optLangs pgf opts, s<-linear opts concr t]
|
||||
_ -> [s | concr <- optLangs pgf opts, s <- linear opts concr t]
|
||||
|
||||
linear :: PGF -> [Option] -> CId -> Expr -> [String]
|
||||
linear pgf opts lang = let unl = unlex opts lang in case opts of
|
||||
_ | isOpt "all" opts -> concat . -- intersperse [[]] .
|
||||
map (map (unl . snd)) . tabularLinearizes pgf lang
|
||||
linear :: [Option] -> Concr -> Expr -> [String]
|
||||
linear opts concr = case opts of
|
||||
_ | isOpt "all" opts -> concat .
|
||||
map (map snd) . tabularLinearizeAll concr
|
||||
_ | isOpt "list" opts -> (:[]) . commaList . concat .
|
||||
map (map (unl . snd)) . tabularLinearizes pgf lang
|
||||
_ | isOpt "table" opts -> concat . -- intersperse [[]] .
|
||||
map (map (\(p,v) -> p+++":"+++unl v)) . tabularLinearizes pgf lang
|
||||
_ | isOpt "bracket" opts -> (:[]) . unwords . map showBracketedString . bracketedLinearize pgf lang
|
||||
_ -> (:[]) . unl . linearize pgf lang
|
||||
map (map snd) . tabularLinearizeAll concr
|
||||
_ | isOpt "table" opts -> concat .
|
||||
map (map (\(p,v) -> p+++":"+++v)) . tabularLinearizeAll concr
|
||||
_ | isOpt "bracket" opts -> (:[]) . unwords . map showBracketedString . bracketedLinearize concr
|
||||
_ -> (:[]) . linearize concr
|
||||
|
||||
-- replace each non-atomic constructor with mkC, where C is the val cat
|
||||
tree2mk pgf = showExpr [] . t2m where
|
||||
t2m t = case unApp t of
|
||||
Just (cid,ts@(_:_)) -> mkApp (mk cid) (map t2m ts)
|
||||
_ -> t
|
||||
mk = mkCId . ("mk" ++) . showCId . lookValCat (abstract pgf)
|
||||
|
||||
unlex opts lang = stringOps Nothing (getUnlex opts lang ++ map prOpt opts) ----
|
||||
|
||||
getUnlex opts lang = case words (valStrOpts "unlexer" "" opts) of
|
||||
lexs -> case lookup lang
|
||||
[(mkCId la,tail le) | lex <- lexs, let (la,le) = span (/='=') lex, not (null le)] of
|
||||
Just le -> chunks ',' le
|
||||
_ -> []
|
||||
Just (cid,ts@(_:_)) -> mkApp (mk cid) (map t2m ts)
|
||||
_ -> t
|
||||
mk f = case functionType pgf f of
|
||||
Just ty -> let (_,cat,_) = unType ty
|
||||
in "mk" ++ cat
|
||||
Nothing -> f
|
||||
|
||||
commaList [] = []
|
||||
commaList ws = concat $ head ws : map (", " ++) (tail ws)
|
||||
|
||||
-- Proposed logic of coding in unlexing:
|
||||
-- - If lang has no coding flag, or -to_utf8 is not in opts, just opts are used.
|
||||
-- - If lang has flag coding=utf8, -to_utf8 is ignored.
|
||||
-- - If lang has coding=other, and -to_utf8 is in opts, from_other is applied first.
|
||||
-- THIS DOES NOT WORK UNFORTUNATELY - can't use the grammar flag properly
|
||||
{-
|
||||
unlexx pgf opts lang = {- trace (unwords optsC) $ -} stringOps Nothing optsC where ----
|
||||
optsC = case lookConcrFlag pgf (mkCId lang) (mkCId "coding") of
|
||||
Just (LStr "utf8") -> filter (/="to_utf8") $ map prOpt opts
|
||||
Just (LStr other) | isOpt "to_utf8" opts ->
|
||||
let cod = ("from_" ++ other)
|
||||
in cod : filter (/=cod) (map prOpt opts)
|
||||
_ -> map prOpt opts
|
||||
-}
|
||||
optRestricted opts pgf =
|
||||
restrictPGF (\f -> and [hasLin pgf la f | la <- optLangs pgf opts]) pgf
|
||||
|
||||
optLang = optLangFlag "lang"
|
||||
optLangs = optLangsFlag "lang"
|
||||
|
||||
optLangsFlag f pgf opts = case valStrOpts f "" opts of
|
||||
"" -> languages pgf
|
||||
lang -> map (completeLang pgf) (chunks ',' lang)
|
||||
completeLang pgf la = let cla = (mkCId la) in
|
||||
if elem cla (languages pgf)
|
||||
then cla
|
||||
else (mkCId (showCId (abstractName pgf) ++ la))
|
||||
optLangFlag flag pgf opts =
|
||||
case optLangsFlag flag pgf opts of
|
||||
[] -> fail "no language specified"
|
||||
(l:ls) -> return l
|
||||
|
||||
optLangFlag f pgf opts = head $ optLangsFlag f pgf opts ++ [wildCId]
|
||||
optLangsFlag flag pgf opts =
|
||||
case valStrOpts flag "" opts of
|
||||
"" -> Map.elems langs
|
||||
str -> mapMaybe (completeLang pgf) (chunks ',' str)
|
||||
where
|
||||
langs = languages pgf
|
||||
|
||||
optOpenTypes opts = case valStrOpts "openclass" "" opts of
|
||||
"" -> []
|
||||
cats -> mapMaybe readType (chunks ',' cats)
|
||||
|
||||
optProbs opts pgf = case valStrOpts "probs" "" opts of
|
||||
"" -> return pgf
|
||||
file -> do
|
||||
probs <- restricted $ readProbabilitiesFromFile file pgf
|
||||
return (setProbabilities probs pgf)
|
||||
completeLang pgf la =
|
||||
mplus (Map.lookup la langs)
|
||||
(Map.lookup (abstractName pgf ++ la) langs)
|
||||
|
||||
optFile opts = valStrOpts "file" "_gftmp" opts
|
||||
|
||||
optType pgf opts =
|
||||
let str = valStrOpts "cat" (showCId $ lookStartCat pgf) opts
|
||||
in case readType str of
|
||||
Just ty -> case checkType pgf ty of
|
||||
Left tcErr -> error $ render (ppTcError tcErr)
|
||||
Right ty -> ty
|
||||
Nothing -> error ("Can't parse '"++str++"' as a type")
|
||||
let readOpt str = case readType str of
|
||||
Just ty -> case checkType pgf ty of
|
||||
Left err -> error err
|
||||
Right ty -> ty
|
||||
Nothing -> error ("Can't parse '"++str++"' as a type")
|
||||
in maybeStrOpts "cat" (startCat pgf) readOpt opts
|
||||
optViewFormat opts = valStrOpts "format" "png" opts
|
||||
optViewGraph opts = valStrOpts "view" "open" opts
|
||||
optNum opts = valIntOpts "number" 1 opts
|
||||
optNumInf opts = valIntOpts "number" 1000000000 opts ---- 10^9
|
||||
takeOptNum opts = take (optNumInf opts)
|
||||
|
||||
returnFromExprs es = return $ case es of
|
||||
[] -> pipeMessage "no trees found"
|
||||
_ -> fromExprs es
|
||||
returnFromExprs show_p es =
|
||||
return $
|
||||
case es of
|
||||
[] -> pipeMessage "no trees found"
|
||||
_ -> fromExprs show_p es
|
||||
|
||||
prGrammar (Env pgf mos) opts
|
||||
prGrammar pgf opts
|
||||
| isOpt "pgf" opts = do
|
||||
let pgf1 = if isOpt "opt" opts then optimizePGF pgf else pgf
|
||||
let outfile = valStrOpts "file" (showCId (abstractName pgf) ++ ".pgf") opts
|
||||
restricted $ encodeFile outfile pgf1
|
||||
let outfile = valStrOpts "file" (abstractName pgf ++ ".pgf") opts
|
||||
restricted $ writePGF outfile pgf
|
||||
putStrLn $ "wrote file " ++ outfile
|
||||
return void
|
||||
| isOpt "cats" opts = return $ fromString $ unwords $ map showCId $ categories pgf
|
||||
| isOpt "funs" opts = return $ fromString $ unlines $ map showFun $ funsigs pgf
|
||||
| isOpt "fullform" opts = return $ fromString $ concatMap (morpho mos "" prFullFormLexicon) $ optLangs pgf opts
|
||||
| isOpt "langs" opts = return $ fromString $ unwords $ map showCId $ languages pgf
|
||||
| isOpt "cats" opts = return $ fromString $ unwords $ categories pgf
|
||||
| isOpt "funs" opts = return $ fromString $ unlines [showFun pgf f ty | f <- functions pgf, Just ty <- [functionType pgf f]]
|
||||
| isOpt "fullform" opts = return $ fromString $ concatMap prFullFormLexicon $ optLangs pgf opts
|
||||
| isOpt "langs" opts = return $ fromString $ unwords $ Map.keys $ languages pgf
|
||||
|
||||
| isOpt "lexc" opts = return $ fromString $ concatMap (morpho mos "" prLexcLexicon) $ optLangs pgf opts
|
||||
| isOpt "missing" opts = return $ fromString $ unlines $ [unwords (showCId la:":": map showCId cs) |
|
||||
la <- optLangs pgf opts, let cs = missingLins pgf la]
|
||||
| isOpt "words" opts = return $ fromString $ concatMap (morpho mos "" prAllWords) $ optLangs pgf opts
|
||||
| isOpt "lexc" opts = return $ fromString $ concatMap prLexcLexicon $ optLangs pgf opts
|
||||
| isOpt "missing" opts = return $ fromString $ unlines $ [unwords (concreteName concr:":":[f | f <- functions pgf, not (hasLinearization concr f)]) |
|
||||
concr <- optLangs pgf opts]
|
||||
| isOpt "words" opts = return $ fromString $ concatMap prAllWords $ optLangs pgf opts
|
||||
| otherwise = do fmt <- readOutputFormat (valStrOpts "printer" "pgf_pretty" opts)
|
||||
return $ fromString $ concatMap snd $ exportPGF noOptions fmt pgf
|
||||
|
||||
funsigs pgf = [(f,ty) | (f,(ty,_,_,_)) <- Map.assocs (funs (abstract pgf))]
|
||||
showFun (f,ty) = showCId f ++ " : " ++ showType [] ty ++ " ;"
|
||||
showFun pgf id ty = kwd++" "++ id ++ " : " ++ showType [] ty
|
||||
where
|
||||
kwd | functionIsConstructor pgf id = "data"
|
||||
| otherwise = "fun"
|
||||
|
||||
morphos (Env pgf mos) opts s =
|
||||
[(s,morpho mos [] (\mo -> lookupMorpho mo s) la) | la <- optLangs pgf opts]
|
||||
|
||||
morpho mos z f la = maybe z f $ Map.lookup la mos
|
||||
|
||||
optMorpho (Env pgf mos) opts = morpho mos (error "no morpho") id (head (optLangs pgf opts))
|
||||
morphos pgf opts s =
|
||||
[(s,lookupMorpho concr s) | concr <- optLangs pgf opts]
|
||||
|
||||
optClitics opts = case valStrOpts "clitics" "" opts of
|
||||
"" -> []
|
||||
@@ -930,18 +816,28 @@ pgfCommands = Map.fromList [
|
||||
-- ps -f -g s returns g (f s)
|
||||
treeOps pgf opts s = foldr app s (reverse opts) where
|
||||
app (OOpt op) | Just (Left f) <- treeOp pgf op = f
|
||||
app (OFlag op (VId x)) | Just (Right f) <- treeOp pgf op = f (mkCId x)
|
||||
app (OFlag op (VId x)) | Just (Right f) <- treeOp pgf op = f x
|
||||
app _ = id
|
||||
|
||||
morphoMissing :: Concr -> [String] -> [String]
|
||||
morphoMissing = morphoClassify False
|
||||
|
||||
morphoKnown :: Concr -> [String] -> [String]
|
||||
morphoKnown = morphoClassify True
|
||||
|
||||
morphoClassify :: Bool -> Concr -> [String] -> [String]
|
||||
morphoClassify k concr ws = [w | w <- ws, k /= null (lookupMorpho concr w), notLiteral w] where
|
||||
notLiteral w = not (all isDigit w)
|
||||
|
||||
treeOpOptions pgf = [(op,expl) | (op,(expl,Left _)) <- allTreeOps pgf]
|
||||
treeOpFlags pgf = [(op,expl) | (op,(expl,Right _)) <- allTreeOps pgf]
|
||||
|
||||
translationQuiz :: Maybe Expr -> PGF -> Language -> Language -> Type -> IO ()
|
||||
translationQuiz :: Maybe Expr -> PGF -> Concr -> Concr -> Type -> IO ()
|
||||
translationQuiz mex pgf ig og typ = do
|
||||
tts <- translationList mex pgf ig og typ infinity
|
||||
mkQuiz "Welcome to GF Translation Quiz." tts
|
||||
|
||||
morphologyQuiz :: Maybe Expr -> PGF -> Language -> Type -> IO ()
|
||||
morphologyQuiz :: Maybe Expr -> PGF -> Concr -> Type -> IO ()
|
||||
morphologyQuiz mex pgf ig typ = do
|
||||
tts <- morphologyList mex pgf ig typ infinity
|
||||
mkQuiz "Welcome to GF Morphology Quiz." tts
|
||||
@@ -950,30 +846,28 @@ morphologyQuiz mex pgf ig typ = do
|
||||
infinity :: Int
|
||||
infinity = 256
|
||||
|
||||
prLexcLexicon :: Morpho -> String
|
||||
prLexcLexicon mo =
|
||||
unlines $ "Multichar_Symbols":multichars:"":"LEXICON Root" : [prLexc l p ++ ":" ++ w ++ " # ;" | (w,lps) <- morpho, (l,p) <- lps] ++ ["END"]
|
||||
prLexcLexicon :: Concr -> String
|
||||
prLexcLexicon concr =
|
||||
unlines $ "Multichar_Symbols":multichars:"":"LEXICON Root" : [prLexc l p ++ ":" ++ w ++ " # ;" | (w,lps) <- morpho, (l,p,_) <- lps] ++ ["END"]
|
||||
where
|
||||
morpho = fullFormLexicon mo
|
||||
prLexc l p = showCId l ++ concat (mkTags (words p))
|
||||
morpho = fullFormLexicon concr
|
||||
prLexc l p = l ++ concat (mkTags (words p))
|
||||
mkTags p = case p of
|
||||
"s":ws -> mkTags ws --- remove record field
|
||||
ws -> map ('+':) ws
|
||||
|
||||
multichars = unwords $ nub $ concat [mkTags (words p) | (w,lps) <- morpho, (l,p) <- lps]
|
||||
-- thick_A+(AAdj+Posit+Gen):thick's # ;
|
||||
multichars = unwords $ nub $ concat [mkTags (words p) | (w,lps) <- morpho, (l,p,_) <- lps]
|
||||
|
||||
prFullFormLexicon :: Morpho -> String
|
||||
prFullFormLexicon mo =
|
||||
unlines (map prMorphoAnalysis (fullFormLexicon mo))
|
||||
prFullFormLexicon :: Concr -> String
|
||||
prFullFormLexicon concr =
|
||||
unlines (map prMorphoAnalysis (fullFormLexicon concr))
|
||||
|
||||
prAllWords :: Morpho -> String
|
||||
prAllWords mo =
|
||||
unwords [w | (w,_) <- fullFormLexicon mo]
|
||||
prAllWords :: Concr -> String
|
||||
prAllWords concr =
|
||||
unwords [w | (w,_) <- fullFormLexicon concr]
|
||||
|
||||
prMorphoAnalysis :: (String,[(Lemma,Analysis)]) -> String
|
||||
prMorphoAnalysis (w,lps) =
|
||||
unlines (w:[showCId l ++ " : " ++ p | (l,p) <- lps])
|
||||
unlines (w:[l ++ " : " ++ p ++ show prob | (l,p,prob) <- lps])
|
||||
|
||||
viewGraphviz :: String -> String -> String -> [String] -> SIO CommandOutput
|
||||
viewGraphviz view format name grphs = do
|
||||
@@ -1018,3 +912,7 @@ stanzas = map unlines . chop . lines where
|
||||
chop ls = case break (=="") ls of
|
||||
(ls1,[]) -> [ls1]
|
||||
(ls1,_:ls2) -> ls1 : chop ls2
|
||||
|
||||
#if !(MIN_VERSION_base(4,9,0))
|
||||
errorWithoutStackTrace = error
|
||||
#endif
|
||||
|
||||
@@ -1,822 +0,0 @@
|
||||
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
|
||||
module GF.Command.Commands2 (
|
||||
PGFEnv,HasPGFEnv(..),pgf,concs,pgfEnv,emptyPGFEnv,pgfCommands,
|
||||
options, flags,
|
||||
) where
|
||||
import Prelude hiding (putStrLn,(<>)) -- GHC 8.4.1 clash with Text.PrettyPrint
|
||||
|
||||
import PGF2
|
||||
import qualified PGF as H
|
||||
import GF.Compile.ToAPI(exprToAPI)
|
||||
import GF.Infra.UseIO(writeUTF8File)
|
||||
import GF.Infra.SIO(MonadSIO,liftSIO,putStrLn,restricted,restrictedSystem)
|
||||
import GF.Command.Abstract
|
||||
import GF.Command.CommandInfo
|
||||
import GF.Data.Operations
|
||||
import Data.List(intersperse,intersect,nub,sortBy)
|
||||
import Data.Maybe
|
||||
import qualified Data.Map as Map
|
||||
import GF.Text.Pretty
|
||||
import Control.Monad(mplus)
|
||||
|
||||
|
||||
data PGFEnv = Env {pgf::Maybe PGF,concs::Map.Map ConcName Concr}
|
||||
|
||||
pgfEnv pgf = Env (Just pgf) (languages pgf)
|
||||
emptyPGFEnv = Env Nothing Map.empty
|
||||
|
||||
class (Monad m,MonadSIO m) => HasPGFEnv m where getPGFEnv :: m PGFEnv
|
||||
|
||||
instance (Monad m,HasPGFEnv m) => TypeCheckArg m where
|
||||
typeCheckArg e = do env <- getPGFEnv
|
||||
case pgf env of
|
||||
Just gr -> either fail
|
||||
(return . hsExpr . fst)
|
||||
(inferExpr gr (cExpr e))
|
||||
Nothing -> fail "Import a grammar before using this command"
|
||||
|
||||
pgfCommands :: HasPGFEnv m => Map.Map String (CommandInfo m)
|
||||
pgfCommands = Map.fromList [
|
||||
("aw", emptyCommandInfo {
|
||||
longname = "align_words",
|
||||
synopsis = "show word alignments between languages graphically",
|
||||
explanation = unlines [
|
||||
"Prints a set of strings in the .dot format (the graphviz format).",
|
||||
"The graph can be saved in a file by the wf command as usual.",
|
||||
"If the -view flag is defined, the graph is saved in a temporary file",
|
||||
"which is processed by graphviz and displayed by the program indicated",
|
||||
"by the flag. The target format is postscript, unless overridden by the",
|
||||
"flag -format."
|
||||
],
|
||||
exec = needPGF $ \opts es env -> do
|
||||
let cncs = optConcs env opts
|
||||
if isOpt "giza" opts
|
||||
then if length cncs == 2
|
||||
then let giz = map (gizaAlignment pgf (snd (cncs !! 0)) (snd (cncs !! 1)) . cExpr) (toExprs es)
|
||||
lsrc = unlines $ map (\(x,_,_) -> x) giz
|
||||
ltrg = unlines $ map (\(_,x,_) -> x) giz
|
||||
align = unlines $ map (\(_,_,x) -> x) giz
|
||||
grph = if null (toExprs es) then [] else lsrc ++ "\n--end_source--\n\n"++ltrg++"\n-end_target--\n\n"++align
|
||||
in return (fromString grph)
|
||||
else error "For giza alignment you need exactly two languages"
|
||||
else let gvOptions=graphvizDefaults{leafFont = valStrOpts "font" "" opts,
|
||||
leafColor = valStrOpts "color" "" opts,
|
||||
leafEdgeStyle = valStrOpts "edgestyle" "" opts
|
||||
}
|
||||
grph = if null (toExprs es) then [] else graphvizWordAlignment (map snd cncs) gvOptions (cExpr (head (toExprs es)))
|
||||
in if isFlag "view" opts || isFlag "format" opts
|
||||
then do let file s = "_grph." ++ s
|
||||
let view = optViewGraph opts
|
||||
let format = optViewFormat opts
|
||||
restricted $ writeUTF8File (file "dot") grph
|
||||
restrictedSystem $ "dot -T" ++ format ++ " " ++ file "dot" ++ " > " ++ file format
|
||||
restrictedSystem $ view ++ " " ++ file format
|
||||
return void
|
||||
else return (fromString grph),
|
||||
examples = [
|
||||
("gr | aw" , "generate a tree and show word alignment as graph script"),
|
||||
("gr | aw -view=\"open\"" , "generate a tree and display alignment on Mac"),
|
||||
("gr | aw -view=\"eog\"" , "generate a tree and display alignment on Ubuntu"),
|
||||
("gt | aw -giza | wf -file=aligns" , "generate trees, send giza alignments to file")
|
||||
],
|
||||
options = [
|
||||
("giza", "show alignments in the Giza format; the first two languages")
|
||||
],
|
||||
flags = [
|
||||
("format","format of the visualization file (default \"png\")"),
|
||||
("lang", "alignments for this list of languages (default: all)"),
|
||||
("view", "program to open the resulting file"),
|
||||
("font", "font for the words"),
|
||||
("color", "color for the words"),
|
||||
("edgestyle", "the style for links between words")
|
||||
]
|
||||
}),
|
||||
{-
|
||||
("eb", emptyCommandInfo {
|
||||
longname = "example_based",
|
||||
syntax = "eb (-probs=FILE | -lang=LANG)* -file=FILE.gfe",
|
||||
synopsis = "converts .gfe files to .gf files by parsing examples to trees",
|
||||
explanation = unlines [
|
||||
"Reads FILE.gfe and writes FILE.gf. Each expression of form",
|
||||
"'%ex CAT QUOTEDSTRING' in FILE.gfe is replaced by a syntax tree.",
|
||||
"This tree is the first one returned by the parser; a biased ranking",
|
||||
"can be used to regulate the order. If there are more than one parses",
|
||||
"the rest are shown in comments, with probabilities if the order is biased.",
|
||||
"The probabilities flag and configuration file is similar to the commands",
|
||||
"gr and rt. Notice that the command doesn't change the environment,",
|
||||
"but the resulting .gf file must be imported separately."
|
||||
],
|
||||
options = [
|
||||
("api","convert trees to overloaded API expressions (using Syntax not Lang)")
|
||||
],
|
||||
flags = [
|
||||
("file","the file to be converted (suffix .gfe must be given)"),
|
||||
("lang","the language in which to parse"),
|
||||
("probs","file with probabilities to rank the parses")
|
||||
],
|
||||
exec = \env@(pgf, mos) opts _ -> do
|
||||
let file = optFile opts
|
||||
pgf <- optProbs opts pgf
|
||||
let printer = if (isOpt "api" opts) then exprToAPI else (H.showExpr [])
|
||||
let conf = configureExBased pgf (optMorpho env opts) (optLang pgf opts) printer
|
||||
(file',ws) <- restricted $ parseExamplesInGrammar conf file
|
||||
if null ws then return () else putStrLn ("unknown words: " ++ unwords ws)
|
||||
return (fromString ("wrote " ++ file')),
|
||||
needsTypeCheck = False
|
||||
}),
|
||||
-}
|
||||
{-
|
||||
("gr", emptyCommandInfo {
|
||||
longname = "generate_random",
|
||||
synopsis = "generate random trees in the current abstract syntax",
|
||||
syntax = "gr [-cat=CAT] [-number=INT]",
|
||||
examples = [
|
||||
mkEx "gr -- one tree in the startcat of the current grammar",
|
||||
mkEx "gr -cat=NP -number=16 -- 16 trees in the category NP",
|
||||
mkEx "gr -lang=LangHin,LangTha -cat=Cl -- Cl, both in LangHin and LangTha",
|
||||
mkEx "gr -probs=FILE -- generate with bias",
|
||||
mkEx "gr (AdjCN ? (UseN ?)) -- generate trees of form (AdjCN ? (UseN ?))"
|
||||
],
|
||||
explanation = unlines [
|
||||
"Generates a list of random trees, by default one tree.",
|
||||
"If a tree argument is given, the command completes the Tree with values to",
|
||||
"all metavariables in the tree. The generation can be biased by probabilities,",
|
||||
"given in a file in the -probs flag."
|
||||
],
|
||||
flags = [
|
||||
("cat","generation category"),
|
||||
("lang","uses only functions that have linearizations in all these languages"),
|
||||
("number","number of trees generated"),
|
||||
("depth","the maximum generation depth"),
|
||||
("probs", "file with biased probabilities (format 'f 0.4' one by line)")
|
||||
],
|
||||
exec = \env@(pgf, mos) opts xs -> do
|
||||
pgf <- optProbs opts (optRestricted opts pgf)
|
||||
gen <- newStdGen
|
||||
let dp = valIntOpts "depth" 4 opts
|
||||
let ts = case mexp xs of
|
||||
Just ex -> H.generateRandomFromDepth gen pgf ex (Just dp)
|
||||
Nothing -> H.generateRandomDepth gen pgf (optType pgf opts) (Just dp)
|
||||
returnFromExprs $ take (optNum opts) ts
|
||||
}),
|
||||
-}
|
||||
("gt", emptyCommandInfo {
|
||||
longname = "generate_trees",
|
||||
synopsis = "generates a list of trees, by default exhaustive",
|
||||
flags = [("cat","the generation category"),
|
||||
("number","the number of trees generated")],
|
||||
examples = [
|
||||
mkEx "gt -- all trees in the startcat",
|
||||
mkEx "gt -cat=NP -number=16 -- 16 trees in the category NP"],
|
||||
exec = needPGF $ \ opts _ env@(pgf,_) ->
|
||||
let ts = map fst (generateAll pgf cat)
|
||||
cat = optType pgf opts
|
||||
in returnFromCExprs (takeOptNum opts ts),
|
||||
needsTypeCheck = False
|
||||
}),
|
||||
("i", emptyCommandInfo {
|
||||
longname = "import",
|
||||
synopsis = "import a grammar from a compiled .pgf file",
|
||||
explanation = unlines [
|
||||
"Reads a grammar from a compiled .pgf file.",
|
||||
"Old modules are discarded.",
|
||||
{-
|
||||
"The grammar parser depends on the file name suffix:",
|
||||
|
||||
" .cf context-free (labelled BNF) source",
|
||||
" .ebnf extended BNF source",
|
||||
" .gfm multi-module GF source",
|
||||
" .gf normal GF source",
|
||||
" .gfo compiled GF source",
|
||||
-}
|
||||
" .pgf precompiled grammar in Portable Grammar Format"
|
||||
],
|
||||
flags = [
|
||||
-- ("probs","file with biased probabilities for generation")
|
||||
],
|
||||
options = [
|
||||
-- ["gfo", "src", "no-cpu", "cpu", "quiet", "verbose"]
|
||||
-- ("retain","retain operations (used for cc command)"),
|
||||
-- ("src", "force compilation from source"),
|
||||
-- ("v", "be verbose - show intermediate status information")
|
||||
],
|
||||
needsTypeCheck = False
|
||||
}),
|
||||
("l", emptyCommandInfo {
|
||||
longname = "linearize",
|
||||
synopsis = "convert an abstract syntax expression to string",
|
||||
explanation = unlines [
|
||||
"Shows the linearization of a Tree by the grammars in scope.",
|
||||
"The -lang flag can be used to restrict this to fewer languages.",
|
||||
"A sequence of string operations (see command ps) can be given",
|
||||
"as options, and works then like a pipe to the ps command, except",
|
||||
"that it only affect the strings, not e.g. the table labels.",
|
||||
"These can be given separately to each language with the unlexer flag",
|
||||
"whose results are prepended to the other lexer flags. The value of the",
|
||||
"unlexer flag is a space-separated list of comma-separated string operation",
|
||||
"sequences; see example."
|
||||
],
|
||||
examples = [
|
||||
mkEx "l -lang=LangSwe,LangNor no_Utt -- linearize a tree to LangSwe and LangNor",
|
||||
mkEx "gr -lang=LangHin -cat=Cl | l -table -to_devanagari -- hindi table",
|
||||
mkEx "l -unlexer=\"LangAra=to_arabic LangHin=to_devanagari\" -- different unlexers"
|
||||
],
|
||||
exec = needPGF $ \ opts arg env ->
|
||||
return . fromStrings . optLins env opts . map cExpr $ toExprs arg,
|
||||
options = [
|
||||
("all", "show all forms and variants, one by line (cf. l -list)"),
|
||||
("bracket","show tree structure with brackets and paths to nodes"),
|
||||
("groups", "all languages, grouped by lang, remove duplicate strings"),
|
||||
("list","show all forms and variants, comma-separated on one line (cf. l -all)"),
|
||||
("multi","linearize to all languages (default)"),
|
||||
("table","show all forms labelled by parameters"),
|
||||
("treebank","show the tree and tag linearizations with language names")
|
||||
],
|
||||
flags = [
|
||||
("lang","the languages of linearization (comma-separated, no spaces)")
|
||||
]
|
||||
}),
|
||||
("ma", emptyCommandInfo {
|
||||
longname = "morpho_analyse",
|
||||
synopsis = "print the morphological analyses of the (multiword) expression in the string",
|
||||
explanation = unlines [
|
||||
"Prints all the analyses of the (multiword) expression in the input string,",
|
||||
"using the morphological analyser of the actual grammar (see command pg)"
|
||||
],
|
||||
exec = needPGF $ \opts args env ->
|
||||
return ((fromString . unlines .
|
||||
map prMorphoAnalysis . concatMap (morphos env opts) . toStrings) args),
|
||||
flags = [
|
||||
("lang","the languages of analysis (comma-separated, no spaces)")
|
||||
]
|
||||
}),
|
||||
{-
|
||||
("mq", emptyCommandInfo {
|
||||
longname = "morpho_quiz",
|
||||
synopsis = "start a morphology quiz",
|
||||
syntax = "mq (-cat=CAT)? (-probs=FILE)? TREE?",
|
||||
exec = \env@(pgf, mos) opts xs -> do
|
||||
let lang = optLang pgf opts
|
||||
let typ = optType pgf opts
|
||||
pgf <- optProbs opts pgf
|
||||
let mt = mexp xs
|
||||
restricted $ morphologyQuiz mt pgf lang typ
|
||||
return void,
|
||||
flags = [
|
||||
("lang","language of the quiz"),
|
||||
("cat","category of the quiz"),
|
||||
("number","maximum number of questions"),
|
||||
("probs","file with biased probabilities for generation")
|
||||
]
|
||||
}),
|
||||
-}
|
||||
("p", emptyCommandInfo {
|
||||
longname = "parse",
|
||||
synopsis = "parse a string to abstract syntax expression",
|
||||
explanation = unlines [
|
||||
"Shows all trees returned by parsing a string in the grammars in scope.",
|
||||
"The -lang flag can be used to restrict this to fewer languages.",
|
||||
"The default start category can be overridden by the -cat flag.",
|
||||
"See also the ps command for lexing and character encoding."
|
||||
],
|
||||
flags = [
|
||||
("cat","target category of parsing"),
|
||||
("lang","the languages of parsing (comma-separated, no spaces)"),
|
||||
("number","maximum number of trees returned")
|
||||
],
|
||||
examples = [
|
||||
mkEx "p \"this fish is fresh\" | l -lang=Swe -- try parsing with all languages and translate the successful parses to Swedish"
|
||||
],
|
||||
exec = needPGF $ \ opts ts env -> return . cParse env opts $ toStrings ts
|
||||
}),
|
||||
("pg", emptyCommandInfo {
|
||||
longname = "print_grammar",
|
||||
synopsis = "prints different information about the grammar",
|
||||
exec = needPGF $ \opts _ env -> prGrammar env opts,
|
||||
options = [
|
||||
("cats", "show just the names of abstract syntax categories"),
|
||||
("fullform", "print the fullform lexicon"),
|
||||
("funs", "show just the names and types of abstract syntax functions"),
|
||||
("langs", "show just the names of top concrete syntax modules"),
|
||||
("lexc", "print the lexicon in Xerox LEXC format"),
|
||||
("missing","show just the names of functions that have no linearization"),
|
||||
("words", "print the list of words")
|
||||
],
|
||||
flags = [
|
||||
("lang","the languages that need to be printed")
|
||||
],
|
||||
examples = [
|
||||
mkEx "pg -langs -- show the names of top concrete syntax modules",
|
||||
mkEx "pg -funs | ? grep \" S ;\" -- show functions with value cat S"
|
||||
]
|
||||
}),
|
||||
|
||||
{-
|
||||
("pt", emptyCommandInfo {
|
||||
longname = "put_tree",
|
||||
syntax = "pt OPT? TREE",
|
||||
synopsis = "return a tree, possibly processed with a function",
|
||||
explanation = unlines [
|
||||
"Returns a tree obtained from its argument tree by applying",
|
||||
"tree processing functions in the order given in the command line",
|
||||
"option list. Thus 'pt -f -g s' returns g (f s). Typical tree processors",
|
||||
"are type checking and semantic computation."
|
||||
],
|
||||
examples = [
|
||||
mkEx "pt -compute (plus one two) -- compute value",
|
||||
mkEx "p \"4 dogs love 5 cats\" | pt -transfer=digits2numeral | l -- four...five..."
|
||||
],
|
||||
exec = \env@(pgf, mos) opts ->
|
||||
returnFromExprs . takeOptNum opts . treeOps pgf opts,
|
||||
options = treeOpOptions undefined{-pgf-},
|
||||
flags = [("number","take at most this many trees")] ++ treeOpFlags undefined{-pgf-}
|
||||
}),
|
||||
-}
|
||||
("rf", emptyCommandInfo {
|
||||
longname = "read_file",
|
||||
synopsis = "read string or tree input from a file",
|
||||
explanation = unlines [
|
||||
"Reads input from file. The filename must be in double quotes.",
|
||||
"The input is interpreted as a string by default, and can hence be",
|
||||
"piped e.g. to the parse command. The option -tree interprets the",
|
||||
"input as a tree, which can be given e.g. to the linearize command.",
|
||||
"The option -lines will result in a list of strings or trees, one by line."
|
||||
],
|
||||
options = [
|
||||
("lines","return the list of lines, instead of the singleton of all contents"),
|
||||
("tree","convert strings into trees")
|
||||
],
|
||||
exec = needPGF $ \opts _ env@(pgf, mos) -> do
|
||||
let file = optFile opts
|
||||
let exprs [] = ([],empty)
|
||||
exprs ((n,s):ls) | null s
|
||||
= exprs ls
|
||||
exprs ((n,s):ls) = case readExpr s of
|
||||
Just e -> let (es,err) = exprs ls
|
||||
in case inferExpr pgf e of
|
||||
Right (e,t) -> (e:es,err)
|
||||
Left msg -> (es,"on line" <+> n <> ':' $$ msg $$ err)
|
||||
Nothing -> let (es,err) = exprs ls
|
||||
in (es,"on line" <+> n <> ':' <+> "parse error" $$ err)
|
||||
returnFromLines ls = case exprs ls of
|
||||
(es, err) | null es -> return $ pipeMessage $ render (err $$ "no trees found")
|
||||
| otherwise -> return $ pipeWithMessage (map hsExpr es) (render err)
|
||||
|
||||
s <- restricted $ readFile file
|
||||
case opts of
|
||||
_ | isOpt "lines" opts && isOpt "tree" opts ->
|
||||
returnFromLines (zip [1::Int ..] (lines s))
|
||||
_ | isOpt "tree" opts ->
|
||||
returnFromLines [(1::Int,s)]
|
||||
_ | isOpt "lines" opts -> return (fromStrings $ lines s)
|
||||
_ -> return (fromString s),
|
||||
flags = [("file","the input file name")]
|
||||
}),
|
||||
("rt", emptyCommandInfo {
|
||||
longname = "rank_trees",
|
||||
synopsis = "show trees in an order of decreasing probability",
|
||||
explanation = unlines [
|
||||
"Order trees from the most to the least probable, using either",
|
||||
"even distribution in each category (default) or biased as specified",
|
||||
"by the file given by flag -probs=FILE, where each line has the form",
|
||||
"'function probability', e.g. 'youPol_Pron 0.01'."
|
||||
],
|
||||
exec = needPGF $ \opts es env@(pgf, _) -> do
|
||||
let tds = sortBy (\(_,p) (_,q) -> compare p q)
|
||||
[(t, treeProbability pgf t) | t <- map cExpr (toExprs es)]
|
||||
if isOpt "v" opts
|
||||
then putStrLn $
|
||||
unlines [PGF2.showExpr [] t ++ "\t--" ++ show d | (t,d) <- tds]
|
||||
else return ()
|
||||
returnFromExprs $ map (hsExpr . fst) tds,
|
||||
flags = [
|
||||
("probs","probabilities from this file (format 'f 0.6' per line)")
|
||||
],
|
||||
options = [
|
||||
("v","show all trees with their probability scores")
|
||||
],
|
||||
examples = [
|
||||
mkEx "p \"you are here\" | rt -probs=probs | pt -number=1 -- most probable result"
|
||||
]
|
||||
}),
|
||||
{-
|
||||
("tq", emptyCommandInfo {
|
||||
longname = "translation_quiz",
|
||||
syntax = "tq -from=LANG -to=LANG (-cat=CAT)? (-probs=FILE)? TREE?",
|
||||
synopsis = "start a translation quiz",
|
||||
exec = \env@(pgf, mos) opts xs -> do
|
||||
let from = optLangFlag "from" pgf opts
|
||||
let to = optLangFlag "to" pgf opts
|
||||
let typ = optType pgf opts
|
||||
let mt = mexp xs
|
||||
pgf <- optProbs opts pgf
|
||||
restricted $ translationQuiz mt pgf from to typ
|
||||
return void,
|
||||
flags = [
|
||||
("from","translate from this language"),
|
||||
("to","translate to this language"),
|
||||
("cat","translate in this category"),
|
||||
("number","the maximum number of questions"),
|
||||
("probs","file with biased probabilities for generation")
|
||||
],
|
||||
examples = [
|
||||
mkEx ("tq -from=Eng -to=Swe -- any trees in startcat"),
|
||||
mkEx ("tq -from=Eng -to=Swe (AdjCN (PositA ?2) (UseN ?)) -- only trees of this form")
|
||||
]
|
||||
}),
|
||||
("vd", emptyCommandInfo {
|
||||
longname = "visualize_dependency",
|
||||
synopsis = "show word dependency tree graphically",
|
||||
explanation = unlines [
|
||||
"Prints a dependency tree in the .dot format (the graphviz format, default)",
|
||||
"or the CoNLL/MaltParser format (flag -output=conll for training, malt_input",
|
||||
"for unanalysed input).",
|
||||
"By default, the last argument is the head of every abstract syntax",
|
||||
"function; moreover, the head depends on the head of the function above.",
|
||||
"The graph can be saved in a file by the wf command as usual.",
|
||||
"If the -view flag is defined, the graph is saved in a temporary file",
|
||||
"which is processed by graphviz and displayed by the program indicated",
|
||||
"by the flag. The target format is png, unless overridden by the",
|
||||
"flag -format."
|
||||
],
|
||||
exec = \env@(pgf, mos) opts es -> do
|
||||
let debug = isOpt "v" opts
|
||||
let file = valStrOpts "file" "" opts
|
||||
let outp = valStrOpts "output" "dot" opts
|
||||
mlab <- case file of
|
||||
"" -> return Nothing
|
||||
_ -> (Just . H.getDepLabels . lines) `fmap` restricted (readFile file)
|
||||
let lang = optLang pgf opts
|
||||
let grphs = unlines $ map (H.graphvizDependencyTree outp debug mlab Nothing pgf lang) es
|
||||
if isFlag "view" opts || isFlag "format" opts then do
|
||||
let file s = "_grphd." ++ s
|
||||
let view = optViewGraph opts
|
||||
let format = optViewFormat opts
|
||||
restricted $ writeUTF8File (file "dot") grphs
|
||||
restrictedSystem $ "dot -T" ++ format ++ " " ++ file "dot" ++ " > " ++ file format
|
||||
restrictedSystem $ view ++ " " ++ file format
|
||||
return void
|
||||
else return $ fromString grphs,
|
||||
examples = [
|
||||
mkEx "gr | vd -- generate a tree and show dependency tree in .dot",
|
||||
mkEx "gr | vd -view=open -- generate a tree and display dependency tree on a Mac",
|
||||
mkEx "gr -number=1000 | vd -file=dep.labels -output=malt -- generate training treebank",
|
||||
mkEx "gr -number=100 | vd -file=dep.labels -output=malt_input -- generate test sentences"
|
||||
],
|
||||
options = [
|
||||
("v","show extra information")
|
||||
],
|
||||
flags = [
|
||||
("file","configuration file for labels per fun, format 'fun l1 ... label ... l2'"),
|
||||
("format","format of the visualization file (default \"png\")"),
|
||||
("output","output format of graph source (default \"dot\")"),
|
||||
("view","program to open the resulting file (default \"open\")"),
|
||||
("lang","the language of analysis")
|
||||
]
|
||||
}),
|
||||
-}
|
||||
|
||||
("vp", emptyCommandInfo {
|
||||
longname = "visualize_parse",
|
||||
synopsis = "show parse tree graphically",
|
||||
explanation = unlines [
|
||||
"Prints a parse tree in the .dot format (the graphviz format).",
|
||||
"The graph can be saved in a file by the wf command as usual.",
|
||||
"If the -view flag is defined, the graph is saved in a temporary file",
|
||||
"which is processed by graphviz and displayed by the program indicated",
|
||||
"by the flag. The target format is png, unless overridden by the",
|
||||
"flag -format."
|
||||
],
|
||||
exec = needPGF $ \opts arg env@(pgf, concs) ->
|
||||
do let es = toExprs arg
|
||||
let concs = optConcs env opts
|
||||
|
||||
let gvOptions=graphvizDefaults{noLeaves = isOpt "noleaves" opts && not (isOpt "showleaves" opts),
|
||||
noFun = isOpt "nofun" opts || not (isOpt "showfun" opts),
|
||||
noCat = isOpt "nocat" opts && not (isOpt "showcat" opts),
|
||||
nodeFont = valStrOpts "nodefont" "" opts,
|
||||
leafFont = valStrOpts "leaffont" "" opts,
|
||||
nodeColor = valStrOpts "nodecolor" "" opts,
|
||||
leafColor = valStrOpts "leafcolor" "" opts,
|
||||
nodeEdgeStyle = valStrOpts "nodeedgestyle" "solid" opts,
|
||||
leafEdgeStyle = valStrOpts "leafedgestyle" "dashed" opts
|
||||
}
|
||||
|
||||
let grph= if null es || null concs
|
||||
then []
|
||||
else graphvizParseTree (snd (head concs)) gvOptions (cExpr (head es))
|
||||
if isFlag "view" opts || isFlag "format" opts then do
|
||||
let file s = "_grph." ++ s
|
||||
let view = optViewGraph opts
|
||||
let format = optViewFormat opts
|
||||
restricted $ writeUTF8File (file "dot") grph
|
||||
restrictedSystem $ "dot -T" ++ format ++ " " ++ file "dot" ++ " > " ++ file format
|
||||
restrictedSystem $ view ++ " " ++ file format
|
||||
return void
|
||||
else return $ fromString grph,
|
||||
examples = [
|
||||
mkEx "p -lang=Eng \"John walks\" | vp -- generate a tree and show parse tree as .dot script",
|
||||
mkEx "gr | vp -view=\"open\" -- generate a tree and display parse tree on a Mac"
|
||||
],
|
||||
options = [
|
||||
("showcat","show categories in the tree nodes (default)"),
|
||||
("nocat","don't show categories"),
|
||||
("showfun","show function names in the tree nodes"),
|
||||
("nofun","don't show function names (default)"),
|
||||
("showleaves","show the leaves of the tree (default)"),
|
||||
("noleaves","don't show the leaves of the tree (i.e., only the abstract tree)")
|
||||
],
|
||||
flags = [
|
||||
("lang","the language to visualize"),
|
||||
("format","format of the visualization file (default \"png\")"),
|
||||
("view","program to open the resulting file (default \"open\")"),
|
||||
("nodefont","font for tree nodes (default: Times -- graphviz standard font)"),
|
||||
("leaffont","font for tree leaves (default: nodefont)"),
|
||||
("nodecolor","color for tree nodes (default: black -- graphviz standard color)"),
|
||||
("leafcolor","color for tree leaves (default: nodecolor)"),
|
||||
("nodeedgestyle","edge style between tree nodes (solid/dashed/dotted/bold, default: solid)"),
|
||||
("leafedgestyle","edge style for links to leaves (solid/dashed/dotted/bold, default: dashed)")
|
||||
]
|
||||
}),
|
||||
|
||||
("vt", emptyCommandInfo {
|
||||
longname = "visualize_tree",
|
||||
synopsis = "show a set of trees graphically",
|
||||
explanation = unlines [
|
||||
"Prints a set of trees in the .dot format (the graphviz format).",
|
||||
"The graph can be saved in a file by the wf command as usual.",
|
||||
"If the -view flag is defined, the graph is saved in a temporary file",
|
||||
"which is processed by graphviz and displayed by the program indicated",
|
||||
"by the flag. The target format is postscript, unless overridden by the",
|
||||
"flag -format."
|
||||
],
|
||||
exec = needPGF $ \opts arg env@(pgf, _) ->
|
||||
let es = toExprs arg in
|
||||
if isOpt "api" opts
|
||||
then do
|
||||
mapM_ (putStrLn . exprToAPI) es
|
||||
return void
|
||||
else do
|
||||
let gvOptions=graphvizDefaults{noFun = isOpt "nofun" opts,
|
||||
noCat = isOpt "nocat" opts,
|
||||
nodeFont = valStrOpts "nodefont" "" opts,
|
||||
nodeColor = valStrOpts "nodecolor" "" opts,
|
||||
nodeEdgeStyle = valStrOpts "nodeedgestyle" "solid" opts
|
||||
}
|
||||
let grph = unlines (map (graphvizAbstractTree pgf gvOptions . cExpr) es)
|
||||
if isFlag "view" opts || isFlag "format" opts then do
|
||||
let file s = "_grph." ++ s
|
||||
let view = optViewGraph opts
|
||||
let format = optViewFormat opts
|
||||
restricted $ writeUTF8File (file "dot") grph
|
||||
restrictedSystem $ "dot -T" ++ format ++ " " ++ file "dot" ++ " > " ++ file format
|
||||
restrictedSystem $ view ++ " " ++ file format
|
||||
return void
|
||||
else return $ fromString grph,
|
||||
examples = [
|
||||
mkEx "p \"hello\" | vt -- parse a string and show trees as graph script",
|
||||
mkEx "p \"hello\" | vt -view=\"open\" -- parse a string and display trees on a Mac"
|
||||
],
|
||||
options = [
|
||||
("api", "show the tree with function names converted to 'mkC' with value cats C"),
|
||||
("nofun","don't show functions but only categories"),
|
||||
("nocat","don't show categories but only functions")
|
||||
],
|
||||
flags = [
|
||||
("format","format of the visualization file (default \"png\")"),
|
||||
("view","program to open the resulting file (default \"open\")"),
|
||||
("nodefont","font for tree nodes (default: Times -- graphviz standard font)"),
|
||||
("nodecolor","color for tree nodes (default: black -- graphviz standard color)"),
|
||||
("nodeedgestyle","edge style between tree nodes (solid/dashed/dotted/bold, default: solid)")
|
||||
]
|
||||
}),
|
||||
|
||||
("ai", emptyCommandInfo {
|
||||
longname = "abstract_info",
|
||||
syntax = "ai IDENTIFIER or ai EXPR",
|
||||
synopsis = "Provides an information about a function, an expression or a category from the abstract syntax",
|
||||
explanation = unlines [
|
||||
"The command has one argument which is either function, expression or",
|
||||
"a category defined in the abstract syntax of the current grammar. ",
|
||||
"If the argument is a function then its type is printed out.",
|
||||
"If it is a category then the category definition is printed.",
|
||||
"If a whole expression is given it prints the expression with refined",
|
||||
"metavariables and the type of the expression."
|
||||
],
|
||||
exec = needPGF $ \opts args env@(pgf,cncs) ->
|
||||
case map cExpr (toExprs args) of
|
||||
[e] -> case unApp e of
|
||||
Just (id,[]) -> return (fromString
|
||||
(case functionType pgf id of
|
||||
Just ty -> showFun id ty
|
||||
Nothing -> let funs = functionsByCat pgf id
|
||||
in showCat id funs))
|
||||
where
|
||||
showCat c funs = "cat "++c++
|
||||
" ;\n\n"++
|
||||
unlines [showFun f ty| f<-funs,
|
||||
Just ty <- [functionType pgf f]]
|
||||
showFun f ty = "fun "++f++" : "++showType [] ty++" ;"
|
||||
_ -> case inferExpr pgf e of
|
||||
Left msg -> error msg
|
||||
Right (e,ty) -> do putStrLn ("Expression: "++PGF2.showExpr [] e)
|
||||
putStrLn ("Type: "++PGF2.showType [] ty)
|
||||
putStrLn ("Probability: "++show (treeProbability pgf e))
|
||||
return void
|
||||
_ -> do putStrLn "a single function name or category name is expected"
|
||||
return void,
|
||||
needsTypeCheck = False
|
||||
})
|
||||
]
|
||||
where
|
||||
cParse env@(pgf,_) opts ss =
|
||||
parsed [ parse cnc cat s | s<-ss,(lang,cnc)<-cncs]
|
||||
where
|
||||
cat = optType pgf opts
|
||||
cncs = optConcs env opts
|
||||
parsed rs = Piped (Exprs ts,unlines msgs)
|
||||
where
|
||||
ts = [hsExpr t|ParseOk ts<-rs,(t,p)<-takeOptNum opts ts]
|
||||
msgs = concatMap mkMsg rs
|
||||
|
||||
mkMsg (ParseOk ts) = (map (PGF2.showExpr [] . fst).takeOptNum opts) ts
|
||||
mkMsg (ParseFailed _ tok) = ["Parse failed: "++tok]
|
||||
mkMsg (ParseIncomplete) = ["The sentence is incomplete"]
|
||||
|
||||
optLins env opts ts = case opts of
|
||||
_ | isOpt "groups" opts ->
|
||||
concatMap snd $ groupResults
|
||||
[[(lang, s) | (lang,concr) <- optConcs env opts,s <- linear opts lang concr t] | t <- ts]
|
||||
_ -> concatMap (optLin env opts) ts
|
||||
optLin env@(pgf,_) opts t =
|
||||
case opts of
|
||||
_ | isOpt "treebank" opts ->
|
||||
(abstractName pgf ++ ": " ++ PGF2.showExpr [] t) :
|
||||
[lang ++ ": " ++ s | (lang,concr) <- optConcs env opts, s<-linear opts lang concr t]
|
||||
_ -> [s | (lang,concr) <- optConcs env opts, s<-linear opts lang concr t]
|
||||
|
||||
linear :: [Option] -> ConcName -> Concr -> PGF2.Expr -> [String]
|
||||
linear opts lang concr = case opts of
|
||||
_ | isOpt "all" opts -> concat . map (map snd) . tabularLinearizeAll concr
|
||||
_ | isOpt "list" opts -> (:[]) . commaList .
|
||||
concatMap (map snd) . tabularLinearizeAll concr
|
||||
_ | isOpt "table" opts -> concatMap (map (\(p,v) -> p+++":"+++v)) . tabularLinearizeAll concr
|
||||
_ | isOpt "bracket" opts -> (:[]) . unwords . map showBracketedString . bracketedLinearize concr
|
||||
_ -> (:[]) . linearize concr
|
||||
|
||||
groupResults :: [[(ConcName,String)]] -> [(ConcName,[String])]
|
||||
groupResults = Map.toList . foldr more Map.empty . start . concat
|
||||
where
|
||||
start ls = [(l,[s]) | (l,s) <- ls]
|
||||
more (l,s) =
|
||||
Map.insertWith (\ [x] xs -> if elem x xs then xs else (x : xs)) l s
|
||||
|
||||
optConcs = optConcsFlag "lang"
|
||||
|
||||
optConcsFlag f (pgf,cncs) opts =
|
||||
case valStrOpts f "" opts of
|
||||
"" -> Map.toList cncs
|
||||
lang -> mapMaybe pickLang (chunks ',' lang)
|
||||
where
|
||||
pickLang l = pick l `mplus` pick fl
|
||||
where
|
||||
fl = abstractName pgf++l
|
||||
pick l = (,) l `fmap` Map.lookup l cncs
|
||||
|
||||
{-
|
||||
-- replace each non-atomic constructor with mkC, where C is the val cat
|
||||
tree2mk pgf = H.showExpr [] . t2m where
|
||||
t2m t = case H.unApp t of
|
||||
Just (cid,ts@(_:_)) -> H.mkApp (mk cid) (map t2m ts)
|
||||
_ -> t
|
||||
mk = H.mkCId . ("mk" ++) . H.showCId . H.lookValCat (H.abstract pgf)
|
||||
|
||||
unlex opts lang = stringOps Nothing (getUnlex opts lang ++ map prOpt opts) ----
|
||||
|
||||
getUnlex opts lang = case words (valStrOpts "unlexer" "" opts) of
|
||||
lexs -> case lookup lang
|
||||
[(H.mkCId la,tail le) | lex <- lexs, let (la,le) = span (/='=') lex, not (null le)] of
|
||||
Just le -> chunks ',' le
|
||||
_ -> []
|
||||
-}
|
||||
commaList [] = []
|
||||
commaList ws = concat $ head ws : map (", " ++) (tail ws)
|
||||
|
||||
optFile opts = valStrOpts "file" "_gftmp" opts
|
||||
|
||||
optType pgf opts =
|
||||
case listFlags "cat" opts of
|
||||
v:_ -> let str = valueString v
|
||||
in case readType str of
|
||||
Just ty -> case checkType pgf ty of
|
||||
Left msg -> error msg
|
||||
Right ty -> ty
|
||||
Nothing -> error ("Can't parse '"++str++"' as a type")
|
||||
_ -> startCat pgf
|
||||
|
||||
optViewFormat opts = valStrOpts "format" "png" opts
|
||||
optViewGraph opts = valStrOpts "view" "open" opts
|
||||
{-
|
||||
optNum opts = valIntOpts "number" 1 opts
|
||||
-}
|
||||
optNumInf opts = valIntOpts "number" 1000000000 opts ---- 10^9
|
||||
takeOptNum opts = take (optNumInf opts)
|
||||
|
||||
returnFromCExprs = returnFromExprs . map hsExpr
|
||||
returnFromExprs es =
|
||||
return $ case es of
|
||||
[] -> pipeMessage "no trees found"
|
||||
_ -> fromExprs es
|
||||
|
||||
prGrammar env@(pgf,cncs) opts
|
||||
| isOpt "langs" opts = return . fromString . unwords $ (map fst (optConcs env opts))
|
||||
| isOpt "cats" opts = return . fromString . unwords $ categories pgf
|
||||
| isOpt "funs" opts = return . fromString . unwords $ functions pgf
|
||||
| isOpt "missing" opts = return . fromString . unwords $
|
||||
[f | f <- functions pgf, not (and [hasLinearization concr f | (_,concr) <- optConcs env opts])]
|
||||
| isOpt "fullform" opts = return $ fromString $ concatMap (prFullFormLexicon . snd) $ optConcs env opts
|
||||
| isOpt "words" opts = return $ fromString $ concatMap (prAllWords . snd) $ optConcs env opts
|
||||
| isOpt "lexc" opts = return $ fromString $ concatMap (prLexcLexicon . snd) $ optConcs env opts
|
||||
| otherwise = return void
|
||||
|
||||
gizaAlignment pgf src_cnc tgt_cnc e =
|
||||
let src_res = alignWords src_cnc e
|
||||
tgt_res = alignWords tgt_cnc e
|
||||
alignment = [show i++"-"++show j | (i,(_,src_fids)) <- zip [0..] src_res, (j,(_,tgt_fids)) <- zip [0..] tgt_res, not (null (intersect src_fids tgt_fids))]
|
||||
in (unwords (map fst src_res), unwords (map fst tgt_res), unwords alignment)
|
||||
|
||||
morphos env opts s =
|
||||
[(s,res) | (lang,concr) <- optConcs env opts, let res = lookupMorpho concr s, not (null res)]
|
||||
{-
|
||||
mexp xs = case xs of
|
||||
t:_ -> Just t
|
||||
_ -> Nothing
|
||||
-}
|
||||
-- ps -f -g s returns g (f s)
|
||||
{-
|
||||
treeOps pgf opts s = foldr app s (reverse opts) where
|
||||
app (OOpt op) | Just (Left f) <- treeOp pgf op = f
|
||||
app (OFlag op (VId x)) | Just (Right f) <- treeOp pgf op = f (H.mkCId x)
|
||||
app _ = id
|
||||
|
||||
treeOpOptions pgf = [(op,expl) | (op,(expl,Left _)) <- allTreeOps pgf]
|
||||
treeOpFlags pgf = [(op,expl) | (op,(expl,Right _)) <- allTreeOps pgf]
|
||||
|
||||
translationQuiz :: Maybe H.Expr -> H.PGF -> H.Language -> H.Language -> H.Type -> IO ()
|
||||
translationQuiz mex pgf ig og typ = do
|
||||
tts <- translationList mex pgf ig og typ infinity
|
||||
mkQuiz "Welcome to GF Translation Quiz." tts
|
||||
|
||||
morphologyQuiz :: Maybe H.Expr -> H.PGF -> H.Language -> H.Type -> IO ()
|
||||
morphologyQuiz mex pgf ig typ = do
|
||||
tts <- morphologyList mex pgf ig typ infinity
|
||||
mkQuiz "Welcome to GF Morphology Quiz." tts
|
||||
|
||||
-- | the maximal number of precompiled quiz problems
|
||||
infinity :: Int
|
||||
infinity = 256
|
||||
-}
|
||||
prLexcLexicon :: Concr -> String
|
||||
prLexcLexicon concr =
|
||||
unlines $ "Multichar_Symbols":multichars:"":"LEXICON Root" : [prLexc l p ++ ":" ++ w ++ " # ;" | (w,lps) <- morpho, (l,p,_) <- lps] ++ ["END"]
|
||||
where
|
||||
morpho = fullFormLexicon concr
|
||||
prLexc l p = l ++ concat (mkTags (words p))
|
||||
mkTags p = case p of
|
||||
"s":ws -> mkTags ws --- remove record field
|
||||
ws -> map ('+':) ws
|
||||
|
||||
multichars = unwords $ nub $ concat [mkTags (words p) | (w,lps) <- morpho, (l,p,_) <- lps]
|
||||
-- thick_A+(AAdj+Posit+Gen):thick's # ;
|
||||
|
||||
prFullFormLexicon :: Concr -> String
|
||||
prFullFormLexicon concr =
|
||||
unlines (map prMorphoAnalysis (fullFormLexicon concr))
|
||||
|
||||
prAllWords :: Concr -> String
|
||||
prAllWords concr =
|
||||
unwords [w | (w,_) <- fullFormLexicon concr]
|
||||
|
||||
prMorphoAnalysis :: (String,[MorphoAnalysis]) -> String
|
||||
prMorphoAnalysis (w,lps) =
|
||||
unlines (w:[fun ++ " : " ++ cat | (fun,cat,p) <- lps])
|
||||
|
||||
hsExpr c =
|
||||
case unApp c of
|
||||
Just (f,cs) -> H.mkApp (H.mkCId f) (map hsExpr cs)
|
||||
_ -> case unStr c of
|
||||
Just str -> H.mkStr str
|
||||
_ -> error $ "GF.Command.Commands2.hsExpr "++show c
|
||||
|
||||
cExpr e =
|
||||
case H.unApp e of
|
||||
Just (f,es) -> mkApp (H.showCId f) (map cExpr es)
|
||||
_ -> case H.unStr e of
|
||||
Just str -> mkStr str
|
||||
_ -> error $ "GF.Command.Commands2.cExpr "++show e
|
||||
|
||||
needPGF exec opts ts =
|
||||
do Env mb_pgf cncs <- getPGFEnv
|
||||
case mb_pgf of
|
||||
Just pgf -> liftSIO $ exec opts ts (pgf,cncs)
|
||||
_ -> fail "Import a grammar before using this command"
|
||||
@@ -3,7 +3,6 @@
|
||||
-- elsewhere
|
||||
module GF.Command.CommonCommands where
|
||||
import Data.List(sort)
|
||||
import Data.Char (isSpace)
|
||||
import GF.Command.CommandInfo
|
||||
import qualified Data.Map as Map
|
||||
import GF.Infra.SIO
|
||||
@@ -15,8 +14,9 @@ import GF.Command.Abstract --(isOpt,valStrOpts,prOpt)
|
||||
import GF.Text.Pretty
|
||||
import GF.Text.Transliterations
|
||||
import GF.Text.Lexing(stringOp,opInEnv)
|
||||
import Data.Char (isSpace)
|
||||
|
||||
import qualified PGF as H(showCId,showExpr,toATree,toTrie,Trie(..))
|
||||
import PGF2(showExpr)
|
||||
|
||||
extend old new = Map.union (Map.fromList new) old -- Map.union is left-biased
|
||||
|
||||
@@ -102,9 +102,7 @@ commonCommands = fmap (mapCommandExec liftSIO) $ Map.fromList [
|
||||
"To see transliteration tables, use command ut."
|
||||
],
|
||||
examples = [
|
||||
-- mkEx "l (EAdd 3 4) | ps -code -- linearize code-like output",
|
||||
mkEx "l (EAdd 3 4) | ps -unlexcode -- linearize code-like output",
|
||||
-- mkEx "ps -lexer=code | p -cat=Exp -- parse code-like input",
|
||||
mkEx "ps -lexcode | p -cat=Exp -- parse code-like input",
|
||||
mkEx "gr -cat=QCl | l | ps -bind -- linearization output from LangFin",
|
||||
mkEx "ps -to_devanagari \"A-p\" -- show Devanagari in UTF8 terminal",
|
||||
@@ -117,13 +115,11 @@ commonCommands = fmap (mapCommandExec liftSIO) $ Map.fromList [
|
||||
let (os,fs) = optsAndFlags opts
|
||||
trans <- optTranslit opts
|
||||
|
||||
case opts of
|
||||
_ | isOpt "lines" opts -> return $ fromStrings $ map (trans . stringOps (envFlag fs) (map prOpt os)) $ toStrings x
|
||||
_ | isOpt "paragraphs" opts -> return $ fromStrings $ map (trans . stringOps (envFlag fs) (map prOpt os)) $ toParagraphs $ toStrings x
|
||||
_ -> return ((fromString . trans . stringOps (envFlag fs) (map prOpt os) . toString) x),
|
||||
if isOpt "lines" opts
|
||||
then return $ fromStrings $ map (trans . stringOps (envFlag fs) (map prOpt os)) $ toStrings x
|
||||
else return ((fromString . trans . stringOps (envFlag fs) (map prOpt os) . toString) x),
|
||||
options = [
|
||||
("lines","apply the operation separately to each input line, returning a list of lines"),
|
||||
("paragraphs","apply separately to each input paragraph (as separated by empty lines), returning a list of lines")
|
||||
("lines","apply the operation separately to each input line, returning a list of lines")
|
||||
] ++
|
||||
stringOpOptions,
|
||||
flags = [
|
||||
@@ -170,7 +166,8 @@ commonCommands = fmap (mapCommandExec liftSIO) $ Map.fromList [
|
||||
restrictedSystem $ syst ++ " <" ++ tmpi ++ " >" ++ tmpo
|
||||
fmap fromString $ restricted $ readFile tmpo,
|
||||
-}
|
||||
fmap fromString . restricted . readShellProcess syst $ toString arg,
|
||||
fmap (fromStrings . lines) . restricted . readShellProcess syst . unlines . map (dropWhile (=='\n')) $ toStrings $ arg,
|
||||
|
||||
flags = [
|
||||
("command","the system command applied to the argument")
|
||||
],
|
||||
@@ -178,12 +175,6 @@ commonCommands = fmap (mapCommandExec liftSIO) $ Map.fromList [
|
||||
mkEx "gt | l | ? wc -- generate trees, linearize, and count words"
|
||||
]
|
||||
}),
|
||||
("tt", emptyCommandInfo {
|
||||
longname = "to_trie",
|
||||
syntax = "to_trie",
|
||||
synopsis = "combine a list of trees into a trie",
|
||||
exec = \ _ -> return . fromString . trie . toExprs
|
||||
}),
|
||||
("ut", emptyCommandInfo {
|
||||
longname = "unicode_table",
|
||||
synopsis = "show a transliteration table for a unicode character set",
|
||||
@@ -231,7 +222,6 @@ envFlag fs =
|
||||
_ -> Nothing
|
||||
|
||||
stringOpOptions = sort $ [
|
||||
("bind","bind tokens separated by Prelude.BIND, i.e. &+"),
|
||||
("chars","lexer that makes every non-space character a token"),
|
||||
("from_cp1251","decode from cp1251 (Cyrillic used in Bulgarian resource)"),
|
||||
("from_utf8","decode from utf8 (default)"),
|
||||
@@ -256,27 +246,6 @@ stringOpOptions = sort $ [
|
||||
("to_" ++ p, "from GF " ++ n ++ " transliteration to unicode")] |
|
||||
(p,n) <- transliterationPrintNames]
|
||||
|
||||
trie = render . pptss . H.toTrie . map H.toATree
|
||||
where
|
||||
pptss [ts] = "*"<+>nest 2 (ppts ts)
|
||||
pptss tss = vcat [i<+>nest 2 (ppts ts)|(i,ts)<-zip [(1::Int)..] tss]
|
||||
|
||||
ppts = vcat . map ppt
|
||||
|
||||
ppt t =
|
||||
case t of
|
||||
H.Oth e -> pp (H.showExpr [] e)
|
||||
H.Ap f [[]] -> pp (H.showCId f)
|
||||
H.Ap f tss -> H.showCId f $$ nest 2 (pptss tss)
|
||||
|
||||
-- ** Converting command input
|
||||
toString = unwords . toStrings
|
||||
toLines = unlines . toStrings
|
||||
|
||||
toParagraphs = map (unwords . words) . toParas
|
||||
where
|
||||
toParas ls = case break (all isSpace) ls of
|
||||
([],[]) -> []
|
||||
([],_:ll) -> toParas ll
|
||||
(l, []) -> [unwords l]
|
||||
(l, _:ll) -> unwords l : toParas ll
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
module GF.Command.Importing (importGrammar, importSource) where
|
||||
|
||||
import PGF
|
||||
import PGF.Internal(optimizePGF,unionPGF,msgUnionPGF)
|
||||
import PGF2
|
||||
import PGF2.Internal(unionPGF)
|
||||
|
||||
import GF.Compile
|
||||
import GF.Compile.Multi (readMulti)
|
||||
@@ -17,14 +17,16 @@ import GF.Data.ErrM
|
||||
|
||||
import System.FilePath
|
||||
import qualified Data.Set as Set
|
||||
import qualified Data.Map as Map
|
||||
import Control.Monad(foldM)
|
||||
|
||||
-- import a grammar in an environment where it extends an existing grammar
|
||||
importGrammar :: PGF -> Options -> [FilePath] -> IO PGF
|
||||
importGrammar pgf0 _ [] = return pgf0
|
||||
importGrammar :: Maybe PGF -> Options -> [FilePath] -> IO (Maybe PGF)
|
||||
importGrammar pgf0 _ [] = return pgf0
|
||||
importGrammar pgf0 opts files =
|
||||
case takeExtensions (last files) of
|
||||
".cf" -> importCF opts files getBNFCRules bnfc2cf
|
||||
".ebnf" -> importCF opts files getEBNFRules ebnf2cf
|
||||
".cf" -> fmap Just $ importCF opts files getBNFCRules bnfc2cf
|
||||
".ebnf" -> fmap Just $ importCF opts files getEBNFRules ebnf2cf
|
||||
".gfm" -> do
|
||||
ascss <- mapM readMulti files
|
||||
let cs = concatMap snd ascss
|
||||
@@ -36,14 +38,17 @@ importGrammar pgf0 opts files =
|
||||
Bad msg -> do putStrLn ('\n':'\n':msg)
|
||||
return pgf0
|
||||
".pgf" -> do
|
||||
pgf2 <- mapM readPGF files >>= return . foldl1 unionPGF
|
||||
ioUnionPGF pgf0 pgf2
|
||||
mapM readPGF files >>= foldM ioUnionPGF pgf0
|
||||
".ngf" -> do
|
||||
mapM readNGF files >>= foldM ioUnionPGF pgf0
|
||||
ext -> die $ "Unknown filename extension: " ++ show ext
|
||||
|
||||
ioUnionPGF :: PGF -> PGF -> IO PGF
|
||||
ioUnionPGF one two = case msgUnionPGF one two of
|
||||
(pgf, Just msg) -> putStrLn msg >> return pgf
|
||||
(pgf,_) -> return pgf
|
||||
ioUnionPGF :: Maybe PGF -> PGF -> IO (Maybe PGF)
|
||||
ioUnionPGF Nothing two = return (Just two)
|
||||
ioUnionPGF (Just one) two =
|
||||
case unionPGF one two of
|
||||
Nothing -> putStrLn "Abstract changed, previous concretes discarded." >> return (Just two)
|
||||
Just pgf -> return (Just pgf)
|
||||
|
||||
importSource :: Options -> [FilePath] -> IO SourceGrammar
|
||||
importSource opts files = fmap (snd.snd) (batchCompile opts files)
|
||||
@@ -56,7 +61,6 @@ importCF opts files get convert = impCF
|
||||
startCat <- case rules of
|
||||
(Rule cat _ _ : _) -> return cat
|
||||
_ -> fail "empty CFG"
|
||||
let pgf = cf2pgf (last files) (mkCFG startCat Set.empty rules)
|
||||
probs <- maybe (return . defaultProbabilities) readProbabilitiesFromFile (flag optProbsFile opts) pgf
|
||||
return $ setProbabilities probs
|
||||
$ if flag optOptimizePGF opts then optimizePGF pgf else pgf
|
||||
probs <- maybe (return Map.empty) readProbabilitiesFromFile (flag optProbsFile opts)
|
||||
let pgf = cf2pgf opts (last files) (mkCFG startCat Set.empty rules) probs
|
||||
return pgf
|
||||
|
||||
@@ -6,11 +6,13 @@ module GF.Command.Interpreter (
|
||||
import GF.Command.CommandInfo
|
||||
import GF.Command.Abstract
|
||||
import GF.Command.Parse
|
||||
import PGF.Internal(Expr(..))
|
||||
import GF.Infra.UseIO(putStrLnE)
|
||||
import PGF2
|
||||
|
||||
import Control.Monad(when)
|
||||
import qualified Data.Map as Map
|
||||
import GF.Infra.UseIO (Output)
|
||||
import qualified Control.Monad.Fail as Fail
|
||||
|
||||
data CommandEnv m = CommandEnv {
|
||||
commands :: Map.Map String (CommandInfo m),
|
||||
@@ -22,6 +24,7 @@ data CommandEnv m = CommandEnv {
|
||||
mkCommandEnv cmds = CommandEnv cmds Map.empty Map.empty
|
||||
|
||||
--interpretCommandLine :: CommandEnv -> String -> SIO ()
|
||||
interpretCommandLine :: (Fail.MonadFail m, Output m, TypeCheckArg m) => CommandEnv m -> String -> m ()
|
||||
interpretCommandLine env line =
|
||||
case readCommandLine line of
|
||||
Just [] -> return ()
|
||||
@@ -53,17 +56,8 @@ interpretPipe env cs = do
|
||||
-- | macro definition applications: replace ?i by (exps !! i)
|
||||
appCommand :: CommandArguments -> Command -> Command
|
||||
appCommand args c@(Command i os arg) = case arg of
|
||||
AExpr e -> Command i os (AExpr (app e))
|
||||
AExpr e -> Command i os (AExpr (exprSubstitute e (toExprs args)))
|
||||
_ -> c
|
||||
where
|
||||
xs = toExprs args
|
||||
|
||||
app e = case e of
|
||||
EAbs b x e -> EAbs b x (app e)
|
||||
EApp e1 e2 -> EApp (app e1) (app e2)
|
||||
ELit l -> ELit l
|
||||
EMeta i -> xs !! i
|
||||
EFun x -> EFun x
|
||||
|
||||
-- | return the trees to be sent in pipe, and the output possibly printed
|
||||
--interpret :: CommandEnv -> [Expr] -> Command -> SIO CommandOutput
|
||||
@@ -110,4 +104,4 @@ getCommandTrees env needsTypeCheck a args =
|
||||
ATerm t -> return (Term t)
|
||||
ANoArg -> return args -- use piped
|
||||
where
|
||||
one e = return (Exprs [e]) -- ignore piped
|
||||
one e = return (Exprs [(e,0)]) -- ignore piped
|
||||
|
||||
@@ -8,9 +8,11 @@ import qualified Data.Map as Map
|
||||
|
||||
import GF.Infra.SIO(MonadSIO(..),restricted)
|
||||
import GF.Infra.Option(modifyFlags,optTrace) --,noOptions
|
||||
import GF.Data.Operations (chunks,err,raise)
|
||||
import GF.Text.Pretty(render)
|
||||
import GF.Infra.Dependencies(depGraph)
|
||||
import GF.Infra.CheckM
|
||||
import GF.Text.Pretty(render,pp)
|
||||
import GF.Data.Str(sstr)
|
||||
import GF.Data.Operations (chunks,err,raise)
|
||||
|
||||
import GF.Grammar hiding (Ident,isPrefixOf)
|
||||
import GF.Grammar.Analyse
|
||||
@@ -18,10 +20,8 @@ import GF.Grammar.Parser (runP, pExp)
|
||||
import GF.Grammar.ShowTerm
|
||||
import GF.Grammar.Lookup (allOpers,allOpersTo)
|
||||
import GF.Compile.Rename(renameSourceTerm)
|
||||
import qualified GF.Compile.Compute.ConcreteNew as CN(normalForm,resourceValues)
|
||||
import GF.Compile.TypeCheck.RConcrete as TC(inferLType,ppType)
|
||||
import GF.Infra.Dependencies(depGraph)
|
||||
import GF.Infra.CheckM(runCheck)
|
||||
import GF.Compile.Compute.Concrete(normalForm)
|
||||
import GF.Compile.TypeCheck.Concrete as TC(inferLType,ppType)
|
||||
|
||||
import GF.Command.Abstract(Option(..),isOpt,listFlags,valueString,valStrOpts)
|
||||
import GF.Command.CommandInfo
|
||||
@@ -162,12 +162,11 @@ sourceCommands = Map.fromList [
|
||||
do sgr <- getGrammar
|
||||
liftSIO (exec opts (toStrings ts) sgr)
|
||||
|
||||
compute_concrete opts ws sgr =
|
||||
compute_concrete opts ws sgr = fmap fst $ runCheck $
|
||||
case runP pExp (UTF8.fromString s) of
|
||||
Left (_,msg) -> return $ pipeMessage msg
|
||||
Right t -> return $ err pipeMessage
|
||||
(fromString . showTerm sgr style q)
|
||||
$ checkComputeTerm opts sgr t
|
||||
Right t -> do t <- checkComputeTerm opts sgr t
|
||||
return (fromString (showTerm sgr style q t))
|
||||
where
|
||||
(style,q) = pOpts TermPrintDefault Qualified opts
|
||||
s = unwords ws
|
||||
@@ -200,16 +199,16 @@ sourceCommands = Map.fromList [
|
||||
| otherwise = unwords $ map prTerm ops
|
||||
return $ fromString printed
|
||||
|
||||
show_operations os ts sgr =
|
||||
show_operations os ts sgr = fmap fst $ runCheck $
|
||||
case greatestResource sgr of
|
||||
Nothing -> return $ fromString "no source grammar in scope; did you import with -retain?"
|
||||
Nothing -> checkError (pp "no source grammar in scope; did you import with -retain?")
|
||||
Just mo -> do
|
||||
let greps = map valueString (listFlags "grep" os)
|
||||
let isRaw = isOpt "raw" os
|
||||
ops <- case ts of
|
||||
_:_ -> do
|
||||
let Right t = runP pExp (UTF8.fromString (unwords ts))
|
||||
ty <- err error return $ checkComputeTerm os sgr t
|
||||
ty <- checkComputeTerm os sgr t
|
||||
return $ allOpersTo sgr ty
|
||||
_ -> return $ allOpers sgr
|
||||
let sigs = [(op,ty) | ((mo,op),ty,pos) <- ops]
|
||||
@@ -254,14 +253,12 @@ sourceCommands = Map.fromList [
|
||||
return void
|
||||
|
||||
checkComputeTerm os sgr t =
|
||||
do mo <- maybe (raise "no source grammar in scope") return $
|
||||
do mo <- maybe (checkError (pp "no source grammar in scope")) return $
|
||||
greatestResource sgr
|
||||
((t,_),_) <- runCheck $ do t <- renameSourceTerm sgr mo t
|
||||
inferLType sgr [] t
|
||||
t <- renameSourceTerm sgr mo t
|
||||
(t,_) <- inferLType sgr [] t
|
||||
let opts = modifyFlags (\fs->fs{optTrace=isOpt "trace" os})
|
||||
t1 = CN.normalForm (CN.resourceValues opts sgr) (L NoLoc identW) t
|
||||
t2 = evalStr t1
|
||||
checkPredefError t2
|
||||
fmap evalStr (normalForm sgr t)
|
||||
where
|
||||
-- ** Try to compute pre{...} tokens in token sequences
|
||||
evalStr t =
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
module GF.Command.TreeOperations (
|
||||
treeOp,
|
||||
allTreeOps,
|
||||
treeChunks
|
||||
) where
|
||||
|
||||
import PGF(Expr,PGF,CId,compute,mkApp,unApp,unapply,unMeta,exprSize,exprFunctions)
|
||||
import PGF2(Expr,PGF,Fun,compute,mkApp,unApp,unMeta,exprSize,exprFunctions)
|
||||
import Data.List
|
||||
|
||||
type TreeOp = [Expr] -> [Expr]
|
||||
|
||||
treeOp :: PGF -> String -> Maybe (Either TreeOp (CId -> TreeOp))
|
||||
treeOp :: PGF -> String -> Maybe (Either TreeOp (Fun -> TreeOp))
|
||||
treeOp pgf f = fmap snd $ lookup f $ allTreeOps pgf
|
||||
|
||||
allTreeOps :: PGF -> [(String,(String,Either TreeOp (CId -> TreeOp)))]
|
||||
allTreeOps :: PGF -> [(String,(String,Either TreeOp (Fun -> TreeOp)))]
|
||||
allTreeOps pgf = [
|
||||
("compute",("compute by using semantic definitions (def)",
|
||||
Left $ map (compute pgf))),
|
||||
@@ -34,16 +33,6 @@ largest = reverse . smallest
|
||||
smallest :: [Expr] -> [Expr]
|
||||
smallest = sortBy (\t u -> compare (exprSize t) (exprSize u))
|
||||
|
||||
treeChunks :: Expr -> [Expr]
|
||||
treeChunks = snd . cks where
|
||||
cks t =
|
||||
case unapply t of
|
||||
(t, ts) -> case unMeta t of
|
||||
Just _ -> (False,concatMap (snd . cks) ts)
|
||||
Nothing -> case unzip (map cks ts) of
|
||||
(bs,_) | and bs -> (True, [t])
|
||||
(_,cts) -> (False,concat cts)
|
||||
|
||||
subtrees :: Expr -> [Expr]
|
||||
subtrees t = t : case unApp t of
|
||||
Just (f,ts) -> concatMap subtrees ts
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module GF.Compile (compileToPGF, link, batchCompile, srcAbsName) where
|
||||
|
||||
import GF.Compile.GrammarToPGF(mkCanon2pgf)
|
||||
import GF.Compile.GrammarToPGF(grammar2PGF)
|
||||
import GF.Compile.ReadFiles(ModEnv,getOptionsFromFile,getAllFiles,
|
||||
importsOfModule)
|
||||
import GF.CompileOne(compileOne)
|
||||
@@ -14,7 +14,7 @@ import GF.Infra.UseIO(IOE,FullPath,liftIO,getLibraryDirectory,putIfVerb,
|
||||
justModuleName,extendPathEnv,putStrE,putPointE)
|
||||
import GF.Data.Operations(raise,(+++),err)
|
||||
|
||||
import Control.Monad(foldM,when,(<=<),filterM,liftM)
|
||||
import Control.Monad(foldM,when,(<=<))
|
||||
import GF.System.Directory(doesFileExist,getModificationTime)
|
||||
import System.FilePath((</>),isRelative,dropFileName)
|
||||
import qualified Data.Map as Map(empty,insert,elems) --lookup
|
||||
@@ -22,8 +22,7 @@ import Data.List(nub)
|
||||
import Data.Time(UTCTime)
|
||||
import GF.Text.Pretty(render,($$),(<+>),nest)
|
||||
|
||||
import PGF.Internal(optimizePGF)
|
||||
import PGF(PGF,defaultProbabilities,setProbabilities,readProbabilitiesFromFile)
|
||||
import PGF2(PGF,readProbabilitiesFromFile)
|
||||
|
||||
-- | Compiles a number of source files and builds a 'PGF' structure for them.
|
||||
-- This is a composition of 'link' and 'batchCompile'.
|
||||
@@ -36,11 +35,10 @@ link :: Options -> (ModuleName,Grammar) -> IOE PGF
|
||||
link opts (cnc,gr) =
|
||||
putPointE Normal opts "linking ... " $ do
|
||||
let abs = srcAbsName gr cnc
|
||||
pgf <- mkCanon2pgf opts gr abs
|
||||
probs <- liftIO (maybe (return . defaultProbabilities) readProbabilitiesFromFile (flag optProbsFile opts) pgf)
|
||||
probs <- liftIO (maybe (return Map.empty) readProbabilitiesFromFile (flag optProbsFile opts))
|
||||
pgf <- grammar2PGF opts gr abs probs
|
||||
when (verbAtLeast opts Normal) $ putStrE "OK"
|
||||
return $ setProbabilities probs
|
||||
$ if flag optOptimizePGF opts then optimizePGF pgf else pgf
|
||||
return pgf
|
||||
|
||||
-- | Returns the name of the abstract syntax corresponding to the named concrete syntax
|
||||
srcAbsName gr cnc = err (const cnc) id $ abstractOfConcrete gr cnc
|
||||
@@ -78,14 +76,10 @@ compileModule opts1 env@(_,rfs) file =
|
||||
do file <- getRealFile file
|
||||
opts0 <- getOptionsFromFile file
|
||||
let curr_dir = dropFileName file
|
||||
lib_dirs <- getLibraryDirectory (addOptions opts0 opts1)
|
||||
let opts = addOptions (fixRelativeLibPaths curr_dir lib_dirs opts0) opts1
|
||||
-- putIfVerb opts $ "curr_dir:" +++ show curr_dir ----
|
||||
-- putIfVerb opts $ "lib_dir:" +++ show lib_dirs ----
|
||||
lib_dir <- getLibraryDirectory (addOptions opts0 opts1)
|
||||
let opts = addOptions (fixRelativeLibPaths curr_dir lib_dir opts0) opts1
|
||||
ps0 <- extendPathEnv opts
|
||||
let ps = nub (curr_dir : ps0)
|
||||
-- putIfVerb opts $ "options from file: " ++ show opts0
|
||||
-- putIfVerb opts $ "augmented options: " ++ show opts
|
||||
putIfVerb opts $ "module search path:" +++ show ps ----
|
||||
files <- getAllFiles opts ps rfs file
|
||||
putIfVerb opts $ "files to read:" +++ show files ----
|
||||
@@ -98,17 +92,13 @@ compileModule opts1 env@(_,rfs) file =
|
||||
if exists
|
||||
then return file
|
||||
else if isRelative file
|
||||
then do
|
||||
lib_dirs <- getLibraryDirectory opts1
|
||||
let candidates = [ lib_dir </> file | lib_dir <- lib_dirs ]
|
||||
putIfVerb opts1 (render ("looking for: " $$ nest 2 candidates))
|
||||
file1s <- filterM doesFileExist candidates
|
||||
case length file1s of
|
||||
0 -> raise (render ("Unable to find: " $$ nest 2 candidates))
|
||||
1 -> do return $ head file1s
|
||||
_ -> do putIfVerb opts1 ("matched multiple candidates: " +++ show file1s)
|
||||
return $ head file1s
|
||||
else raise (render ("File" <+> file <+> "does not exist"))
|
||||
then do lib_dir <- getLibraryDirectory opts1
|
||||
let file1 = lib_dir </> file
|
||||
exists <- doesFileExist file1
|
||||
if exists
|
||||
then return file1
|
||||
else raise (render ("None of these files exists:" $$ nest 2 (file $$ file1)))
|
||||
else raise (render ("File" <+> file <+> "does not exist."))
|
||||
|
||||
compileOne' :: Options -> CompileEnv -> FullPath -> IOE CompileEnv
|
||||
compileOne' opts env@(gr,_) = extendCompileEnv env <=< compileOne opts gr
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user