forked from GitHub/gf-core
Compare commits
823 Commits
remove-exa
...
try-to-bui
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec4625bc88 | ||
|
|
1166a49c26 | ||
|
|
64803cdd57 | ||
|
|
de1575cd31 | ||
|
|
32d73278af | ||
|
|
837e691643 | ||
|
|
0f4d13dd20 | ||
|
|
278397db20 | ||
|
|
f31a3496f5 | ||
|
|
b753912689 | ||
|
|
000fab7b52 | ||
|
|
fa2826d29a | ||
|
|
9325c8f9fb | ||
|
|
57dc5e9098 | ||
|
|
b42b0caa34 | ||
|
|
3ecb75d7d8 | ||
|
|
2b876b1aac | ||
|
|
5935119050 | ||
|
|
489424a1c6 | ||
|
|
9c72994c2b | ||
|
|
17ebcac84f | ||
|
|
7d018dde62 | ||
|
|
4dba12c0ce | ||
|
|
5ca230dd2a | ||
|
|
242cdcfa22 | ||
|
|
052916b454 | ||
|
|
d07646e753 | ||
|
|
3b69a28dbd | ||
|
|
aa004246d2 | ||
|
|
7c6f53d003 | ||
|
|
a6d5d9a50c | ||
|
|
7792c3cc90 | ||
|
|
a7d73a6861 | ||
|
|
646cfbea0c | ||
|
|
7ddb61eb48 | ||
|
|
dcae5f929e | ||
|
|
638ed39fa4 | ||
|
|
726fb3467c | ||
|
|
b02bb08532 | ||
|
|
c7e26d7cd2 | ||
|
|
4fea7cf37f | ||
|
|
9e5701b13c | ||
|
|
78beac7598 | ||
|
|
f96830f7de | ||
|
|
1c4cde7c66 | ||
|
|
e0ad7594dd | ||
|
|
a218903a2d | ||
|
|
f1c1d157b6 | ||
|
|
e7c0b6dada | ||
|
|
8f4e8c73d2 | ||
|
|
d983255326 | ||
|
|
288984d243 | ||
|
|
c23a03a2d1 | ||
|
|
183e421a0f | ||
|
|
3e0c0fa463 | ||
|
|
c2431e06b2 | ||
|
|
eeab15bee1 | ||
|
|
b36b95c4d6 | ||
|
|
2627e73b63 | ||
|
|
e2ff43da0b | ||
|
|
af09351b66 | ||
|
|
8c89ba4e76 | ||
|
|
218c61b004 | ||
|
|
52df0ed4fe | ||
|
|
2324fe795c | ||
|
|
703b1e5d92 | ||
|
|
f1a72a066f | ||
|
|
6f9f9642d7 | ||
|
|
f5752b345a | ||
|
|
5170668ff2 | ||
|
|
65e85c5a3c | ||
|
|
01c4f82e07 | ||
|
|
e81d668605 | ||
|
|
155b9da861 | ||
|
|
ab0f09e9f7 | ||
|
|
9fa8ac934a | ||
|
|
e84826ed2a | ||
|
|
bbf12458c7 | ||
|
|
b914a25de3 | ||
|
|
1037b209ae | ||
|
|
981d6b9bdd | ||
|
|
5776b567a2 | ||
|
|
643617ccc4 | ||
|
|
41f45e572b | ||
|
|
c7226cc11c | ||
|
|
bc56b54dd1 | ||
|
|
aa061aff0c | ||
|
|
934afc9655 | ||
|
|
33b0bab610 | ||
|
|
9492967fc6 | ||
|
|
5eab0a626d | ||
|
|
fc614cd48e | ||
|
|
eaec428a89 | ||
|
|
ed0a8ca0df | ||
|
|
c65dc70aaf | ||
|
|
2a654c085f | ||
|
|
b855a094f8 | ||
|
|
2f31bbab23 | ||
|
|
7e707508a7 | ||
|
|
c2182274df | ||
|
|
e11017abc0 | ||
|
|
b59fe24c11 | ||
|
|
9204884463 | ||
|
|
2c98075a0b | ||
|
|
7d9015e2e1 | ||
|
|
cf1ef40789 | ||
|
|
37f06a4ae8 | ||
|
|
30c1376232 | ||
|
|
ea3cef46b0 | ||
|
|
268a25f59c | ||
|
|
318b710a14 | ||
|
|
b90666455e | ||
|
|
88db715c3d | ||
|
|
003ab57576 | ||
|
|
ffd7b27abd | ||
|
|
096b36c21d | ||
|
|
86af7b12b3 | ||
|
|
e2c2763d59 | ||
|
|
fae2fc4c6c | ||
|
|
5131fadd1f | ||
|
|
0e1cbfaa7e | ||
|
|
95e5976b03 | ||
|
|
9dee033e2c | ||
|
|
83a4a0525e | ||
|
|
f58697f31f | ||
|
|
8f6dc916b6 | ||
|
|
6a36b486fa | ||
|
|
8190d9fe49 | ||
|
|
527a4451d3 | ||
|
|
2c13f529f9 | ||
|
|
8b82f1ab33 | ||
|
|
7bcc70e79d | ||
|
|
85038d0175 | ||
|
|
6edd449d68 | ||
|
|
a58c6d49d4 | ||
|
|
fef7b80d8e | ||
|
|
03df25bb7a | ||
|
|
3122590e35 | ||
|
|
0a16b76875 | ||
|
|
51b7117a3d | ||
|
|
fef03e755b | ||
|
|
223f92d4f6 | ||
|
|
83483b93ba | ||
|
|
dc8dce90a0 | ||
|
|
e9bbd38f68 | ||
|
|
3fac8415ca | ||
|
|
1294269cd6 | ||
|
|
3acb7d2da4 | ||
|
|
08fb29e6b8 | ||
|
|
f69babef6d | ||
|
|
a42cec2107 | ||
|
|
4d446fcd3f | ||
|
|
ae460e76b6 | ||
|
|
65308861bc | ||
|
|
b7672b67a3 | ||
|
|
e33de168fd | ||
|
|
fc5b3e9037 | ||
|
|
9b9905c0b2 | ||
|
|
ec70e4a83e | ||
|
|
e6ade90679 | ||
|
|
6414bc8923 | ||
|
|
b0b2a06f3b | ||
|
|
221597bd79 | ||
|
|
862aeb5d9b | ||
|
|
25dd1354c7 | ||
|
|
b762e24a82 | ||
|
|
20453193fe | ||
|
|
b53a102c98 | ||
|
|
bc14a56f83 | ||
|
|
3a1213ab37 | ||
|
|
1b41e94f83 | ||
|
|
308f4773dc | ||
|
|
05fc093b5e | ||
|
|
4caf6d684e | ||
|
|
bfd8f9c16d | ||
|
|
aefac84670 | ||
|
|
9f2a3de7a3 | ||
|
|
e4b2f281d9 | ||
|
|
063c517f3c | ||
|
|
bedb46527d | ||
|
|
0258a87257 | ||
|
|
ef0e831c9e | ||
|
|
8ec13b1030 | ||
|
|
058526ec5d | ||
|
|
974e8b0835 | ||
|
|
bbe4682c3d | ||
|
|
e477ce4b1f | ||
|
|
7a63ba34b4 | ||
|
|
723bec1ba0 | ||
|
|
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 | ||
|
|
30eef61f0a | ||
|
|
29662350dc | ||
|
|
4d79aa8b19 | ||
|
|
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 | ||
|
|
f7dc9a6eaf | ||
|
|
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
|
: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
|
||||||
|
|||||||
108
.github/workflows/build-all-versions.yml
vendored
Normal file
108
.github/workflows/build-all-versions.yml
vendored
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
# 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:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
cabal: ["latest"]
|
||||||
|
ghc:
|
||||||
|
- "8.6.5"
|
||||||
|
- "8.8.3"
|
||||||
|
- "8.10.7"
|
||||||
|
- "9.6.7"
|
||||||
|
exclude:
|
||||||
|
- os: macos-latest
|
||||||
|
ghc: 8.8.3
|
||||||
|
- os: macos-latest
|
||||||
|
ghc: 8.6.5
|
||||||
|
- os: macos-latest
|
||||||
|
ghc: 8.10.7
|
||||||
|
- os: windows-latest
|
||||||
|
ghc: 8.8.3
|
||||||
|
- os: windows-latest
|
||||||
|
ghc: 8.6.5
|
||||||
|
- os: windows-latest
|
||||||
|
ghc: 8.10.7
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
||||||
|
|
||||||
|
- uses: haskell-actions/setup@v2
|
||||||
|
id: setup-haskell-cabal
|
||||||
|
name: Setup Haskell
|
||||||
|
with:
|
||||||
|
ghc-version: ${{ matrix.ghc }}
|
||||||
|
cabal-version: ${{ matrix.cabal }}
|
||||||
|
|
||||||
|
- name: Freeze
|
||||||
|
run: |
|
||||||
|
cabal freeze
|
||||||
|
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
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: ${{ matrix.ghc == '7.10.3' && 'ubuntu-20.04' || 'ubuntu-latest' }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
stack: ["latest"]
|
||||||
|
ghc: ["8.4.4", "8.6.5", "8.8.4", "8.10.7", "9.0.2", "9.6.7"]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
||||||
|
|
||||||
|
- uses: haskell-actions/setup@v2
|
||||||
|
name: Setup Haskell Stack
|
||||||
|
with:
|
||||||
|
ghc-version: ${{ matrix.ghc }}
|
||||||
|
stack-version: 'latest'
|
||||||
|
enable-stack: true
|
||||||
|
|
||||||
|
|
||||||
|
# Fix linker errrors on ghc-7.10.3 for ubuntu (see https://github.com/commercialhaskell/stack/blob/255cd830627870cdef34b5e54d670ef07882523e/doc/faq.md#i-get-strange-ld-errors-about-recompiling-with--fpic)
|
||||||
|
- run: sed -i.bak 's/"C compiler link flags", "/&-no-pie /' /home/runner/.ghcup/ghc/7.10.3/lib/ghc-7.10.3/settings
|
||||||
|
if: matrix.ghc == '7.10.3'
|
||||||
|
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
name: Cache ~/.stack
|
||||||
|
with:
|
||||||
|
path: ~/.stack
|
||||||
|
key: ${{ runner.os }}-${{ matrix.ghc }}-stack--${{ hashFiles(format('stack-ghc{0}', matrix.ghc)) }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-${{ matrix.ghc }}-stack
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
stack build --test --no-run-tests --system-ghc --stack-yaml stack-ghc${{ matrix.ghc }}.yaml
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: |
|
||||||
|
stack test --system-ghc --stack-yaml stack-ghc${{ matrix.ghc }}.yaml
|
||||||
240
.github/workflows/build-binary-packages.yml
vendored
Normal file
240
.github/workflows/build-binary-packages.yml
vendored
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
name: Build Binary Packages
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
release:
|
||||||
|
types: ["created"]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# ---
|
||||||
|
|
||||||
|
ubuntu:
|
||||||
|
name: Build Ubuntu package
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
ghc: ["9.6"]
|
||||||
|
cabal: ["3.10"]
|
||||||
|
os: ["ubuntu-24.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: haskell-actions/setup@v2
|
||||||
|
id: setup-haskell-cabal
|
||||||
|
with:
|
||||||
|
ghc-version: ${{ matrix.ghc }}
|
||||||
|
cabal-version: ${{ matrix.cabal }}
|
||||||
|
if: matrix.os == 'ubuntu-24.04'
|
||||||
|
|
||||||
|
- name: Install build tools
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
make \
|
||||||
|
dpkg-dev \
|
||||||
|
debhelper \
|
||||||
|
libghc-json-dev \
|
||||||
|
default-jdk \
|
||||||
|
python-dev-is-python3 \
|
||||||
|
libtool-bin
|
||||||
|
cabal install alex happy
|
||||||
|
|
||||||
|
- name: Build package
|
||||||
|
run: |
|
||||||
|
export PYTHONPATH="/home/runner/work/gf-core/gf-core/debian/gf/usr/local/lib/python3.12/dist-packages/"
|
||||||
|
make deb
|
||||||
|
|
||||||
|
- name: Copy package
|
||||||
|
run: |
|
||||||
|
cp ../gf_*.deb dist/
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
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: ["9.6"]
|
||||||
|
cabal: ["3.10"]
|
||||||
|
os: ["macos-latest", "macos-13"]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup Haskell
|
||||||
|
uses: haskell-actions/setup@v2
|
||||||
|
id: setup-haskell-cabal
|
||||||
|
with:
|
||||||
|
ghc-version: ${{ matrix.ghc }}
|
||||||
|
cabal-version: ${{ matrix.cabal }}
|
||||||
|
|
||||||
|
- name: Install build tools
|
||||||
|
run: |
|
||||||
|
brew install \
|
||||||
|
automake \
|
||||||
|
libtool
|
||||||
|
cabal v1-install alex happy
|
||||||
|
pip install setuptools
|
||||||
|
|
||||||
|
- 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@v4
|
||||||
|
with:
|
||||||
|
name: gf-${{ github.event.release.tag_name }}-${{ matrix.os }}
|
||||||
|
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: ["9.6.7"]
|
||||||
|
cabal: ["3.10"]
|
||||||
|
os: ["windows-2022"]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup MSYS2
|
||||||
|
uses: msys2/setup-msys2@v2
|
||||||
|
with:
|
||||||
|
install: >-
|
||||||
|
base-devel
|
||||||
|
gcc
|
||||||
|
python-devel
|
||||||
|
autotools
|
||||||
|
|
||||||
|
- 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: |
|
||||||
|
echo $JAVA_HOME_8_X64
|
||||||
|
export JDKPATH="$(cygpath -u "${JAVA_HOME_8_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
|
||||||
|
if: false
|
||||||
|
|
||||||
|
# - uses: actions/setup-python@v5
|
||||||
|
|
||||||
|
- name: Build Python bindings
|
||||||
|
shell: msys2 {0}
|
||||||
|
env:
|
||||||
|
EXTRA_INCLUDE_DIRS: /mingw64/include
|
||||||
|
EXTRA_LIB_DIRS: /mingw64/lib
|
||||||
|
run: |
|
||||||
|
cd src/runtime/python
|
||||||
|
pacman --noconfirm -S python-setuptools
|
||||||
|
python setup.py build
|
||||||
|
python setup.py install
|
||||||
|
cp -r /usr/lib/python3.12/site-packages/pgf* /c/tmp-dist/python
|
||||||
|
|
||||||
|
- name: Setup Haskell
|
||||||
|
uses: haskell-actions/setup@v2
|
||||||
|
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 -fserver --only-dependencies
|
||||||
|
cabal configure -fserver
|
||||||
|
cabal build
|
||||||
|
copy dist-newstyle/build/x86_64-windows/ghc-${{matrix.ghc}}/*/x/gf/build/gf/gf.exe C:/tmp-dist
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
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
|
||||||
109
.github/workflows/build-python-package.yml
vendored
Normal file
109
.github/workflows/build-python-package.yml
vendored
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
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,try-to-build-python-module-for-win]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_wheels:
|
||||||
|
name: Build wheel on ${{ matrix.os }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest, macos-13, windows-latest]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
name: Install Python
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
|
||||||
|
- name: Install cibuildwheel
|
||||||
|
run: |
|
||||||
|
python -m pip install cibuildwheel
|
||||||
|
|
||||||
|
- name: Install build tools for OSX
|
||||||
|
if: startsWith(matrix.os, 'macos')
|
||||||
|
run: |
|
||||||
|
brew install automake
|
||||||
|
brew install libtool
|
||||||
|
|
||||||
|
- name: Build wheels on Linux
|
||||||
|
if: startsWith(matrix.os, 'ubuntu')
|
||||||
|
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 && sudo make install
|
||||||
|
run: |
|
||||||
|
python -m cibuildwheel src/runtime/python --output-dir wheelhouse
|
||||||
|
|
||||||
|
- name: Build wheels on Windows
|
||||||
|
if: startsWith(matrix.os, 'windows')
|
||||||
|
# env:
|
||||||
|
# CIBW_BEFORE_BUILD: cd src/runtime/c && glibtoolize && autoreconf -i && ./configure && make && sudo make install
|
||||||
|
run: |
|
||||||
|
python -m cibuildwheel src/runtime/python --output-dir wheelhouse
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: wheel-${{ matrix.os }}
|
||||||
|
path: ./wheelhouse
|
||||||
|
|
||||||
|
# build_sdist:
|
||||||
|
# name: Build source distribution
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# - uses: actions/setup-python@v5
|
||||||
|
# name: Install Python
|
||||||
|
# with:
|
||||||
|
# python-version: '3.10'
|
||||||
|
|
||||||
|
# - name: Build sdist
|
||||||
|
# run: cd src/runtime/python && python setup.py sdist
|
||||||
|
|
||||||
|
# - uses: actions/upload-artifact@v4
|
||||||
|
# with:
|
||||||
|
# name: wheel-source
|
||||||
|
# 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@v4
|
||||||
|
|
||||||
|
# - name: Set up Python
|
||||||
|
# uses: actions/setup-python@v5
|
||||||
|
# with:
|
||||||
|
# python-version: '3.x'
|
||||||
|
|
||||||
|
# - name: Install twine
|
||||||
|
# run: pip install twine
|
||||||
|
|
||||||
|
# - uses: actions/download-artifact@v4.1.7
|
||||||
|
# with:
|
||||||
|
# pattern: wheel-*
|
||||||
|
# merge-multiple: true
|
||||||
|
# path: ./dist
|
||||||
|
|
||||||
|
# - name: Publish
|
||||||
|
# env:
|
||||||
|
# TWINE_USERNAME: __token__
|
||||||
|
# TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
|
||||||
|
# run: |
|
||||||
|
# twine upload --verbose --non-interactive --skip-existing dist/*
|
||||||
36
.gitignore
vendored
36
.gitignore
vendored
@@ -5,7 +5,14 @@
|
|||||||
*.jar
|
*.jar
|
||||||
*.gfo
|
*.gfo
|
||||||
*.pgf
|
*.pgf
|
||||||
|
debian/.debhelper
|
||||||
|
debian/debhelper-build-stamp
|
||||||
|
debian/gf
|
||||||
|
debian/gf.debhelper.log
|
||||||
|
debian/gf.substvars
|
||||||
|
debian/files
|
||||||
dist/
|
dist/
|
||||||
|
dist-newstyle/
|
||||||
src/runtime/c/.libs/
|
src/runtime/c/.libs/
|
||||||
src/runtime/c/Makefile
|
src/runtime/c/Makefile
|
||||||
src/runtime/c/Makefile.in
|
src/runtime/c/Makefile.in
|
||||||
@@ -43,3 +50,32 @@ src/runtime/python/build/
|
|||||||
cabal.sandbox.config
|
cabal.sandbox.config
|
||||||
.stack-work
|
.stack-work
|
||||||
DATA_DIR
|
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
|
||||||
|
.devenv
|
||||||
|
.direnv
|
||||||
|
result
|
||||||
|
.vscode
|
||||||
|
.envrc
|
||||||
|
.pre-commit-config.yaml
|
||||||
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'"
|
|
||||||
12
CHANGELOG.md
Normal file
12
CHANGELOG.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
### New since 3.12 (WIP)
|
||||||
|
|
||||||
|
### 3.12
|
||||||
|
See <https://www.grammaticalframework.org/download/release-3.12.html>
|
||||||
|
|
||||||
|
### 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
|
# This gets the numeric part of the version from the cabal file
|
||||||
VERSION=$(shell sed -ne "s/^version: *\([0-9.]*\).*/\1/p" gf.cabal)
|
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
|
all: build
|
||||||
|
|
||||||
dist/setup-config: gf.cabal Setup.hs WebSetup.hs
|
dist/setup-config: gf.cabal Setup.hs WebSetup.hs
|
||||||
cabal configure
|
ifneq ($(STACK),1)
|
||||||
|
cabal ${CMD_PFX}configure
|
||||||
|
endif
|
||||||
|
|
||||||
build: dist/setup-config
|
build: dist/setup-config
|
||||||
cabal build
|
${CMD} ${CMD_PFX}build
|
||||||
|
|
||||||
install:
|
install:
|
||||||
cabal copy
|
ifeq ($(STACK),1)
|
||||||
cabal register
|
stack install
|
||||||
|
else
|
||||||
|
cabal ${CMD_PFX}copy
|
||||||
|
cabal ${CMD_PFX}register
|
||||||
|
endif
|
||||||
|
|
||||||
doc:
|
doc:
|
||||||
cabal haddock
|
${CMD} ${CMD_PFX}haddock
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
cabal clean
|
${CMD} ${CMD_PFX}clean
|
||||||
|
bash bin/clean_html
|
||||||
gf:
|
|
||||||
cabal build rgl-none
|
|
||||||
strip dist/build/gf/gf
|
|
||||||
|
|
||||||
html::
|
html::
|
||||||
bash bin/update_html
|
bash bin/update_html
|
||||||
@@ -32,9 +50,9 @@ html::
|
|||||||
# number to the top of debian/changelog.
|
# number to the top of debian/changelog.
|
||||||
# (Tested on Ubuntu 15.04. You need to install dpkg-dev & debhelper.)
|
# (Tested on Ubuntu 15.04. You need to install dpkg-dev & debhelper.)
|
||||||
deb:
|
deb:
|
||||||
dpkg-buildpackage -b
|
dpkg-buildpackage -b -uc -d
|
||||||
|
|
||||||
# Make an OS X Installer package
|
# Make a macOS installer package
|
||||||
pkg:
|
pkg:
|
||||||
FMT=pkg bash bin/build-binary-dist.sh
|
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.
|
# 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`
|
# We put the distribution in dist/ so it is removed on `make clean`
|
||||||
sdist:
|
# sdist:
|
||||||
test -d dist || mkdir dist
|
# test -d dist || mkdir dist
|
||||||
git archive --format=tar.gz --output=dist/gf-${VERSION}.tar.gz HEAD
|
# git archive --format=tar.gz --output=dist/gf-${VERSION}.tar.gz HEAD
|
||||||
|
|||||||
31
README.md
31
README.md
@@ -1,9 +1,7 @@
|
|||||||

|

|
||||||
|
|
||||||
# Grammatical Framework (GF)
|
# Grammatical Framework (GF)
|
||||||
|
|
||||||
[](https://travis-ci.org/GrammaticalFramework/gf-core)
|
|
||||||
|
|
||||||
The Grammatical Framework is a grammar formalism based on type theory.
|
The Grammatical Framework is a grammar formalism based on type theory.
|
||||||
It consists of:
|
It consists of:
|
||||||
|
|
||||||
@@ -32,20 +30,31 @@ GF particularly addresses four aspects of grammars:
|
|||||||
|
|
||||||
## Compilation and installation
|
## 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
|
cabal install
|
||||||
```
|
```
|
||||||
|
or:
|
||||||
This can be broken down into the usual sub-steps:
|
|
||||||
```
|
```
|
||||||
cabal configure
|
stack install
|
||||||
cabal build
|
|
||||||
cabal copy
|
|
||||||
```
|
```
|
||||||
|
Note that if you are unlucky to have Cabal 3.0 or later, then it uses
|
||||||
|
the so-called Nix style commands. Using those for GF development is
|
||||||
|
a pain. Every time when you change something in the source code, Cabal
|
||||||
|
will generate a new folder for GF to look for the GF libraries and
|
||||||
|
the GF cloud. Either reinstall everything with every change in the
|
||||||
|
compiler, or be sane and stop using cabal-install. Instead you can do:
|
||||||
|
```
|
||||||
|
runghc Setup.hs configure
|
||||||
|
runghc Setup.hs build
|
||||||
|
sudo runghc Setup.hs install
|
||||||
|
```
|
||||||
|
The script will install the GF dependencies globally. The only solution
|
||||||
|
to the Nix madness that I found is radical:
|
||||||
|
|
||||||
For more details, see the [download page](http://www.grammaticalframework.org/download/index.html)
|
"No person, no problem" (Нет человека – нет проблемы).
|
||||||
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
|
## 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.
|
||||||
87
Setup.hs
87
Setup.hs
@@ -1,45 +1,71 @@
|
|||||||
|
import Distribution.System(Platform(..),OS(..))
|
||||||
import Distribution.Simple(defaultMainWithHooks,UserHooks(..),simpleUserHooks)
|
import Distribution.Simple(defaultMainWithHooks,UserHooks(..),simpleUserHooks)
|
||||||
import Distribution.Simple.LocalBuildInfo(LocalBuildInfo(..),absoluteInstallDirs,datadir)
|
import Distribution.Simple.LocalBuildInfo(LocalBuildInfo(..),absoluteInstallDirs,datadir)
|
||||||
import Distribution.Simple.Setup(BuildFlags(..),Flag(..),InstallFlags(..),CopyDest(..),CopyFlags(..),SDistFlags(..))
|
import Distribution.Simple.Setup(BuildFlags(..),Flag(..),InstallFlags(..),CopyDest(..),CopyFlags(..),SDistFlags(..))
|
||||||
import Distribution.PackageDescription(PackageDescription(..),emptyHookedBuildInfo)
|
import Distribution.PackageDescription(PackageDescription(..),emptyHookedBuildInfo)
|
||||||
import Distribution.Simple.BuildPaths(exeExtension)
|
import Distribution.Simple.BuildPaths(exeExtension)
|
||||||
|
import System.Directory
|
||||||
import System.FilePath((</>),(<.>))
|
import System.FilePath((</>),(<.>))
|
||||||
|
import System.Process
|
||||||
|
import Control.Monad(forM_,unless)
|
||||||
|
import Control.Exception(bracket_)
|
||||||
|
import Data.Char(isSpace)
|
||||||
|
|
||||||
import WebSetup
|
import WebSetup
|
||||||
|
|
||||||
-- | Notice about RGL not built anymore
|
|
||||||
noRGLmsg :: IO ()
|
|
||||||
noRGLmsg = putStrLn "Notice: the RGL is not built as part of GF anymore. See https://github.com/GrammaticalFramework/gf-rgl"
|
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = defaultMainWithHooks simpleUserHooks
|
main = defaultMainWithHooks simpleUserHooks
|
||||||
{ preBuild = gfPreBuild
|
{ preConf = gfPreConf
|
||||||
|
, preBuild = gfPreBuild
|
||||||
, postBuild = gfPostBuild
|
, postBuild = gfPostBuild
|
||||||
, preInst = gfPreInst
|
, preInst = gfPreInst
|
||||||
, postInst = gfPostInst
|
, postInst = gfPostInst
|
||||||
, postCopy = gfPostCopy
|
, postCopy = gfPostCopy
|
||||||
, sDistHook = gfSDist
|
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
gfPreBuild args = gfPre args . buildDistPref
|
gfPreConf args flags = do
|
||||||
gfPreInst args = gfPre args . installDistPref
|
pkgs <- fmap (map (dropWhile isSpace) . tail . lines)
|
||||||
|
(readProcess "ghc-pkg" ["list"] "")
|
||||||
|
forM_ dependencies $ \pkg -> do
|
||||||
|
let name = takeWhile (/='/') (drop 36 pkg)
|
||||||
|
unless (name `elem` pkgs) $ do
|
||||||
|
let fname = name <.> ".tar.gz"
|
||||||
|
callProcess "wget" [pkg,"-O",fname]
|
||||||
|
callProcess "tar" ["-xzf",fname]
|
||||||
|
removeFile fname
|
||||||
|
bracket_ (setCurrentDirectory name) (setCurrentDirectory ".." >> removeDirectoryRecursive name) $ do
|
||||||
|
exists <- doesFileExist "Setup.hs"
|
||||||
|
unless exists $ do
|
||||||
|
writeFile "Setup.hs" (unlines [
|
||||||
|
"import Distribution.Simple",
|
||||||
|
"main = defaultMain"
|
||||||
|
])
|
||||||
|
let to_descr = reverse .
|
||||||
|
(++) (reverse ".cabal") .
|
||||||
|
drop 1 .
|
||||||
|
dropWhile (/='-') .
|
||||||
|
reverse
|
||||||
|
callProcess "wget" [to_descr pkg, "-O", to_descr name]
|
||||||
|
callProcess "runghc" ["Setup.hs","configure"]
|
||||||
|
callProcess "runghc" ["Setup.hs","build"]
|
||||||
|
callProcess "sudo" ["runghc","Setup.hs","install"]
|
||||||
|
|
||||||
|
preConf simpleUserHooks args flags
|
||||||
|
|
||||||
|
gfPreBuild args = gfPre args . buildDistPref
|
||||||
|
gfPreInst args = gfPre args . installDistPref
|
||||||
|
|
||||||
gfPre args distFlag = do
|
gfPre args distFlag = do
|
||||||
return emptyHookedBuildInfo
|
return emptyHookedBuildInfo
|
||||||
|
|
||||||
gfPostBuild args flags pkg lbi = do
|
gfPostBuild args flags pkg lbi = do
|
||||||
noRGLmsg
|
|
||||||
let gf = default_gf lbi
|
let gf = default_gf lbi
|
||||||
buildWeb gf flags (pkg,lbi)
|
buildWeb gf flags (pkg,lbi)
|
||||||
|
|
||||||
gfPostInst args flags pkg lbi = do
|
gfPostInst args flags pkg lbi = do
|
||||||
noRGLmsg
|
|
||||||
saveInstallPath args flags (pkg,lbi)
|
|
||||||
installWeb (pkg,lbi)
|
installWeb (pkg,lbi)
|
||||||
|
|
||||||
gfPostCopy args flags pkg lbi = do
|
gfPostCopy args flags pkg lbi = do
|
||||||
noRGLmsg
|
|
||||||
saveCopyPath args flags (pkg,lbi)
|
|
||||||
copyWeb flags (pkg,lbi)
|
copyWeb flags (pkg,lbi)
|
||||||
|
|
||||||
-- `cabal sdist` will not make a proper dist archive, for that see `make sdist`
|
-- `cabal sdist` will not make a proper dist archive, for that see `make sdist`
|
||||||
@@ -47,31 +73,24 @@ main = defaultMainWithHooks simpleUserHooks
|
|||||||
gfSDist pkg lbi hooks flags = do
|
gfSDist pkg lbi hooks flags = do
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
saveInstallPath :: [String] -> InstallFlags -> (PackageDescription, LocalBuildInfo) -> IO ()
|
dependencies = [
|
||||||
saveInstallPath args flags bi = do
|
"https://hackage.haskell.org/package/utf8-string-1.0.2/utf8-string-1.0.2.tar.gz",
|
||||||
let
|
"https://hackage.haskell.org/package/json-0.10/json-0.10.tar.gz",
|
||||||
dest = NoCopyDest
|
"https://hackage.haskell.org/package/network-bsd-2.8.1.0/network-bsd-2.8.1.0.tar.gz",
|
||||||
dir = datadir (uncurry absoluteInstallDirs bi dest)
|
"https://hackage.haskell.org/package/httpd-shed-0.4.1.1/httpd-shed-0.4.1.1.tar.gz",
|
||||||
writeFile dataDirFile dir
|
"https://hackage.haskell.org/package/exceptions-0.10.5/exceptions-0.10.5.tar.gz",
|
||||||
|
"https://hackage.haskell.org/package/stringsearch-0.3.6.6/stringsearch-0.3.6.6.tar.gz",
|
||||||
saveCopyPath :: [String] -> CopyFlags -> (PackageDescription, LocalBuildInfo) -> IO ()
|
"https://hackage.haskell.org/package/multipart-0.2.1/multipart-0.2.1.tar.gz",
|
||||||
saveCopyPath args flags bi = do
|
"https://hackage.haskell.org/package/cgi-3001.5.0.0/cgi-3001.5.0.0.tar.gz"
|
||||||
let
|
]
|
||||||
dest = case copyDest flags of
|
|
||||||
NoFlag -> NoCopyDest
|
|
||||||
Flag d -> d
|
|
||||||
dir = datadir (uncurry absoluteInstallDirs bi dest)
|
|
||||||
writeFile dataDirFile dir
|
|
||||||
|
|
||||||
-- | Name of file where installation's data directory is recording
|
|
||||||
-- This is a last-resort way in which the seprate RGL build script
|
|
||||||
-- can determine where to put the compiled RGL files
|
|
||||||
dataDirFile :: String
|
|
||||||
dataDirFile = "DATA_DIR"
|
|
||||||
|
|
||||||
-- | Get path to locally-built gf
|
-- | Get path to locally-built gf
|
||||||
default_gf :: LocalBuildInfo -> FilePath
|
default_gf :: LocalBuildInfo -> FilePath
|
||||||
default_gf lbi = buildDir lbi </> exeName' </> exeNameReal
|
default_gf lbi = buildDir lbi </> exeName' </> exeNameReal
|
||||||
where
|
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"
|
exeName' = "gf"
|
||||||
exeNameReal = exeName' <.> exeExtension
|
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.)
|
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 :: [(String, String, [String])] -- [(pgf, subdir, source modules)]
|
||||||
example_grammars =
|
example_grammars =
|
||||||
[("Letter.pgf","letter",letterSrc)
|
[("Letter.pgf","letter",letterSrc)
|
||||||
@@ -50,11 +58,8 @@ buildWeb gf flags (pkg,lbi) = do
|
|||||||
contrib_exists <- doesDirectoryExist contrib_dir
|
contrib_exists <- doesDirectoryExist contrib_dir
|
||||||
if contrib_exists
|
if contrib_exists
|
||||||
then mapM_ build_pgf example_grammars
|
then mapM_ build_pgf example_grammars
|
||||||
else putStr $ unlines
|
-- else noContribMsg
|
||||||
[ "Example grammars are no longer included in the main GF repository, but have moved to gf-contrib."
|
else return ()
|
||||||
, "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"
|
|
||||||
]
|
|
||||||
where
|
where
|
||||||
gfo_dir = buildDir lbi </> "examples"
|
gfo_dir = buildDir lbi </> "examples"
|
||||||
|
|
||||||
@@ -104,9 +109,10 @@ setupWeb dest (pkg,lbi) = do
|
|||||||
copy_pgf (pgf,subdir,_) =
|
copy_pgf (pgf,subdir,_) =
|
||||||
do let src = gfo_dir </> pgf
|
do let src = gfo_dir </> pgf
|
||||||
let dst = grammars_dir </> pgf
|
let dst = grammars_dir </> pgf
|
||||||
putStrLn $ "Installing "++dst
|
|
||||||
ex <- doesFileExist src
|
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"
|
gf_logo = "gf0.png"
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +1,38 @@
|
|||||||
#! /bin/bash
|
#! /bin/bash
|
||||||
|
|
||||||
### This script builds a binary distribution of GF from the source
|
### This script builds a binary distribution of GF from source.
|
||||||
### package that this script is a part of. It assumes that you have installed
|
### It assumes that you have Haskell and Cabal installed.
|
||||||
### the Haskell Platform, version 2013.2.0.0 or 2012.4.0.0.
|
### Two binary package formats are supported (specified with the FMT env var):
|
||||||
### Two binary package formats are supported: plain tar files (.tar.gz) and
|
### - plain tar files (.tar.gz)
|
||||||
### OS X Installer packages (.pkg).
|
### - macOS installer packages (.pkg)
|
||||||
|
|
||||||
os=$(uname) # Operating system name (e.g. Darwin or Linux)
|
os=$(uname) # Operating system name (e.g. Darwin or Linux)
|
||||||
hw=$(uname -m) # Hardware name (e.g. i686 or x86_64)
|
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')
|
ver=$(grep -i ^version: gf.cabal | sed -e 's/version://' -e 's/ //g')
|
||||||
|
|
||||||
name="gf-$ver"
|
name="gf-$ver"
|
||||||
destdir="$PWD/dist/$name" # assemble binary dist here
|
destdir="$PWD/dist/$name" # assemble binary dist here
|
||||||
prefix=${PREFIX:-/usr/local} # where to install
|
prefix=${PREFIX:-/usr/local} # where to install
|
||||||
fmt=${FMT:-tar.gz} # binary package format (tar.gz or pkg)
|
fmt=${FMT:-tar.gz} # binary package format (tar.gz or pkg)
|
||||||
|
ghc=${GHC:-ghc} # which Haskell compiler to use
|
||||||
|
|
||||||
extralib="$destdir$prefix/lib"
|
extralib="$destdir$prefix/lib"
|
||||||
extrainclude="$destdir$prefix/include"
|
extrainclude="$destdir$prefix/include"
|
||||||
extra="--extra-lib-dirs=$extralib --extra-include-dirs=$extrainclude"
|
extra="--extra-lib-dirs=$extralib --extra-include-dirs=$extrainclude"
|
||||||
|
|
||||||
set -e # Stop if an error occurs
|
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
|
## First configure & build the C run-time system
|
||||||
pushd src/runtime/c
|
pushd src/runtime/c
|
||||||
bash setup.sh configure --prefix="$prefix"
|
bash setup.sh configure --prefix="$prefix"
|
||||||
bash setup.sh build
|
bash setup.sh build
|
||||||
|
# bash setup.sh install prefix="$prefix" # hack required for GF build on macOS
|
||||||
bash setup.sh install prefix="$destdir$prefix"
|
bash setup.sh install prefix="$destdir$prefix"
|
||||||
popd
|
popd
|
||||||
|
|
||||||
@@ -37,11 +42,11 @@ if which >/dev/null python; then
|
|||||||
EXTRA_INCLUDE_DIRS="$extrainclude" EXTRA_LIB_DIRS="$extralib" python setup.py build
|
EXTRA_INCLUDE_DIRS="$extrainclude" EXTRA_LIB_DIRS="$extralib" python setup.py build
|
||||||
python setup.py install --prefix="$destdir$prefix"
|
python setup.py install --prefix="$destdir$prefix"
|
||||||
if [ "$fmt" == pkg ] ; then
|
if [ "$fmt" == pkg ] ; then
|
||||||
# A hack for Python on OS X to find the PGF modules
|
# A hack for Python on macOS to find the PGF modules
|
||||||
pyver=$(ls "$destdir$prefix/lib" | sed -n 's/^python//p')
|
pyver=$(ls "$destdir$prefix/lib" | sed -n 's/^python//p')
|
||||||
pydest="$destdir/Library/Python/$pyver/site-packages"
|
pydest="$destdir/Library/Python/$pyver/site-packages"
|
||||||
mkdir -p "$pydest"
|
mkdir -p "$pydest"
|
||||||
ln "$destdir$prefix/lib/python$pyver/site-packages"/pgf* "$pydest"
|
ln "$destdir$prefix/lib/python$pyver/site-packages"/pgf*.so "$pydest"
|
||||||
fi
|
fi
|
||||||
popd
|
popd
|
||||||
else
|
else
|
||||||
@@ -52,52 +57,42 @@ fi
|
|||||||
if which >/dev/null javac && which >/dev/null jar ; then
|
if which >/dev/null javac && which >/dev/null jar ; then
|
||||||
pushd src/runtime/java
|
pushd src/runtime/java
|
||||||
rm -f libjpgf.la # In case it contains the wrong INSTALL_PATH
|
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
|
then
|
||||||
make INSTALL_PATH="$destdir$prefix/lib" install
|
make INSTALL_PATH="$destdir$prefix" install
|
||||||
else
|
else
|
||||||
echo "*** Skipping the Java binding because of errors"
|
echo "Skipping the Java binding because of errors"
|
||||||
fi
|
fi
|
||||||
popd
|
popd
|
||||||
else
|
else
|
||||||
echo "Java SDK is not installed, so the Java binding will not be included"
|
echo "Java SDK is not installed, so the Java binding will not be included"
|
||||||
fi
|
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
|
## Build GF, with C run-time support enabled
|
||||||
cabal install --only-dependencies -fserver -fc-runtime $extra
|
${cabal}install -w "$ghc" --only-dependencies -fserver -fc-runtime $extra
|
||||||
cabal configure --prefix="$prefix" -fserver -fc-runtime $extra
|
${cabal}configure -w "$ghc" --prefix="$prefix" -fserver -fc-runtime $extra
|
||||||
DYLD_LIBRARY_PATH="$extralib" LD_LIBRARY_PATH="$extralib" cabal build
|
${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
|
|
||||||
|
|
||||||
## Copy GF to $destdir
|
## Copy GF to $destdir
|
||||||
cabal copy --destdir="$destdir"
|
${cabal}copy --destdir="$destdir"
|
||||||
libdir=$(dirname $(find "$destdir" -name PGF.hi))
|
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
|
## Create the binary distribution package
|
||||||
case $fmt in
|
case $fmt in
|
||||||
tar.gz)
|
tar.gz)
|
||||||
targz="$name-bin-$hw-$os.tar.gz" # the final tar file
|
targz="$name-bin-$hw-$os.tar.gz" # the final tar file
|
||||||
tar -C "$destdir/$prefix" -zcf "dist/$targz" .
|
tar --directory "$destdir/$prefix" --gzip --create --file "dist/$targz" .
|
||||||
echo "Created $targz, consider renaming it to something more user friendly"
|
echo "Created $targz"
|
||||||
;;
|
;;
|
||||||
pkg)
|
pkg)
|
||||||
pkg=$name.pkg
|
pkg=$name.pkg
|
||||||
pkgbuild --identifier org.grammaticalframework.gf.pkg --version "$ver" --root "$destdir" --install-location / dist/$pkg
|
pkgbuild --identifier org.grammaticalframework.gf.pkg --version "$ver" --root "$destdir" --install-location / dist/$pkg
|
||||||
echo "Created $pkg"
|
echo "Created $pkg"
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
## Cleanup
|
||||||
rm -r "$destdir"
|
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
|
#!/bin/bash
|
||||||
|
|
||||||
### This script finds all .t2t (txt2tags) files and updates the corresponding
|
# Generate HTML from txt2tags (.t2t) and Markdown (.md)
|
||||||
### .html file, if it is out-of-date.
|
# 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
|
# Path to directory where this script is
|
||||||
html="${t2t%.t2t}.html"
|
# https://stackoverflow.com/a/246128/98600
|
||||||
if [ "$t2t" -nt "$html" ] ; then
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
|
||||||
txt2tags -thtml "$t2t"
|
|
||||||
|
# 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
|
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
|
||||||
|
|||||||
35
debian/changelog
vendored
35
debian/changelog
vendored
@@ -1,3 +1,38 @@
|
|||||||
|
gf (3.12) noble; urgency=low
|
||||||
|
|
||||||
|
* GF 3.12
|
||||||
|
|
||||||
|
-- Inari Listenmaa <inari@digitalgrammars.com> Fri, 8 Aug 2025 18:29:29 +0100
|
||||||
|
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-1) vivid xenial zesty; urgency=low
|
||||||
|
|
||||||
* GF 3.9
|
* GF 3.9
|
||||||
|
|||||||
4
debian/control
vendored
4
debian/control
vendored
@@ -3,14 +3,14 @@ Section: devel
|
|||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: Thomas Hallgren <hallgren@chalmers.se>
|
Maintainer: Thomas Hallgren <hallgren@chalmers.se>
|
||||||
Standards-Version: 3.9.2
|
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), libghc-haskeline-dev, libghc-mtl-dev, libghc-json-dev, autoconf, automake, libtool-bin, python-dev-is-python3, java-sdk
|
||||||
Homepage: http://www.grammaticalframework.org/
|
Homepage: http://www.grammaticalframework.org/
|
||||||
|
|
||||||
Package: gf
|
Package: gf
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}
|
Depends: ${shlibs:Depends}
|
||||||
Description: Tools for GF, a grammar formalism based on type theory
|
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,
|
It consists of a special-purpose programming language,
|
||||||
a compiler of the language, and a generic grammar processor.
|
a compiler of the language, and a generic grammar processor.
|
||||||
.
|
.
|
||||||
|
|||||||
41
debian/rules
vendored
Normal file → Executable file
41
debian/rules
vendored
Normal file → Executable file
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
%:
|
%:
|
||||||
+dh $@
|
+dh $@
|
||||||
|
|
||||||
#dh_shlibdeps has a problem finding which package some of the Haskell
|
#dh_shlibdeps has a problem finding which package some of the Haskell
|
||||||
@@ -13,32 +13,35 @@
|
|||||||
override_dh_shlibdeps:
|
override_dh_shlibdeps:
|
||||||
dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
|
dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
override_dh_auto_clean:
|
|
||||||
rm -fr dist/build
|
|
||||||
-cd src/runtime/python && rm -fr build
|
|
||||||
-cd src/runtime/java && make clean
|
|
||||||
-cd src/runtime/c && make clean
|
|
||||||
|
|
||||||
override_dh_auto_configure:
|
override_dh_auto_configure:
|
||||||
cd src/runtime/c && bash setup.sh configure --prefix=/usr
|
cd src/runtime/c && bash setup.sh configure --prefix=/usr
|
||||||
cd src/runtime/c && bash setup.sh build
|
cd src/runtime/c && bash setup.sh build
|
||||||
cabal update
|
cabal update
|
||||||
cabal install --only-dependencies
|
cabal v1-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
|
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
|
||||||
|
echo $(SET_LDL)
|
||||||
|
-$(SET_LDL) cabal v1-build
|
||||||
|
|
||||||
override_dh_auto_install:
|
override_dh_auto_install:
|
||||||
LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(CURDIR)/src/runtime/c/.libs cabal copy --destdir=$(CURDIR)/debian/gf
|
$(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/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/python && python setup.py install --prefix=$(CURDIR)/debian/gf/usr
|
||||||
cd src/runtime/java && make INSTALL_PATH=$(CURDIR)/debian/gf/usr/lib install
|
# 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
|
# D="`find debian/gf -name dist-packages`" && [ -n "$$D" ] && cd $$D && cd .. && mv dist-packages dist-packages
|
||||||
|
|
||||||
|
override_dh_usrlocal:
|
||||||
|
|
||||||
|
override_dh_auto_clean:
|
||||||
|
rm -fr dist/build
|
||||||
|
-cd src/runtime/python && rm -fr build
|
||||||
|
# -cd src/runtime/java && make clean
|
||||||
|
-cd src/runtime/c && make clean
|
||||||
|
|
||||||
override_dh_auto_test:
|
override_dh_auto_test:
|
||||||
ifneq (nocheck,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
|
ifneq (nocheck,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
|
||||||
|
|||||||
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::
|
gf-help-full.txt::
|
||||||
{ echo ; echo ; echo ; } > $@
|
{ echo ; echo ; echo ; } > $@
|
||||||
echo help -full -t2t | gf -run >> $@
|
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
|
GF Developers Guide
|
||||||
Authors: Björn Bringert, Krasimir Angelov and Thomas Hallgren
|
|
||||||
Last update: %%mtime(%F, %H:%M)
|
|
||||||
|
|
||||||
% NOTE: this is a txt2tags file.
|
2021-07-15
|
||||||
% Create an html file from this file using:
|
|
||||||
% txt2tags -t html gf-developers.t2t
|
|
||||||
|
|
||||||
%!style:../css/style.css
|
|
||||||
%!target:html
|
|
||||||
%!options(html): --toc
|
%!options(html): --toc
|
||||||
%!encoding:utf-8
|
|
||||||
%!postproc(html): <H1> <H1><a href="../"><IMG src="../doc/Logos/gf0.png"></a>
|
|
||||||
|
|
||||||
== Before you start ==
|
== Before you start ==
|
||||||
|
|
||||||
@@ -23,398 +15,304 @@ you are a GF user who just wants to download and install GF
|
|||||||
== Setting up your system for building GF ==
|
== Setting up your system for building GF ==
|
||||||
|
|
||||||
To build GF from source you need to install some tools on your
|
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
|
%**On Linux** the best option is to install the tools via the standard
|
||||||
software distribution channels, i.e. by using the //Software Center//
|
%software distribution channels, i.e. by using the //Software Center//
|
||||||
in Ubuntu or the corresponding tool in other popular Linux distributions.
|
%in Ubuntu or the corresponding tool in other popular Linux distributions.
|
||||||
Or, from a Terminal window, the following command should be enough:
|
|
||||||
|
|
||||||
- On Ubuntu: ``sudo apt-get install haskell-platform git libghc6-haskeline-dev``
|
%**On Mac OS and Windows**, the tools can be downloaded from their respective
|
||||||
- On Fedora: ``sudo dnf install haskell-platform git ghc-haskeline-devel``
|
%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
|
- **On other operating systems**, see the [installation guide https://docs.haskellstack.org/en/stable/install_and_upgrade].
|
||||||
web sites, as described below.
|
|
||||||
|
|
||||||
=== The Haskell Platform ===
|
|
||||||
|
|
||||||
GF is written in Haskell, so first of all you need
|
%If you already have Stack installed, upgrade it to the latest version by running: ``stack upgrade``
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
=== Git ===
|
=== Git ===
|
||||||
|
|
||||||
To get the GF source code, you also need //Git//.
|
To get the GF source code, you also need //Git//, a distributed version control system.
|
||||||
//Git// is a distributed version control system, see
|
|
||||||
https://git-scm.com/downloads for more information.
|
|
||||||
|
|
||||||
=== 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.
|
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 Mac OS and Windows**, this should work automatically.
|
||||||
- On Fedora: ``sudo dnf install ghc-haskeline-devel``
|
|
||||||
|
- **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
|
Once you have all tools in place you can get the GF source code from
|
||||||
just want to compile and use GF then it is enough to have read-only
|
[GitHub https://github.com/GrammaticalFramework/]:
|
||||||
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.
|
|
||||||
|
|
||||||
=== 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-core.git
|
||||||
$ git clone https://github.com/GrammaticalFramework/gf-rgl.git
|
$ git clone https://github.com/GrammaticalFramework/gf-rgl.git
|
||||||
```
|
```
|
||||||
|
|
||||||
This will create directories ``gf-core`` and ``gf-rgl`` in the current directory.
|
To get new updates, run the following anywhere in your local copy of the repository:
|
||||||
|
|
||||||
|
|
||||||
==== 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:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ 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
|
+ **Updating your copy —**
|
||||||
local repository. You can record any number of changes before
|
Once you have cloned your fork, you need to set up the main repository as a remote:
|
||||||
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.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ 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``),
|
$ git pull upstream master
|
||||||
- pushing changes to the fork,
|
```
|
||||||
- and finally sending a pull request.
|
|
||||||
|
+ **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
|
== Compilation from source ==
|
||||||
case, all you need to do to compile and install GF, after downloading the
|
|
||||||
source code as described above, is
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
=== Alternative: use Cabal ===
|
||||||
|
|
||||||
|
If you prefer Cabal, then you just need to manually choose a suitable GHC to build GF. We recommend GHC 9.6.7, see other supported options in [gf.cabal https://github.com/GrammaticalFramework/gf-core/blob/master/gf.cabal#L14].
|
||||||
|
|
||||||
|
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
|
$ cabal install
|
||||||
```
|
```
|
||||||
|
|
||||||
This will automatically download any additional Haskell libraries needed to
|
=== Nix ===
|
||||||
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
|
As of 3.12, GF can also be installed via Nix. You can install GF from github with the following command:
|
||||||
//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
|
nix profile install github:GrammaticalFramework/gf-core#gf
|
||||||
```
|
```
|
||||||
|
|
||||||
If you don't see any error message from the above command then you
|
== Compiling GF with C runtime system support ==
|
||||||
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.
|
The C runtime system is a separate implementation of the PGF runtime services.
|
||||||
|
|
||||||
=== 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.
|
|
||||||
It makes it possible to work with very large, ambiguous grammars, using
|
It makes it possible to work with very large, ambiguous grammars, using
|
||||||
probabilistic models to obtain probable parses. The C run-time system might
|
probabilistic models to obtain probable parses. The C runtime system might
|
||||||
also be easier to use than the Haskell run-time system on certain platforms,
|
also be easier to use than the Haskell runtime system on certain platforms,
|
||||||
e.g. Android and iOS.
|
e.g. Android and iOS.
|
||||||
|
|
||||||
To install the C run-time system, go to the ``src/runtime/c`` directory
|
To install the C runtime 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``.
|
|
||||||
|
|
||||||
When the C run-time system is installed, you can install GF with C run-time
|
- **On Linux and Mac OS —**
|
||||||
support by doing
|
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 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 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 —**
|
||||||
|
|
||||||
|
Add (or uncomment) the following lines in the ``stack.yaml`` file:
|
||||||
|
|
||||||
```
|
```
|
||||||
cabal install -fserver -fc-runtime
|
flags:
|
||||||
|
gf:
|
||||||
|
c-runtime: true
|
||||||
|
extra-lib-dirs:
|
||||||
|
- /usr/local/lib
|
||||||
```
|
```
|
||||||
from the top directory. This give you three new things:
|
and then run ``stack install`` from the top directory (``gf-core``).
|
||||||
|
|
||||||
- ``PGF2``: a module to import in Haskell programs, providing a binding to
|
Run the newly built executable with the flag ``-cshell``, and you should see the following welcome message:
|
||||||
the C run-time system.
|
|
||||||
|
|
||||||
- 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.
|
$ gf -cshell
|
||||||
Only limited functionality is available when running the shell in these
|
|
||||||
modes (use the ``help`` command in the shell for details).
|
|
||||||
|
|
||||||
- ``gf -server`` mode is extended with new requests to call the C run-time
|
* * *
|
||||||
system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
|
* *
|
||||||
|
* *
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* * * * * * *
|
||||||
|
* * *
|
||||||
|
* * * * * *
|
||||||
|
* * *
|
||||||
|
* * *
|
||||||
|
|
||||||
|
This is GF version 3.12.0.
|
||||||
|
Built on ...
|
||||||
|
Git info: ...
|
||||||
|
|
||||||
|
Flags: interrupt server c-runtime
|
||||||
|
License: see help -license.
|
||||||
|
|
||||||
|
This shell uses the C run-time system. See help for available commands.
|
||||||
|
>
|
||||||
|
```
|
||||||
|
|
||||||
|
//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.//
|
||||||
|
|
||||||
|
|
||||||
=== Python and Java bindings ===
|
=== 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 —**
|
||||||
|
|
||||||
|
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 ==
|
== Compilation of RGL ==
|
||||||
|
|
||||||
As of 2018-07-26, the RGL is distributed separately from the GF compiler and runtimes.
|
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 ===
|
=== Simple ===
|
||||||
To install the RGL, you can use the following commands from within the ``gf-rgl`` repository:
|
To install the RGL, you can use the following commands from within the ``gf-rgl`` repository:
|
||||||
```
|
```
|
||||||
@@ -425,114 +323,79 @@ There is also ``make build``, ``make copy`` and ``make clean`` which do what you
|
|||||||
=== Advanced ===
|
=== Advanced ===
|
||||||
For advanced build options, call the Haskell build script directly:
|
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].
|
For more details see the [README https://github.com/GrammaticalFramework/gf-rgl/blob/master/README.md].
|
||||||
|
|
||||||
=== Haskell-free ===
|
=== Haskell-free ===
|
||||||
If you do not have Haskell installed, you can use the simple build script ``Make.sh``
|
If you do not have Haskell installed, you can use the simple build script ``Setup.sh``
|
||||||
(or ``Make.bat`` for Windows).
|
(or ``Setup.bat`` for Windows).
|
||||||
|
|
||||||
|
|
||||||
== Creating binary distribution packages ==
|
== 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
|
https://github.com/GrammaticalFramework/gf-core/actions/workflows/build-binary-packages.yml
|
||||||
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.
|
|
||||||
|
|
||||||
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 ====
|
or
|
||||||
|
|
||||||
Make sure the ``debian/changelog`` starts with an entry that describes the
|
|
||||||
version you are building. Then run
|
|
||||||
|
|
||||||
```
|
```
|
||||||
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.
|
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.
|
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
|
This is everything that we need to organize a testsuite. The root of the
|
||||||
testsuite is the testsuite/ directory. It contains subdirectories which
|
testsuite is the ``testsuite/`` directory. It contains subdirectories
|
||||||
themself contain GF batch files (with extension .gfs). The above command
|
which themselves contain GF batch files (with extension ``.gfs``).
|
||||||
searches the subdirectories of the testsuite/ directory for files with extension
|
The above command searches the subdirectories of the ``testsuite/`` directory
|
||||||
.gfs and when it finds one it is executed with the GF interpreter.
|
for files with extension ``.gfs`` and when it finds one, it is executed with
|
||||||
The output of the script is stored in file with extension .out and is compared
|
the GF interpreter. The output of the script is stored in file with extension ``.out``
|
||||||
with the content of the corresponding file with extension .gold, if there is one.
|
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.
|
|
||||||
|
|
||||||
Every time when you make some changes to GF that have to be tested, instead of
|
Every time when you make some changes to GF that have to be tested,
|
||||||
writing the commands by hand in the GF shell, add them to one .gfs file in the testsuite
|
instead of writing the commands by hand in the GF shell, add them to one ``.gfs``
|
||||||
and run the test. In this way you can use the same test later and we will be sure
|
file in the testsuite subdirectory where its ``.gf`` file resides and run the test.
|
||||||
that we will not incidentaly break your code later.
|
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.
|
||||||
|
|||||||
75
doc/gf-editor-modes.md
Normal file
75
doc/gf-editor-modes.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# Editor modes & IDE integration for GF
|
||||||
|
|
||||||
|
We collect GF modes for various editors on this page. Contributions are welcome!
|
||||||
|
|
||||||
|
## Emacs
|
||||||
|
|
||||||
|
[gf.el](https://github.com/GrammaticalFramework/gf-emacs-mode) by Johan
|
||||||
|
Bockgård provides syntax highlighting and automatic indentation and
|
||||||
|
lets you run the GF Shell in an emacs buffer. See installation
|
||||||
|
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.
|
||||||
|
* [Grammatical Framework](https://marketplace.visualstudio.com/items?itemName=GrammaticalFramework.gf-vscode) is a simpler extension
|
||||||
|
without any external dependencies which provides only syntax highlighting.
|
||||||
|
|
||||||
|
## Eclipse
|
||||||
|
|
||||||
|
[GF Eclipse Plugin](https://github.com/GrammaticalFramework/gf-eclipse-plugin/), by John J. Camilleri
|
||||||
|
|
||||||
|
## Gedit
|
||||||
|
|
||||||
|
By John J. Camilleri
|
||||||
|
|
||||||
|
Copy the file below to
|
||||||
|
`~/.local/share/gtksourceview-3.0/language-specs/gf.lang` (under Ubuntu).
|
||||||
|
|
||||||
|
* [gf.lang](../src/tools/gf.lang)
|
||||||
|
|
||||||
|
Some helpful notes/links:
|
||||||
|
|
||||||
|
* The code is based heavily on the `haskell.lang` file which I found in
|
||||||
|
`/usr/share/gtksourceview-2.0/language-specs/haskell.lang`.
|
||||||
|
* Ruslan Osmanov recommends
|
||||||
|
[registering your file extension as its own MIME type](http://osmanov-dev-notes.blogspot.com/2011/04/how-to-add-new-highlight-mode-in-gedit.html)
|
||||||
|
(see also [here](https://help.ubuntu.com/community/AddingMimeTypes)),
|
||||||
|
however on my system the `.gf` extension was already registered
|
||||||
|
as a generic font (`application/x-tex-gf`) and I didn't want to risk
|
||||||
|
messing any of that up.
|
||||||
|
* This is a quick 5-minute job and might require some tweaking.
|
||||||
|
[The GtkSourceView language definition tutorial](http://developer.gnome.org/gtksourceview/stable/lang-tutorial.html)
|
||||||
|
is the place to start looking.
|
||||||
|
* Contributions are welcome!
|
||||||
|
|
||||||
|
## Geany
|
||||||
|
|
||||||
|
By John J. Camilleri
|
||||||
|
|
||||||
|
[Custom filetype](http://www.geany.org/manual/dev/index.html#custom-filetypes)
|
||||||
|
config files for syntax highlighting in [Geany](http://www.geany.org/).
|
||||||
|
|
||||||
|
For version 1.36 and above, copy one of the files below to
|
||||||
|
`/usr/share/geany/filedefs/filetypes.GF.conf` (under Ubuntu).
|
||||||
|
If you're using a version older than 1.36, copy the file to `/usr/share/geany/filetypes.GF.conf`.
|
||||||
|
You will need to manually create the file.
|
||||||
|
|
||||||
|
* [light-filetypes.GF.conf](../src/tools/light-filetypes.GF.conf)
|
||||||
|
* [dark-filetypes.GF.conf](../src/tools/dark-filetypes.GF.conf)
|
||||||
|
|
||||||
|
You will also need to edit the `filetype_extensions.conf` file and add the
|
||||||
|
following line somewhere:
|
||||||
|
|
||||||
|
```
|
||||||
|
GF=*.gf
|
||||||
|
```
|
||||||
|
|
||||||
|
## Vim
|
||||||
|
|
||||||
|
[vim-gf](https://github.com/gdetrez/vim-gf)
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
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!
|
|
||||||
|
|
||||||
|
|
||||||
==Emacs==
|
|
||||||
|
|
||||||
[gf.el https://github.com/GrammaticalFramework/gf-emacs-mode] by Johan
|
|
||||||
Bockgård provides syntax highlighting and automatic indentation and
|
|
||||||
lets you run the GF Shell in an emacs buffer. See installation
|
|
||||||
instructions inside.
|
|
||||||
|
|
||||||
==Atom==
|
|
||||||
[language-gf https://atom.io/packages/language-gf], by John J. Camilleri
|
|
||||||
|
|
||||||
==Eclipse==
|
|
||||||
|
|
||||||
[GF Eclipse Plugin https://github.com/GrammaticalFramework/gf-eclipse-plugin/], by John J. Camilleri
|
|
||||||
|
|
||||||
==Gedit==
|
|
||||||
|
|
||||||
By John J. Camilleri
|
|
||||||
|
|
||||||
Copy the file below to
|
|
||||||
``~/.local/share/gtksourceview-3.0/language-specs/gf.lang`` (under Ubuntu).
|
|
||||||
|
|
||||||
- [gf.lang ../src/tools/gf.lang]
|
|
||||||
|
|
||||||
|
|
||||||
Some helpful notes/links:
|
|
||||||
|
|
||||||
- The code is based heavily on the ``haskell.lang`` file which I found in
|
|
||||||
``/usr/share/gtksourceview-2.0/language-specs/haskell.lang``.
|
|
||||||
- Ruslan Osmanov recommends
|
|
||||||
[registering your file extension as its own MIME type http://osmanov-dev-notes.blogspot.com/2011/04/how-to-add-new-highlight-mode-in-gedit.html]
|
|
||||||
(see also [here https://help.ubuntu.com/community/AddingMimeTypes]),
|
|
||||||
however on my system the ``.gf`` extension was already registered
|
|
||||||
as a generic font (``application/x-tex-gf``) and I didn't want to risk
|
|
||||||
messing any of that up.
|
|
||||||
- This is a quick 5-minute job and might require some tweaking.
|
|
||||||
[The GtkSourceView language definition tutorial http://developer.gnome.org/gtksourceview/stable/lang-tutorial.html]
|
|
||||||
is the place to start looking.
|
|
||||||
- Contributions are welcome!
|
|
||||||
|
|
||||||
|
|
||||||
==Geany==
|
|
||||||
|
|
||||||
By John J. Camilleri
|
|
||||||
|
|
||||||
[Custom filetype http://www.geany.org/manual/dev/index.html#custom-filetypes]
|
|
||||||
config files for syntax highlighting in [Geany http://www.geany.org/].
|
|
||||||
|
|
||||||
Copy one of the files below to ``/usr/share/geany/filetypes.GF.conf``
|
|
||||||
(under Ubuntu). You will need to manually create the file.
|
|
||||||
|
|
||||||
- [light-filetypes.GF.conf ../src/tools/light-filetypes.GF.conf]
|
|
||||||
- [dark-filetypes.GF.conf ../src/tools/dark-filetypes.GF.conf]
|
|
||||||
|
|
||||||
|
|
||||||
You will also need to edit the ``filetype_extensions.conf`` file and add the
|
|
||||||
following line somewhere:
|
|
||||||
|
|
||||||
```
|
|
||||||
GF=*.gf
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
==Vim==
|
|
||||||
|
|
||||||
[vim-gf https://github.com/gdetrez/vim-gf]
|
|
||||||
@@ -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?===
|
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
#TINY
|
#TINY
|
||||||
|
|
||||||
The command has one argument which is either function, expression or
|
The command has one argument which is either function, expression or
|
||||||
a category defined in the abstract syntax of the current grammar.
|
a category defined in the abstract syntax of the current grammar.
|
||||||
If the argument is a function then ?its type is printed out.
|
If the argument is a function then ?its type is printed out.
|
||||||
If it is a category then the category definition is printed.
|
If it is a category then the category definition is printed.
|
||||||
If a whole expression is given it prints the expression with refined
|
If a whole expression is given it prints the expression with refined
|
||||||
@@ -68,9 +68,9 @@ metavariables and the type of the expression.
|
|||||||
Prints a set of strings in the .dot format (the graphviz format).
|
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.
|
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
|
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
|
which is processed by 'dot' (graphviz) and displayed by the program indicated
|
||||||
by the flag. The target format is postscript, unless overridden by the
|
by the view flag. The target format is png, unless overridden by the
|
||||||
flag -format.
|
flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).
|
||||||
|
|
||||||
|
|
||||||
- Options:
|
- Options:
|
||||||
@@ -151,6 +151,7 @@ of a pipe.
|
|||||||
| ``-one`` | pick the first strings, if there is any, from records and tables
|
| ``-one`` | pick the first strings, if there is any, from records and tables
|
||||||
| ``-table`` | show all strings labelled by parameters
|
| ``-table`` | show all strings labelled by parameters
|
||||||
| ``-unqual`` | hide qualifying module names
|
| ``-unqual`` | hide qualifying module names
|
||||||
|
| ``-trace`` | trace computations
|
||||||
|
|
||||||
|
|
||||||
#NORMAL
|
#NORMAL
|
||||||
@@ -242,7 +243,7 @@ and thus cannot be a part of a pipe.
|
|||||||
|
|
||||||
====e = empty====
|
====e = empty====
|
||||||
#NOINDENT
|
#NOINDENT
|
||||||
``e`` = ``empty``: //empty the environment.//
|
``e`` = ``empty``: //empty the environment (except the command history).//
|
||||||
|
|
||||||
#TINY
|
#TINY
|
||||||
|
|
||||||
@@ -281,6 +282,19 @@ but the resulting .gf file must be imported separately.
|
|||||||
#NORMAL
|
#NORMAL
|
||||||
|
|
||||||
|
|
||||||
|
#VSPACE
|
||||||
|
|
||||||
|
====eh = execute_history====
|
||||||
|
#NOINDENT
|
||||||
|
``eh`` = ``execute_history``: //read commands from a file and execute them.//
|
||||||
|
|
||||||
|
#TINY
|
||||||
|
|
||||||
|
- Syntax: ``eh FILE``
|
||||||
|
|
||||||
|
#NORMAL
|
||||||
|
|
||||||
|
|
||||||
#VSPACE
|
#VSPACE
|
||||||
|
|
||||||
====gr = generate_random====
|
====gr = generate_random====
|
||||||
@@ -289,7 +303,7 @@ but the resulting .gf file must be imported separately.
|
|||||||
|
|
||||||
#TINY
|
#TINY
|
||||||
|
|
||||||
Generates a list of random trees, by default one tree.
|
Generates a list of random trees, by default one tree up to depth 5.
|
||||||
If a tree argument is given, the command completes the Tree with values to
|
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,
|
all metavariables in the tree. The generation can be biased by probabilities,
|
||||||
given in a file in the -probs flag.
|
given in a file in the -probs flag.
|
||||||
@@ -301,13 +315,14 @@ given in a file in the -probs flag.
|
|||||||
| ``-cat`` | generation category
|
| ``-cat`` | generation category
|
||||||
| ``-lang`` | uses only functions that have linearizations in all these languages
|
| ``-lang`` | uses only functions that have linearizations in all these languages
|
||||||
| ``-number`` | number of trees generated
|
| ``-number`` | number of trees generated
|
||||||
| ``-depth`` | the maximum generation depth
|
| ``-depth`` | the maximum generation depth (default: 5)
|
||||||
| ``-probs`` | file with biased probabilities (format 'f 0.4' one by line)
|
| ``-probs`` | file with biased probabilities (format 'f 0.4' one by line)
|
||||||
|
|
||||||
- Examples:
|
- Examples:
|
||||||
|
|
||||||
| ``gr`` | one tree in the startcat of the current grammar
|
| ``gr`` | one tree in the startcat of the current grammar
|
||||||
| ``gr -cat=NP -number=16`` | 16 trees in the category NP
|
| ``gr -cat=NP -number=16`` | 16 trees in the category NP
|
||||||
|
| ``gr -cat=NP -depth=2`` | one tree in the category NP, up to depth 2
|
||||||
| ``gr -lang=LangHin,LangTha -cat=Cl`` | Cl, both in LangHin and LangTha
|
| ``gr -lang=LangHin,LangTha -cat=Cl`` | Cl, both in LangHin and LangTha
|
||||||
| ``gr -probs=FILE`` | generate with bias
|
| ``gr -probs=FILE`` | generate with bias
|
||||||
| ``gr (AdjCN ? (UseN ?))`` | generate trees of form (AdjCN ? (UseN ?))
|
| ``gr (AdjCN ? (UseN ?))`` | generate trees of form (AdjCN ? (UseN ?))
|
||||||
@@ -324,8 +339,8 @@ given in a file in the -probs flag.
|
|||||||
|
|
||||||
#TINY
|
#TINY
|
||||||
|
|
||||||
Generates all trees of a given category. By default,
|
Generates all trees of a given category. By default,
|
||||||
the depth is limited to 4, but this can be changed by a flag.
|
the depth is limited to 5, but this can be changed by a flag.
|
||||||
If a Tree argument is given, the command completes the Tree with values
|
If a Tree argument is given, the command completes the Tree with values
|
||||||
to all metavariables in the tree.
|
to all metavariables in the tree.
|
||||||
|
|
||||||
@@ -339,7 +354,7 @@ to all metavariables in the tree.
|
|||||||
|
|
||||||
- Examples:
|
- Examples:
|
||||||
|
|
||||||
| ``gt`` | all trees in the startcat, to depth 4
|
| ``gt`` | all trees in the startcat, to depth 5
|
||||||
| ``gt -cat=NP -number=16`` | 16 trees in the category NP
|
| ``gt -cat=NP -number=16`` | 16 trees in the category NP
|
||||||
| ``gt -cat=NP -depth=2`` | trees in the category NP to depth 2
|
| ``gt -cat=NP -depth=2`` | trees in the category NP to depth 2
|
||||||
| ``gt (AdjCN ? (UseN ?))`` | trees of form (AdjCN ? (UseN ?))
|
| ``gt (AdjCN ? (UseN ?))`` | trees of form (AdjCN ? (UseN ?))
|
||||||
@@ -434,12 +449,14 @@ sequences; see example.
|
|||||||
| ``-list`` | show all forms and variants, comma-separated on one line (cf. l -all)
|
| ``-list`` | show all forms and variants, comma-separated on one line (cf. l -all)
|
||||||
| ``-multi`` | linearize to all languages (default)
|
| ``-multi`` | linearize to all languages (default)
|
||||||
| ``-table`` | show all forms labelled by parameters
|
| ``-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
|
| ``-treebank`` | show the tree and tag linearizations with language names
|
||||||
| ``-bind`` | bind tokens separated by Prelude.BIND, i.e. &+
|
| ``-bind`` | bind tokens separated by Prelude.BIND, i.e. &+
|
||||||
| ``-chars`` | lexer that makes every non-space character a token
|
| ``-chars`` | lexer that makes every non-space character a token
|
||||||
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
||||||
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
||||||
| ``-from_arabic`` | from unicode to GF Arabic 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_cp1251`` | decode from cp1251 (Cyrillic used in Bulgarian resource)
|
||||||
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
||||||
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
||||||
@@ -453,11 +470,14 @@ sequences; see example.
|
|||||||
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
||||||
| ``-from_utf8`` | decode from utf8 (default)
|
| ``-from_utf8`` | decode from utf8 (default)
|
||||||
| ``-lexcode`` | code-like lexer
|
| ``-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 $...$, \(...)\, \[...\])
|
| ``-lexmixed`` | mixture of text and code, as in LaTeX (code between $...$, \(...)\, \[...\])
|
||||||
| ``-lextext`` | text-like lexer
|
| ``-lextext`` | text-like lexer
|
||||||
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
||||||
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
||||||
| ``-to_arabic`` | from GF Arabic 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_cp1251`` | encode to cp1251 (Cyrillic used in Bulgarian resource)
|
||||||
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
||||||
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
||||||
@@ -473,6 +493,7 @@ sequences; see example.
|
|||||||
| ``-to_utf8`` | encode to utf8 (default)
|
| ``-to_utf8`` | encode to utf8 (default)
|
||||||
| ``-unchars`` | unlexer that puts no spaces between tokens
|
| ``-unchars`` | unlexer that puts no spaces between tokens
|
||||||
| ``-unlexcode`` | code-like unlexer
|
| ``-unlexcode`` | code-like unlexer
|
||||||
|
| ``-unlexgreek`` | unlexer de-normalizing ancient Greek accentuation
|
||||||
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
||||||
| ``-unlextext`` | text-like unlexer
|
| ``-unlextext`` | text-like unlexer
|
||||||
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
||||||
@@ -513,6 +534,7 @@ trees where a function node is a metavariable.
|
|||||||
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
||||||
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
||||||
| ``-from_arabic`` | from unicode to GF Arabic 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_cp1251`` | decode from cp1251 (Cyrillic used in Bulgarian resource)
|
||||||
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
||||||
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
||||||
@@ -526,11 +548,14 @@ trees where a function node is a metavariable.
|
|||||||
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
||||||
| ``-from_utf8`` | decode from utf8 (default)
|
| ``-from_utf8`` | decode from utf8 (default)
|
||||||
| ``-lexcode`` | code-like lexer
|
| ``-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 $...$, \(...)\, \[...\])
|
| ``-lexmixed`` | mixture of text and code, as in LaTeX (code between $...$, \(...)\, \[...\])
|
||||||
| ``-lextext`` | text-like lexer
|
| ``-lextext`` | text-like lexer
|
||||||
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
||||||
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
||||||
| ``-to_arabic`` | from GF Arabic 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_cp1251`` | encode to cp1251 (Cyrillic used in Bulgarian resource)
|
||||||
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
||||||
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
||||||
@@ -546,6 +571,7 @@ trees where a function node is a metavariable.
|
|||||||
| ``-to_utf8`` | encode to utf8 (default)
|
| ``-to_utf8`` | encode to utf8 (default)
|
||||||
| ``-unchars`` | unlexer that puts no spaces between tokens
|
| ``-unchars`` | unlexer that puts no spaces between tokens
|
||||||
| ``-unlexcode`` | code-like unlexer
|
| ``-unlexcode`` | code-like unlexer
|
||||||
|
| ``-unlexgreek`` | unlexer de-normalizing ancient Greek accentuation
|
||||||
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
||||||
| ``-unlextext`` | text-like unlexer
|
| ``-unlextext`` | text-like unlexer
|
||||||
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
||||||
@@ -557,7 +583,7 @@ trees where a function node is a metavariable.
|
|||||||
|
|
||||||
- Examples:
|
- Examples:
|
||||||
|
|
||||||
| ``l -lang=LangSwe,LangNor -chunks ? a b (? c d)`` |
|
| ``l -lang=LangSwe,LangNor -chunks ? a b (? c d)`` |
|
||||||
|
|
||||||
|
|
||||||
#NORMAL
|
#NORMAL
|
||||||
@@ -622,7 +648,7 @@ The -lang flag can be used to restrict this to fewer languages.
|
|||||||
The default start category can be overridden by the -cat flag.
|
The default start category can be overridden by the -cat flag.
|
||||||
See also the ps command for lexing and character encoding.
|
See also the ps command for lexing and character encoding.
|
||||||
|
|
||||||
The -openclass flag is experimental and allows some robustness in
|
The -openclass flag is experimental and allows some robustness in
|
||||||
the parser. For example if -openclass="A,N,V" is given, the parser
|
the parser. For example if -openclass="A,N,V" is given, the parser
|
||||||
will accept unknown adjectives, nouns and verbs with the resource grammar.
|
will accept unknown adjectives, nouns and verbs with the resource grammar.
|
||||||
|
|
||||||
@@ -666,10 +692,9 @@ command (flag -printer):
|
|||||||
fa finite automaton in graphviz format
|
fa finite automaton in graphviz format
|
||||||
gsl Nuance speech recognition format
|
gsl Nuance speech recognition format
|
||||||
haskell Haskell (abstract syntax)
|
haskell Haskell (abstract syntax)
|
||||||
|
java Java (abstract syntax)
|
||||||
js JavaScript (whole grammar)
|
js JavaScript (whole grammar)
|
||||||
jsgf JSGF speech recognition format
|
jsgf JSGF speech recognition format
|
||||||
lambda_prolog LambdaProlog (abstract syntax)
|
|
||||||
lp_byte_code Bytecode for Teyjus (abstract syntax, experimental)
|
|
||||||
pgf_pretty human-readable pgf
|
pgf_pretty human-readable pgf
|
||||||
prolog Prolog (whole grammar)
|
prolog Prolog (whole grammar)
|
||||||
python Python (whole grammar)
|
python Python (whole grammar)
|
||||||
@@ -753,6 +778,7 @@ To see transliteration tables, use command ut.
|
|||||||
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
| ``-from_amharic`` | from unicode to GF Amharic transliteration
|
||||||
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
| ``-from_ancientgreek`` | from unicode to GF ancient Greek transliteration
|
||||||
| ``-from_arabic`` | from unicode to GF Arabic 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_cp1251`` | decode from cp1251 (Cyrillic used in Bulgarian resource)
|
||||||
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
| ``-from_devanagari`` | from unicode to GF Devanagari transliteration
|
||||||
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
| ``-from_greek`` | from unicode to GF modern Greek transliteration
|
||||||
@@ -766,11 +792,14 @@ To see transliteration tables, use command ut.
|
|||||||
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
| ``-from_urdu`` | from unicode to GF Urdu transliteration
|
||||||
| ``-from_utf8`` | decode from utf8 (default)
|
| ``-from_utf8`` | decode from utf8 (default)
|
||||||
| ``-lexcode`` | code-like lexer
|
| ``-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 $...$, \(...)\, \[...\])
|
| ``-lexmixed`` | mixture of text and code, as in LaTeX (code between $...$, \(...)\, \[...\])
|
||||||
| ``-lextext`` | text-like lexer
|
| ``-lextext`` | text-like lexer
|
||||||
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
| ``-to_amharic`` | from GF Amharic transliteration to unicode
|
||||||
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
| ``-to_ancientgreek`` | from GF ancient Greek transliteration to unicode
|
||||||
| ``-to_arabic`` | from GF Arabic 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_cp1251`` | encode to cp1251 (Cyrillic used in Bulgarian resource)
|
||||||
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
| ``-to_devanagari`` | from GF Devanagari transliteration to unicode
|
||||||
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
| ``-to_greek`` | from GF modern Greek transliteration to unicode
|
||||||
@@ -786,6 +815,7 @@ To see transliteration tables, use command ut.
|
|||||||
| ``-to_utf8`` | encode to utf8 (default)
|
| ``-to_utf8`` | encode to utf8 (default)
|
||||||
| ``-unchars`` | unlexer that puts no spaces between tokens
|
| ``-unchars`` | unlexer that puts no spaces between tokens
|
||||||
| ``-unlexcode`` | code-like unlexer
|
| ``-unlexcode`` | code-like unlexer
|
||||||
|
| ``-unlexgreek`` | unlexer de-normalizing ancient Greek accentuation
|
||||||
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
| ``-unlexmixed`` | mixture of text and code (code between $...$, \(...)\, \[...\])
|
||||||
| ``-unlextext`` | text-like unlexer
|
| ``-unlextext`` | text-like unlexer
|
||||||
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
| ``-unwords`` | unlexer that puts a single space between tokens (default)
|
||||||
@@ -799,13 +829,14 @@ To see transliteration tables, use command ut.
|
|||||||
|
|
||||||
- Examples:
|
- Examples:
|
||||||
|
|
||||||
| ``l (EAdd 3 4) | ps -code`` | linearize code-like output
|
| ``l (EAdd 3 4) | ps -unlexcode`` | linearize code-like output
|
||||||
| ``ps -lexer=code | p -cat=Exp`` | parse code-like input
|
| ``ps -lexcode | p -cat=Exp`` | parse code-like input
|
||||||
| ``gr -cat=QCl | l | ps -bind`` | linearization output from LangFin
|
| ``gr -cat=QCl | l | ps -bind`` | linearization output from LangFin
|
||||||
| ``ps -to_devanagari "A-p"`` | show Devanagari in UTF8 terminal
|
| ``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=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
|
| ``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 -to=chinese.trans "abc"`` | apply transliteration defined in file chinese.trans
|
||||||
|
| ``ps -lexgreek "a)gavoi` a)'nvrwpoi' tines*"`` | normalize ancient greek accentuation
|
||||||
|
|
||||||
|
|
||||||
#NORMAL
|
#NORMAL
|
||||||
@@ -828,7 +859,6 @@ are type checking and semantic computation.
|
|||||||
- Options:
|
- Options:
|
||||||
|
|
||||||
| ``-compute`` | compute by using semantic definitions (def)
|
| ``-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
|
| ``-largest`` | sort trees from largest to smallest, in number of nodes
|
||||||
| ``-nub`` | remove duplicate trees
|
| ``-nub`` | remove duplicate trees
|
||||||
| ``-smallest`` | sort trees from smallest to largest, in number of nodes
|
| ``-smallest`` | sort trees from smallest to largest, in number of nodes
|
||||||
@@ -838,12 +868,10 @@ are type checking and semantic computation.
|
|||||||
- Flags:
|
- Flags:
|
||||||
|
|
||||||
| ``-number`` | take at most this many trees
|
| ``-number`` | take at most this many trees
|
||||||
| ``-transfer`` | syntactic transfer by applying function, recursively in subtrees
|
|
||||||
|
|
||||||
- Examples:
|
- Examples:
|
||||||
|
|
||||||
| ``pt -compute (plus one two)`` | compute value
|
| ``pt -compute (plus one two)`` | compute value
|
||||||
| ``p "4 dogs love 5 cats" | pt -transfer=digits2numeral | l`` | four...five...
|
|
||||||
|
|
||||||
|
|
||||||
#NORMAL
|
#NORMAL
|
||||||
@@ -990,8 +1018,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 operations include the parameter constructors that are in scope.
|
||||||
The optional TYPE filters according to the value type.
|
The optional TYPE filters according to the value type.
|
||||||
The grep STRINGs filter according to other substrings of the type signatures.
|
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?``
|
- Syntax: ``so (-grep=STRING)* TYPE?``
|
||||||
- Options:
|
- Options:
|
||||||
@@ -1002,6 +1028,12 @@ of a pipe.
|
|||||||
|
|
||||||
| ``-grep`` | substring used for filtering (the command can have many of these)
|
| ``-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
|
#NORMAL
|
||||||
|
|
||||||
@@ -1113,6 +1145,7 @@ This command must be a line of its own, and thus cannot be a part of a pipe.
|
|||||||
| ``-amharic`` | Amharic
|
| ``-amharic`` | Amharic
|
||||||
| ``-ancientgreek`` | ancient Greek
|
| ``-ancientgreek`` | ancient Greek
|
||||||
| ``-arabic`` | Arabic
|
| ``-arabic`` | Arabic
|
||||||
|
| ``-arabic_unvocalized`` | unvocalized Arabic
|
||||||
| ``-devanagari`` | Devanagari
|
| ``-devanagari`` | Devanagari
|
||||||
| ``-greek`` | modern Greek
|
| ``-greek`` | modern Greek
|
||||||
| ``-hebrew`` | unvocalized Hebrew
|
| ``-hebrew`` | unvocalized Hebrew
|
||||||
@@ -1137,35 +1170,41 @@ This command must be a line of its own, and thus cannot be a part of a pipe.
|
|||||||
#TINY
|
#TINY
|
||||||
|
|
||||||
Prints a dependency tree in the .dot format (the graphviz format, default)
|
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
|
or the CoNLL/MaltParser format (flag -output=conll for training, malt_input
|
||||||
for unanalysed input).
|
for unanalysed input).
|
||||||
By default, the last argument is the head of every abstract syntax
|
By default, the last argument is the head of every abstract syntax
|
||||||
function; moreover, the head depends on the head of the function above.
|
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.
|
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
|
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
|
which is processed by dot (graphviz) and displayed by the program indicated
|
||||||
by the flag. The target format is png, unless overridden by the
|
by the view flag. The target format is png, unless overridden by the
|
||||||
flag -format.
|
flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).
|
||||||
|
See also 'vp -showdep' for another visualization of dependencies.
|
||||||
|
|
||||||
|
|
||||||
- Options:
|
- Options:
|
||||||
|
|
||||||
| ``-v`` | show extra information
|
| ``-v`` | show extra information
|
||||||
|
| ``-conll2latex`` | convert conll to latex
|
||||||
|
|
||||||
- Flags:
|
- Flags:
|
||||||
|
|
||||||
| ``-file`` | configuration file for labels per fun, format 'fun l1 ... label ... l2'
|
| ``-abslabels`` | abstract configuration file for labels, format per line 'fun label*'
|
||||||
| ``-format`` | format of the visualization file (default "png")
|
| ``-cnclabels`` | concrete configuration file for labels, format per line 'fun {words|*} pos label head'
|
||||||
| ``-output`` | output format of graph source (default "dot")
|
| ``-file`` | same as abslabels (abstract configuration file)
|
||||||
| ``-view`` | program to open the resulting file (default "open")
|
| ``-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
|
| ``-lang`` | the language of analysis
|
||||||
|
|
||||||
- Examples:
|
- Examples:
|
||||||
|
|
||||||
| ``gr | vd`` | generate a tree and show dependency tree in .dot
|
| ``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 | vd -view=open`` | generate a tree and display dependency tree on with Mac's 'open'
|
||||||
| ``gr -number=1000 | vd -file=dep.labels -output=malt`` | generate training treebank
|
| ``gr | vd -view=open -output=latex`` | generate a tree and display latex dependency tree with Mac's 'open'
|
||||||
| ``gr -number=100 | vd -file=dep.labels -output=malt_input`` | generate test sentences
|
| ``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
|
#NORMAL
|
||||||
@@ -1182,15 +1221,16 @@ flag -format.
|
|||||||
Prints a parse tree in the .dot format (the graphviz 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.
|
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
|
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
|
which is processed by dot (graphviz) and displayed by the program indicated
|
||||||
by the flag. The target format is png, unless overridden by the
|
by the view flag. The target format is png, unless overridden by the
|
||||||
flag -format.
|
flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).
|
||||||
|
|
||||||
|
|
||||||
- Options:
|
- Options:
|
||||||
|
|
||||||
| ``-showcat`` | show categories in the tree nodes (default)
|
| ``-showcat`` | show categories in the tree nodes (default)
|
||||||
| ``-nocat`` | don't show categories
|
| ``-nocat`` | don't show categories
|
||||||
|
| ``-showdep`` | show dependency labels
|
||||||
| ``-showfun`` | show function names in the tree nodes
|
| ``-showfun`` | show function names in the tree nodes
|
||||||
| ``-nofun`` | don't show function names (default)
|
| ``-nofun`` | don't show function names (default)
|
||||||
| ``-showleaves`` | show the leaves of the tree (default)
|
| ``-showleaves`` | show the leaves of the tree (default)
|
||||||
@@ -1198,6 +1238,8 @@ flag -format.
|
|||||||
|
|
||||||
- Flags:
|
- 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")
|
| ``-format`` | format of the visualization file (default "png")
|
||||||
| ``-view`` | program to open the resulting file (default "open")
|
| ``-view`` | program to open the resulting file (default "open")
|
||||||
| ``-nodefont`` | font for tree nodes (default: Times -- graphviz standard font)
|
| ``-nodefont`` | font for tree nodes (default: Times -- graphviz standard font)
|
||||||
@@ -1210,7 +1252,8 @@ flag -format.
|
|||||||
- Examples:
|
- Examples:
|
||||||
|
|
||||||
| ``p "John walks" | vp`` | generate a tree and show parse tree as .dot script
|
| ``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
|
#NORMAL
|
||||||
@@ -1227,9 +1270,9 @@ flag -format.
|
|||||||
Prints a set of trees in the .dot format (the graphviz 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.
|
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
|
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
|
which is processed by dot (graphviz) and displayed by the command indicated
|
||||||
by the flag. The target format is postscript, unless overridden by the
|
by the view flag. The target format is postscript, unless overridden by the
|
||||||
flag -format.
|
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'.
|
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
|
The GF Software System
|
||||||
|
|
||||||
|
|
||||||
%!style:../css/style.css
|
|
||||||
%!options(html): --toc
|
%!options(html): --toc
|
||||||
%!options(html): --toc-level=4
|
%!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): "#VSPACE" "<hr>"
|
||||||
%!postproc(html): "#NORMAL" ""
|
%!postproc(html): "#NORMAL" ""
|
||||||
%!postproc(html): "#TINY" ""
|
%!postproc(html): "#TINY" ""
|
||||||
@@ -13,7 +10,7 @@ The GF Software System
|
|||||||
|
|
||||||
The GF software system implements the GF programming language. Its
|
The GF software system implements the GF programming language. Its
|
||||||
components are
|
components are
|
||||||
- the //compiler//,
|
- the //compiler//,
|
||||||
translating ``.gf`` source files to ``.gfo`` object files, to
|
translating ``.gf`` source files to ``.gfo`` object files, to
|
||||||
``.pgf`` run-time grammars, and to various other formats
|
``.pgf`` run-time grammars, and to various other formats
|
||||||
- the //run-time system//,
|
- 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
|
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
|
In the shell, a set of commands
|
||||||
is available. Some of these commands may change the grammars in the state. The general
|
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
|
ARGUMENT ::= QUOTED_STRING | TREE
|
||||||
VALUE ::= IDENT | QUOTED_STRING
|
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
|
that the output of each command
|
||||||
is send as input to the next. The option ``-tr`` causes GF to show a trace,
|
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.
|
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===
|
===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``.
|
This list can also be obtained in the GF shell by the command ``help -full``.
|
||||||
|
|
||||||
%!include: gf-help-full.txt
|
%!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==
|
==The GF batch compiler==
|
||||||
|
|
||||||
With the option ``-batch``, GF can be invoked in batch mode, i.e.
|
With the option ``-batch``, GF can be invoked in batch mode, i.e.
|
||||||
without opening the shell, to compile files from ``.gf`` to ``.gfo``.
|
without opening the shell, to compile files from ``.gf`` to ``.gfo``.
|
||||||
The ``-s`` option ("silent") eliminates all messages except errors.
|
The ``-s`` option ("silent") eliminates all messages except errors.
|
||||||
```
|
```
|
||||||
$ gf -batch -s LangIta.gf
|
$ gf -batch -s LangIta.gf
|
||||||
```
|
```
|
||||||
With the option ``-make``, and as a set of
|
With the option ``-make``, and as a set of
|
||||||
top-level grammar files (with the same abstract syntax) as arguments,
|
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.
|
the size of the ``.pgf`` file, and is recommended for grammars to be shipped.
|
||||||
```
|
```
|
||||||
$ gf -make -optimize-pgf LangIta.gf LangEng.gf LangGer.gf
|
$ 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.
|
The file ``script.gfs`` should then contain a sequence of GF commands, one per line.
|
||||||
Unrecognized command lines are skipped without terminating GF.
|
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>
|
||||||
@@ -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>
|
<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>
|
<style>
|
||||||
body { background: #eee; padding-top: 200px; }
|
pre {
|
||||||
|
background-color:#eee;
|
||||||
pre.python {background-color:#ffc; display: none}
|
margin-top: 1em;
|
||||||
pre.haskell {background-color:#ffc; display: block}
|
padding: 0.5em 1em;
|
||||||
pre.java {background-color:#ffc; display: none}
|
}
|
||||||
pre.csharp {background-color:#ffc; display: none}
|
pre.python {display: none}
|
||||||
|
pre.haskell {display: block}
|
||||||
|
pre.java {display: none}
|
||||||
|
pre.csharp {display: none}
|
||||||
span.python {display: none}
|
span.python {display: none}
|
||||||
span.haskell {display: inline}
|
span.haskell {display: inline}
|
||||||
span.java {display: none}
|
span.java {display: none}
|
||||||
span.csharp {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>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
<script lang="javascript">
|
<script lang="javascript">
|
||||||
function change_language(href) {
|
function change_language(href) {
|
||||||
var name = href.split("#")[1];
|
var name = href.split("#")[1];
|
||||||
@@ -50,14 +47,28 @@
|
|||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body onload="change_language(window.location.href); window.addEventListener('hashchange', function(e){change_language(window.location.href);});">
|
<body onload="change_language(window.location.href); window.addEventListener('hashchange', function(e){change_language(window.location.href);});">
|
||||||
<span class="header">
|
<div class="container-fluid" style="max-width: 1200px">
|
||||||
<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>
|
<div class="header sticky-top border-bottom py-3 bg-white">
|
||||||
|
<a href=".." title="Home">
|
||||||
Choose a language: <a href="#haskell">Haskell</a> <a href="#python">Python</a> <a href="#java">Java</a> <a href="#csharp">C#</a>
|
<img src="../doc/Logos/gf1.svg" height="120px" class="float-md-right ml-3 mb-3 bg-white" alt="GF Logo">
|
||||||
</span>
|
</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>
|
<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>:
|
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>
|
<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>.
|
<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:
|
For example to invoke the parser, you can call:
|
||||||
<pre class="python">
|
<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
|
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>
|
</pre>
|
||||||
|
|
||||||
<p>Note that depending on the grammar it is absolutely possible that for
|
<p>Note that depending on the grammar it is absolutely possible that for
|
||||||
a single sentence you might get infinitely many trees.
|
a single sentence you might get infinitely many trees.
|
||||||
In other cases the number of trees might be finite but still enormous.
|
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
|
each tree is returned as soon as it is found before exhausting
|
||||||
the full search space. For grammars with a patological number of
|
the full search space. For grammars with a patological number of
|
||||||
trees it is advisable to pick only the top <tt>N</tt> trees
|
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>
|
</pre>
|
||||||
</span>
|
</span>
|
||||||
<span class="haskell">
|
<span class="haskell">
|
||||||
There is also the function <tt>parseWithHeuristics</tt> which
|
There is also the function <tt>parseWithHeuristics</tt> which
|
||||||
takes two more paramaters which let you to have a better control
|
takes two more paramaters which let you to have a better control
|
||||||
over the parser's behaviour:
|
over the parser's behaviour:
|
||||||
<pre class="haskell">
|
<pre class="haskell">
|
||||||
Prelude PGF2> let res = parseWithHeuristics eng (startCat gr) heuristic_factor callbacks
|
Prelude PGF2> let res = parseWithHeuristics eng (startCat gr) heuristic_factor callbacks
|
||||||
</pre>
|
</pre>
|
||||||
</span>
|
</span>
|
||||||
<span class="java">
|
<span class="java">
|
||||||
There is also the method <tt>parseWithHeuristics</tt> which
|
There is also the method <tt>parseWithHeuristics</tt> which
|
||||||
takes two more paramaters which let you to have a better control
|
takes two more paramaters which let you to have a better control
|
||||||
over the parser's behaviour:
|
over the parser's behaviour:
|
||||||
<pre class="java">
|
<pre class="java">
|
||||||
Iterable<ExprProb> iterable = eng.parseWithHeuristics(gr.startCat(), heuristic_factor, callbacks);
|
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
|
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
|
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
|
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 most probable tree on top of the list but further down the list,
|
||||||
the trees become shuffled.
|
the trees become shuffled.
|
||||||
</p>
|
</p>
|
||||||
@@ -457,7 +468,7 @@ the object has the following public final variables:
|
|||||||
</span>
|
</span>
|
||||||
</p>
|
</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
|
that doesn't have linearization definitions. In that case you
|
||||||
will just see the name of the function in the generated string.
|
will just see the name of the function in the generated string.
|
||||||
It is sometimes helpful to be able to see whether a function
|
It is sometimes helpful to be able to see whether a function
|
||||||
@@ -483,7 +494,7 @@ true
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
An already constructed tree can be analyzed and transformed
|
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:
|
a tree into a function name and a list of arguments:
|
||||||
<pre class="python">
|
<pre class="python">
|
||||||
>>> e.unpack()
|
>>> e.unpack()
|
||||||
@@ -523,8 +534,8 @@ literal. For example the result from:
|
|||||||
<span class="haskell">
|
<span class="haskell">
|
||||||
The result from <tt>unApp</tt> is <tt>Just</tt> if the expression
|
The result from <tt>unApp</tt> is <tt>Just</tt> if the expression
|
||||||
is an application and <tt>Nothing</tt> in all other cases.
|
is an application and <tt>Nothing</tt> in all other cases.
|
||||||
Similarly, if the tree is a literal string then the return value
|
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.
|
from <tt>unStr</tt> will be <tt>Just</tt> with the actual literal.
|
||||||
For example the result from:
|
For example the result from:
|
||||||
</span>
|
</span>
|
||||||
<pre class="haskell">
|
<pre class="haskell">
|
||||||
@@ -534,8 +545,8 @@ Prelude PGF2> readExpr "\"literal\"" >>= unStr
|
|||||||
<span class="java">
|
<span class="java">
|
||||||
The result from <tt>unApp</tt> is not <tt>null</tt> if the expression
|
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.
|
is an application, and <tt>null</tt> in all other cases.
|
||||||
Similarly, if the tree is a literal string then the return value
|
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.
|
from <tt>unStr</tt> will not be <tt>null</tt> with the actual literal.
|
||||||
For example the output from:
|
For example the output from:
|
||||||
</span>
|
</span>
|
||||||
<pre class="java">
|
<pre class="java">
|
||||||
@@ -545,15 +556,15 @@ System.out.println(elit.unStr());
|
|||||||
<span class="csharp">
|
<span class="csharp">
|
||||||
The result from <tt>UnApp</tt> is not <tt>null</tt> if the expression
|
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.
|
is an application, and <tt>null</tt> in all other cases.
|
||||||
Similarly, if the tree is a literal string then the return value
|
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.
|
from <tt>UnStr</tt> will not be <tt>null</tt> with the actual literal.
|
||||||
For example the output from:
|
For example the output from:
|
||||||
</span>
|
</span>
|
||||||
<pre class="csharp">
|
<pre class="csharp">
|
||||||
Expr elit = Expr.ReadExpr("\"literal\"");
|
Expr elit = Expr.ReadExpr("\"literal\"");
|
||||||
Console.WriteLine(elit.UnStr());
|
Console.WriteLine(elit.UnStr());
|
||||||
</pre>
|
</pre>
|
||||||
is just the string "literal".
|
is just the string "literal".
|
||||||
<span class="python">Situations like this can be detected
|
<span class="python">Situations like this can be detected
|
||||||
in Python by checking the type of the result from <tt>unpack</tt>.
|
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
|
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>
|
</span>
|
||||||
</p>
|
</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
|
<tt>readExpr</tt> to read trees from strings, or you can
|
||||||
construct new trees from existing pieces. This is possible by
|
construct new trees from existing pieces. This is possible by
|
||||||
<span class="python">
|
<span class="python">
|
||||||
@@ -612,7 +623,7 @@ Console.WriteLine(e2);
|
|||||||
<p>If the host application needs to do a lot of expression manipulations,
|
<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,
|
then it is helpful to use a higher-level API to the grammar,
|
||||||
also known as "embedded grammars" in GF. The advantage is that
|
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">
|
<span class="python">
|
||||||
<p>In Python you first have to <tt>embed</tt> the grammar by calling:
|
<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):
|
def on_DetCN(self,quant,cn):
|
||||||
print("Found DetCN")
|
print("Found DetCN")
|
||||||
cn.visit(self)
|
cn.visit(self)
|
||||||
|
|
||||||
def on_AdjCN(self,adj,cn):
|
def on_AdjCN(self,adj,cn):
|
||||||
print("Found AdjCN")
|
print("Found AdjCN")
|
||||||
cn.visit(self)
|
cn.visit(self)
|
||||||
@@ -1007,7 +1018,7 @@ Traceback (most recent call last):
|
|||||||
pgf.PGFError: The concrete syntax is not loaded
|
pgf.PGFError: The concrete syntax is not loaded
|
||||||
</pre>
|
</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">
|
<pre class="python">
|
||||||
>>> eng.load("AppEng.pgf_c")
|
>>> eng.load("AppEng.pgf_c")
|
||||||
>>> print(eng.lookupMorpho("letter"))
|
>>> print(eng.lookupMorpho("letter"))
|
||||||
@@ -1060,7 +1071,7 @@ Traceback (most recent call last):
|
|||||||
pgf.PGFError: The concrete syntax is not loaded
|
pgf.PGFError: The concrete syntax is not loaded
|
||||||
</pre>
|
</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">
|
<pre class="java">
|
||||||
eng.load("AppEng.pgf_c")
|
eng.load("AppEng.pgf_c")
|
||||||
for (MorphoAnalysis an : eng.lookupMorpho("letter")) {
|
for (MorphoAnalysis an : eng.lookupMorpho("letter")) {
|
||||||
@@ -1289,6 +1300,7 @@ graph {
|
|||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ December 2010 for GF 3.2
|
|||||||
% txt2tags --toc -ttex gf-tutorial.txt
|
% txt2tags --toc -ttex gf-tutorial.txt
|
||||||
|
|
||||||
%!target:html
|
%!target:html
|
||||||
%!encoding: iso-8859-1
|
%!encoding: utf-8
|
||||||
%!options: --toc
|
%!options: --toc
|
||||||
|
|
||||||
%!postproc(tex) : "\\subsection\*" "\\newslide"
|
%!postproc(tex) : "\\subsection\*" "\\newslide"
|
||||||
@@ -618,32 +618,32 @@ and **semantic definitions**.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#NEW
|
% #NEW
|
||||||
|
%
|
||||||
==Slides==
|
% ==Slides==
|
||||||
|
%
|
||||||
You can chop this tutorial into a set of slides by the command
|
% You can chop this tutorial into a set of slides by the command
|
||||||
```
|
% ```
|
||||||
htmls gf-tutorial.html
|
% htmls gf-tutorial.html
|
||||||
```
|
% ```
|
||||||
where the program ``htmls`` is distributed with GF (see below), in
|
% where the program ``htmls`` is distributed with GF (see below), in
|
||||||
|
%
|
||||||
[``GF/src/tools/Htmls.hs`` http://grammaticalframework.org/src/tools/Htmls.hs]
|
% [``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``.
|
% 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
|
% 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.
|
% upper left corner of each slide, and the links behind the "Contents" link.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
|
#Lchaptwo
|
||||||
|
|
||||||
=Lesson 1: Getting Started with GF=
|
=Lesson 1: Getting Started with GF=
|
||||||
|
|
||||||
|
|
||||||
#Lchaptwo
|
|
||||||
|
|
||||||
Goals:
|
Goals:
|
||||||
- install and run GF
|
- install and run GF
|
||||||
- write the first GF grammar: a "Hello World" grammar in three languages
|
- write the first GF grammar: a "Hello World" grammar in three languages
|
||||||
@@ -836,8 +836,8 @@ Finnish and an Italian concrete syntaxes:
|
|||||||
lin
|
lin
|
||||||
Hello recip = {s = "terve" ++ recip.s} ;
|
Hello recip = {s = "terve" ++ recip.s} ;
|
||||||
World = {s = "maailma"} ;
|
World = {s = "maailma"} ;
|
||||||
Mum = {s = "äiti"} ;
|
Mum = {s = "äiti"} ;
|
||||||
Friends = {s = "ystävät"} ;
|
Friends = {s = "ystävät"} ;
|
||||||
}
|
}
|
||||||
|
|
||||||
concrete HelloIta of Hello = {
|
concrete HelloIta of Hello = {
|
||||||
@@ -898,7 +898,7 @@ Parentheses are only needed for grouping.
|
|||||||
Parsing something that is not in grammar will fail:
|
Parsing something that is not in grammar will fail:
|
||||||
```
|
```
|
||||||
> parse "hello dad"
|
> parse "hello dad"
|
||||||
Unknown words: dad
|
The parser failed at token 2: "dad"
|
||||||
|
|
||||||
> parse "world hello"
|
> parse "world hello"
|
||||||
no tree found
|
no tree found
|
||||||
@@ -925,7 +925,7 @@ Default of the language flag (``-lang``): the last-imported concrete syntax.
|
|||||||
**Multilingual generation**:
|
**Multilingual generation**:
|
||||||
```
|
```
|
||||||
> parse -lang=HelloEng "hello friends" | linearize
|
> parse -lang=HelloEng "hello friends" | linearize
|
||||||
terve ystävät
|
terve ystävät
|
||||||
ciao amici
|
ciao amici
|
||||||
hello friends
|
hello friends
|
||||||
```
|
```
|
||||||
@@ -1037,9 +1037,10 @@ Application programs, using techniques from #Rchapeight:
|
|||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
|
#Lchapthree
|
||||||
|
|
||||||
=Lesson 2: Designing a grammar for complex phrases=
|
=Lesson 2: Designing a grammar for complex phrases=
|
||||||
|
|
||||||
#Lchapthree
|
|
||||||
|
|
||||||
Goals:
|
Goals:
|
||||||
- build a larger grammar: phrases about food in English and Italian
|
- build a larger grammar: phrases about food in English and Italian
|
||||||
@@ -1187,7 +1188,7 @@ use ``generate_trees = gt``.
|
|||||||
this wine is fresh
|
this wine is fresh
|
||||||
this wine is warm
|
this wine is warm
|
||||||
```
|
```
|
||||||
The default **depth** is 3; the depth can be
|
The default **depth** is 5; the depth can be
|
||||||
set by using the ``depth`` flag:
|
set by using the ``depth`` flag:
|
||||||
```
|
```
|
||||||
> generate_trees -depth=2 | l
|
> generate_trees -depth=2 | l
|
||||||
@@ -1264,10 +1265,16 @@ Human eye may prefer to see a visualization: ``visualize_tree = vt``:
|
|||||||
> parse "this delicious cheese is very Italian" | visualize_tree
|
> parse "this delicious cheese is very Italian" | visualize_tree
|
||||||
```
|
```
|
||||||
The tree is generated in postscript (``.ps``) file. The ``-view`` option is used for
|
The tree is generated in postscript (``.ps``) file. The ``-view`` option is used for
|
||||||
telling what command to use to view the file. Its default is ``"open"``, which works
|
telling what command to use to view the file.
|
||||||
on Mac OS X. On Ubuntu Linux, one can write
|
|
||||||
|
This works on Mac OS X:
|
||||||
```
|
```
|
||||||
> parse "this delicious cheese is very Italian" | visualize_tree -view="eog"
|
> parse "this delicious cheese is very Italian" | visualize_tree -view=open
|
||||||
|
```
|
||||||
|
On Linux, one can use one of the following commands.
|
||||||
|
```
|
||||||
|
> parse "this delicious cheese is very Italian" | visualize_tree -view=eog
|
||||||
|
> parse "this delicious cheese is very Italian" | visualize_tree -view=xdg-open
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -1335,7 +1342,7 @@ Just (?) replace English words with their dictionary equivalents:
|
|||||||
Phrase, Item, Kind, Quality = {s : Str} ;
|
Phrase, Item, Kind, Quality = {s : Str} ;
|
||||||
|
|
||||||
lin
|
lin
|
||||||
Is item quality = {s = item.s ++ "č" ++ quality.s} ;
|
Is item quality = {s = item.s ++ "è" ++ quality.s} ;
|
||||||
This kind = {s = "questo" ++ kind.s} ;
|
This kind = {s = "questo" ++ kind.s} ;
|
||||||
That kind = {s = "quel" ++ kind.s} ;
|
That kind = {s = "quel" ++ kind.s} ;
|
||||||
QKind quality kind = {s = kind.s ++ quality.s} ;
|
QKind quality kind = {s = kind.s ++ quality.s} ;
|
||||||
@@ -1446,11 +1453,11 @@ linearizations in different languages:
|
|||||||
> gr -number=2 | l -treebank
|
> gr -number=2 | l -treebank
|
||||||
|
|
||||||
Is (That Cheese) (Very Boring)
|
Is (That Cheese) (Very Boring)
|
||||||
quel formaggio č molto noioso
|
quel formaggio è molto noioso
|
||||||
that cheese is very boring
|
that cheese is very boring
|
||||||
|
|
||||||
Is (That Cheese) Fresh
|
Is (That Cheese) Fresh
|
||||||
quel formaggio č fresco
|
quel formaggio è fresco
|
||||||
that cheese is fresh
|
that cheese is fresh
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -1472,14 +1479,14 @@ answer given in another language.
|
|||||||
You can interrupt the quiz by entering a line consisting of a dot ('.').
|
You can interrupt the quiz by entering a line consisting of a dot ('.').
|
||||||
|
|
||||||
this fish is warm
|
this fish is warm
|
||||||
questo pesce č caldo
|
questo pesce è caldo
|
||||||
> Yes.
|
> Yes.
|
||||||
Score 1/1
|
Score 1/1
|
||||||
|
|
||||||
this cheese is Italian
|
this cheese is Italian
|
||||||
questo formaggio č noioso
|
questo formaggio è noioso
|
||||||
> No, not questo formaggio č noioso, but
|
> No, not questo formaggio è noioso, but
|
||||||
questo formaggio č italiano
|
questo formaggio è italiano
|
||||||
|
|
||||||
Score 1/2
|
Score 1/2
|
||||||
this fish is expensive
|
this fish is expensive
|
||||||
@@ -1732,6 +1739,13 @@ A new module can **extend** an old one:
|
|||||||
Pizza : Kind ;
|
Pizza : Kind ;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
Note that the extended grammar doesn't inherit the start
|
||||||
|
category from the grammar it extends, so if you want to
|
||||||
|
generate sentences with this grammar, you'll have to either
|
||||||
|
add a startcat (e.g. ``flags startcat = Question ;``),
|
||||||
|
or in the GF shell, specify the category to ``generate_random`` or ``geneate_trees``
|
||||||
|
(e.g. ``gr -cat=Comment`` or ``gt -cat=Question``).
|
||||||
|
|
||||||
Parallel to the abstract syntax, extensions can
|
Parallel to the abstract syntax, extensions can
|
||||||
be built for concrete syntaxes:
|
be built for concrete syntaxes:
|
||||||
```
|
```
|
||||||
@@ -1756,7 +1770,7 @@ Simultaneous extension and opening:
|
|||||||
lincat
|
lincat
|
||||||
Question = SS ;
|
Question = SS ;
|
||||||
lin
|
lin
|
||||||
QIs item quality = ss (item.s ++ "č" ++ quality.s) ;
|
QIs item quality = ss (item.s ++ "è" ++ quality.s) ;
|
||||||
Pizza = ss "pizza" ;
|
Pizza = ss "pizza" ;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1797,9 +1811,10 @@ where
|
|||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
|
#Lchapfour
|
||||||
|
|
||||||
=Lesson 3: Grammars with parameters=
|
=Lesson 3: Grammars with parameters=
|
||||||
|
|
||||||
#Lchapfour
|
|
||||||
|
|
||||||
Goals:
|
Goals:
|
||||||
- implement sophisticated linguistic structures:
|
- implement sophisticated linguistic structures:
|
||||||
@@ -2364,10 +2379,10 @@ in English, with special care taken of variations with the suffix
|
|||||||
|
|
||||||
+ Implement the German **Umlaut** operation on word stems.
|
+ Implement the German **Umlaut** operation on word stems.
|
||||||
The operation changes the vowel of the stressed stem syllable as follows:
|
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
|
can assume that the operation only takes syllables as arguments. Test the
|
||||||
operation to see whether it correctly changes //Arzt// to //Ärzt//,
|
operation to see whether it correctly changes //Arzt// to //Ärzt//,
|
||||||
//Baum// to //Bäum//, //Topf// to //Töpf//, and //Kuh// to //Küh//.
|
//Baum// to //Bäum//, //Topf// to //Töpf//, and //Kuh// to //Küh//.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2473,24 +2488,19 @@ can be used to read a text and return for each word its analyses
|
|||||||
```
|
```
|
||||||
The command ``morpho_quiz = mq`` generates inflection exercises.
|
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
|
> morpho_quiz -cat=V
|
||||||
|
|
||||||
Welcome to GF Morphology Quiz.
|
Welcome to GF Morphology Quiz.
|
||||||
...
|
...
|
||||||
|
|
||||||
réapparaître : VFin VCondit Pl P2
|
réapparaître : VFin VCondit Pl P2
|
||||||
réapparaitriez
|
réapparaitriez
|
||||||
> No, not réapparaitriez, but
|
> No, not réapparaitriez, but
|
||||||
réapparaîtriez
|
réapparaîtriez
|
||||||
Score 0/1
|
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 +2573,7 @@ We need only number variation for the copula.
|
|||||||
```
|
```
|
||||||
copula : Number -> Str =
|
copula : Number -> Str =
|
||||||
\n -> case n of {
|
\n -> case n of {
|
||||||
Sg => "č" ;
|
Sg => "è" ;
|
||||||
Pl => "sono"
|
Pl => "sono"
|
||||||
} ;
|
} ;
|
||||||
```
|
```
|
||||||
@@ -2649,12 +2659,12 @@ The verb //switch off// is called a
|
|||||||
|
|
||||||
We can define transitive verbs and their combinations as follows:
|
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 =
|
lin AppV2 subj v2 obj =
|
||||||
{s = subj.s ++ tv.s ! subj.n ++ obj.s ++ tv.part} ;
|
{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.
|
**Exercise**. Define the language ``a^n b^n c^n`` in GF, i.e.
|
||||||
@@ -2720,11 +2730,11 @@ This topic will be covered in #Rseclexing.
|
|||||||
|
|
||||||
The symbol ``**`` is used for both record types and record objects.
|
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} ;
|
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
|
If //T// is a subtype of //R//, an object of //T// can be used whenever
|
||||||
an object of //R// is required.
|
an object of //R// is required.
|
||||||
@@ -2755,7 +2765,11 @@ Thus the labels ``p1, p2,...`` are hard-coded.
|
|||||||
English indefinite article:
|
English indefinite article:
|
||||||
```
|
```
|
||||||
oper artIndef : Str =
|
oper artIndef : Str =
|
||||||
pre {"a" ; "an" / strs {"a" ; "e" ; "i" ; "o"}} ;
|
pre {
|
||||||
|
("a" | "e" | "i" | "o") => "an" ;
|
||||||
|
_ => "a"
|
||||||
|
} ;
|
||||||
|
|
||||||
```
|
```
|
||||||
Thus
|
Thus
|
||||||
```
|
```
|
||||||
@@ -2772,9 +2786,10 @@ Thus
|
|||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
|
#Lchapfive
|
||||||
|
|
||||||
=Lesson 4: Using the resource grammar library=
|
=Lesson 4: Using the resource grammar library=
|
||||||
|
|
||||||
#Lchapfive
|
|
||||||
|
|
||||||
Goals:
|
Goals:
|
||||||
- navigate in the GF resource grammar library and use it in applications
|
- navigate in the GF resource grammar library and use it in applications
|
||||||
@@ -2945,7 +2960,7 @@ We need the following combinations:
|
|||||||
```
|
```
|
||||||
We also need **lexical insertion**, to form phrases from single words:
|
We also need **lexical insertion**, to form phrases from single words:
|
||||||
```
|
```
|
||||||
mkCN : N -> NP ;
|
mkCN : N -> CN ;
|
||||||
mkAP : A -> AP ;
|
mkAP : A -> AP ;
|
||||||
```
|
```
|
||||||
Naming convention: to construct a //C//, use a function ``mk``//C//.
|
Naming convention: to construct a //C//, use a function ``mk``//C//.
|
||||||
@@ -2966,7 +2981,7 @@ can be built as follows:
|
|||||||
```
|
```
|
||||||
mkCl
|
mkCl
|
||||||
(mkNP these_Det
|
(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)
|
(mkAP italian_AP)
|
||||||
```
|
```
|
||||||
The task now: to define the concrete syntax of ``Foods`` so that
|
The task now: to define the concrete syntax of ``Foods`` so that
|
||||||
@@ -3305,13 +3320,13 @@ we can write a **functor instantiation**,
|
|||||||
oper
|
oper
|
||||||
wine_N = mkN "Wein" ;
|
wine_N = mkN "Wein" ;
|
||||||
pizza_N = mkN "Pizza" "Pizzen" feminine ;
|
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" ;
|
fish_N = mkN "Fisch" ;
|
||||||
fresh_A = mkA "frisch" ;
|
fresh_A = mkA "frisch" ;
|
||||||
warm_A = mkA "warm" "wärmer" "wärmste" ;
|
warm_A = mkA "warm" "wärmer" "wärmste" ;
|
||||||
italian_A = mkA "italienisch" ;
|
italian_A = mkA "italienisch" ;
|
||||||
expensive_A = mkA "teuer" ;
|
expensive_A = mkA "teuer" ;
|
||||||
delicious_A = mkA "köstlich" ;
|
delicious_A = mkA "köstlich" ;
|
||||||
boring_A = mkA "langweilig" ;
|
boring_A = mkA "langweilig" ;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -3362,11 +3377,11 @@ Lexicon instance
|
|||||||
cheese_N = mkN "juusto" ;
|
cheese_N = mkN "juusto" ;
|
||||||
fish_N = mkN "kala" ;
|
fish_N = mkN "kala" ;
|
||||||
fresh_A = mkA "tuore" ;
|
fresh_A = mkA "tuore" ;
|
||||||
warm_A = mkA "lämmin" ;
|
warm_A = mkA "lämmin" ;
|
||||||
italian_A = mkA "italialainen" ;
|
italian_A = mkA "italialainen" ;
|
||||||
expensive_A = mkA "kallis" ;
|
expensive_A = mkA "kallis" ;
|
||||||
delicious_A = mkA "herkullinen" ;
|
delicious_A = mkA "herkullinen" ;
|
||||||
boring_A = mkA "tylsä" ;
|
boring_A = mkA "tylsä" ;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Functor instantiation
|
Functor instantiation
|
||||||
@@ -3614,9 +3629,10 @@ tenses and moods, e.g. the Romance languages.
|
|||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
|
#Lchapsix
|
||||||
|
|
||||||
=Lesson 5: Refining semantics in abstract syntax=
|
=Lesson 5: Refining semantics in abstract syntax=
|
||||||
|
|
||||||
#Lchapsix
|
|
||||||
|
|
||||||
Goals:
|
Goals:
|
||||||
- include semantic conditions in grammars, by using
|
- include semantic conditions in grammars, by using
|
||||||
@@ -3626,7 +3642,7 @@ Goals:
|
|||||||
- semantic definitions
|
- semantic definitions
|
||||||
|
|
||||||
These concepts are inherited from **type theory** (more precisely:
|
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**.
|
Type theory is the basis **logical frameworks**.
|
||||||
|
|
||||||
@@ -3714,49 +3730,25 @@ Concrete syntax does not know if a category is a dependent type.
|
|||||||
```
|
```
|
||||||
Notice that the ``Kind`` argument is suppressed in linearization.
|
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
|
+ context-free parsing
|
||||||
+ filtering through type checker
|
+ 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"
|
> 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)
|
CAction light dim (DKindOne light)
|
||||||
```
|
```
|
||||||
The ``typecheck`` process may fail, in which case an error message
|
However, type-incorrect commands are rejected by the typecheck:
|
||||||
is shown and no tree is returned:
|
|
||||||
```
|
```
|
||||||
> parse "dim the fan" | put_tree -typecheck
|
> parse "dim the fan"
|
||||||
|
The parsing is successful but the type checking failed with error(s):
|
||||||
Error in tree UCommand (CAction ? 0 dim (DKindOne fan)) :
|
Couldn't match expected type Device light
|
||||||
(? 0 <> fan) (? 0 <> light)
|
against the interred type Device fan
|
||||||
|
In the expression: DKindOne fan
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
==Polymorphism==
|
==Polymorphism==
|
||||||
@@ -3782,23 +3774,19 @@ to express Haskell-type library functions:
|
|||||||
\_,_,_,f,x,y -> f y x ;
|
\_,_,_,f,x,y -> f y x ;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
===Dependent types: exercises===
|
===Dependent types: exercises===
|
||||||
|
|
||||||
1. Write an abstract syntax module with above contents
|
1. Write an abstract syntax module with above contents
|
||||||
and an appropriate English concrete syntax. Try to parse the commands
|
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.
|
||||||
2. Perform random and exhaustive generation, with and without
|
|
||||||
``solve`` filtering.
|
|
||||||
|
|
||||||
3. Add some device kinds and actions to the grammar.
|
3. Add some device kinds and actions to the grammar.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
==Proof objects==
|
==Proof objects==
|
||||||
@@ -3908,7 +3896,6 @@ fun
|
|||||||
Classes for new actions can be added incrementally.
|
Classes for new actions can be added incrementally.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
==Variable bindings==
|
==Variable bindings==
|
||||||
@@ -4177,11 +4164,11 @@ Type checking can be invoked with ``put_term -transform=solve``.
|
|||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
|
#Lchapseven
|
||||||
|
|
||||||
==Lesson 6: Grammars of formal languages==
|
==Lesson 6: Grammars of formal languages==
|
||||||
|
|
||||||
|
|
||||||
#Lchapseven
|
|
||||||
|
|
||||||
Goals:
|
Goals:
|
||||||
- write grammars for formal languages (mathematical notation, programming languages)
|
- write grammars for formal languages (mathematical notation, programming languages)
|
||||||
- interface between formal and natural langauges
|
- interface between formal and natural langauges
|
||||||
@@ -4196,6 +4183,7 @@ We construct a calculator with addition, subtraction, multiplication, and
|
|||||||
division of integers.
|
division of integers.
|
||||||
```
|
```
|
||||||
abstract Calculator = {
|
abstract Calculator = {
|
||||||
|
flags startcat = Exp ;
|
||||||
|
|
||||||
cat Exp ;
|
cat Exp ;
|
||||||
|
|
||||||
@@ -4222,7 +4210,7 @@ We begin with a
|
|||||||
concrete syntax that always uses parentheses around binary
|
concrete syntax that always uses parentheses around binary
|
||||||
operator applications:
|
operator applications:
|
||||||
```
|
```
|
||||||
concrete CalculatorP of Calculator = {
|
concrete CalculatorP of Calculator = open Prelude in {
|
||||||
|
|
||||||
lincat
|
lincat
|
||||||
Exp = SS ;
|
Exp = SS ;
|
||||||
@@ -4516,9 +4504,10 @@ point literals as arguments.
|
|||||||
|
|
||||||
#NEW
|
#NEW
|
||||||
|
|
||||||
|
#Lchapeight
|
||||||
|
|
||||||
=Lesson 7: Embedded grammars=
|
=Lesson 7: Embedded grammars=
|
||||||
|
|
||||||
#Lchapeight
|
|
||||||
|
|
||||||
Goals:
|
Goals:
|
||||||
- use grammars as parts of programs written in Haskell and JavaScript
|
- use grammars as parts of programs written in Haskell and JavaScript
|
||||||
@@ -4602,7 +4591,7 @@ in any multilingual grammar between any languages in the grammar.
|
|||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
import PGF
|
import PGF
|
||||||
import System (getArgs)
|
import System.Environment (getArgs)
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
@@ -4639,7 +4628,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:
|
The simplest way to translate is to ``echo`` input to the program:
|
||||||
```
|
```
|
||||||
% echo "this wine is delicious" | ./trans Food.pgf
|
% 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.
|
The result is given in all languages except the input language.
|
||||||
|
|
||||||
@@ -4732,10 +4721,6 @@ abstract Query = {
|
|||||||
|
|
||||||
To make it easy to define a transfer function, we export the
|
To make it easy to define a transfer function, we export the
|
||||||
abstract syntax to a system of Haskell datatypes:
|
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
|
% gf -make --output-format=haskell QueryEng.gf
|
||||||
```
|
```
|
||||||
@@ -4958,12 +4943,12 @@ syntax name. This file contains the multilingual grammar as a JavaScript object.
|
|||||||
===Using the JavaScript grammar===
|
===Using the JavaScript grammar===
|
||||||
|
|
||||||
To perform parsing and linearization, the run-time library
|
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
|
some other JavaScript and HTML files; these files can be used
|
||||||
as templates for building applications.
|
as templates for building applications.
|
||||||
|
|
||||||
An example of usage is
|
An example of usage is
|
||||||
[``translator.html`` http://grammaticalframework.org:41296],
|
[``translator.html`` ../../src/runtime/javascript/translator.html],
|
||||||
which is in fact initialized with
|
which is in fact initialized with
|
||||||
a pointer to the Food grammar, so that it provides translation between the English
|
a pointer to the Food grammar, so that it provides translation between the English
|
||||||
and Italian grammars:
|
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
|
GF character encoding changes
|
||||||
Thomas Hallgren
|
Thomas Hallgren
|
||||||
%%mtime(%F)
|
2013-12-18
|
||||||
|
|
||||||
%!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>
|
|
||||||
|
|
||||||
==Changes to character encodings in GF grammar files ==
|
==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):
|
- Windows (zipped executable):
|
||||||
[``gf-3.1.6-bin-i486-windows.zip`` gf-3.1.6-bin-i486-windows.zip]
|
[``gf-3.1.6-bin-i486-windows.zip`` gf-3.1.6-bin-i486-windows.zip]
|
||||||
(1.6 MB)
|
(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]
|
[``gf-3.1.6-bin-i486-linux.gz`` gf-3.1.6-bin-i486-linux.gz]
|
||||||
(1.7 MB)
|
(1.7 MB)
|
||||||
- compiled library package:
|
- compiled library package:
|
||||||
@@ -25,7 +25,7 @@ GF 3.1.6 released 23 April 2010.
|
|||||||
- full source package (GF system, libraries, examples, documentation):
|
- full source package (GF system, libraries, examples, documentation):
|
||||||
[``gf-3.1.6-src.tar.gz`` gf-3.1.6-src.tar.gz]
|
[``gf-3.1.6-src.tar.gz`` gf-3.1.6-src.tar.gz]
|
||||||
(11 MB)
|
(11 MB)
|
||||||
|
|
||||||
GF is also on [Hackage http://hackage.haskell.org/package/gf]
|
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==
|
==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.
|
It finds the libraries relative to the ``.exe`` file.
|
||||||
|
|
||||||
To install a binary package for MacOS X or Linux: uncompress the executable and
|
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)
|
||||||
194
download/index-3.11.md
Normal file
194
download/index-3.11.md
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
---
|
||||||
|
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).
|
||||||
|
|
||||||
|
For macOS Sequoia, you need to downgrade the LLVM package, see instructions [here](https://github.com/GrammaticalFramework/gf-core/issues/172#issuecomment-2599365457).
|
||||||
|
|
||||||
|
## 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)
|
||||||
191
download/index-3.12.md
Normal file
191
download/index-3.12.md
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
---
|
||||||
|
title: Grammatical Framework Download and Installation
|
||||||
|
date: 8 August 2025
|
||||||
|
---
|
||||||
|
|
||||||
|
**GF 3.12** was released on 8 August 2025.
|
||||||
|
|
||||||
|
What's new? See the [release notes](release-3.12.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-the-rgl-from-a-binary-release).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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
|
||||||
|
- Python bindings to the C run-time system
|
||||||
|
|
||||||
|
[Binary packages on GitHub](https://github.com/GrammaticalFramework/gf-core/releases/tag/release-3.12)
|
||||||
|
|
||||||
|
#### Debian/Ubuntu
|
||||||
|
|
||||||
|
The package targets Ubuntu 24.04 (Noble).
|
||||||
|
To install it, use:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt install ./gf-3.12-ubuntu-24.04.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
|
||||||
|
If you are on an Intel Mac (2019 or older), use `gf-3.12-macos-intel.pkg`.<br>
|
||||||
|
For newer ARM-based Macs (Apple Silicon M1, M2, M3), use `gf-3.12-macos-arm.pkg`.
|
||||||
|
|
||||||
|
After downloading, right click on the file and click on Open.[^1]
|
||||||
|
You will see a dialog saying that "macOS cannot verify the developer of "gf-3.12-macos-intel.pkg". Are you sure you want to open it?".
|
||||||
|
Press Open.
|
||||||
|
|
||||||
|
[^1]: If you just double click on the file, you will get an error message "gf-3.12-macos-intel.pkg" cannot be opened because it is from an unidentified developer.
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
To install the package:
|
||||||
|
|
||||||
|
1. unpack it anywhere and take note of the full path to the folder containing the `.exe` file.
|
||||||
|
2. add it to the `PATH` environment variable
|
||||||
|
|
||||||
|
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.12
|
||||||
|
```
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
|
#### GHC version
|
||||||
|
|
||||||
|
The GF source code is known to be compilable with GHC versions 7.10 through to 9.6.7.
|
||||||
|
|
||||||
|
#### Obtaining Haskell
|
||||||
|
|
||||||
|
There are various ways of obtaining Haskell, including:
|
||||||
|
|
||||||
|
- ghcup
|
||||||
|
1. Install from https://www.haskell.org/ghcup/
|
||||||
|
2. `ghcup install ghc 9.6.7`
|
||||||
|
3. `ghcup set ghc 9.6.7`
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
If this doesn't work, you will need to install the C runtime manually; see the instructions [here](https://www.grammaticalframework.org/doc/gf-developers.html#toc12).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
For more information, see [Using GF on Windows](https://www.grammaticalframework.org/~inari/gf-windows.html) (latest updated for Windows 10).
|
||||||
|
|
||||||
|
## 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.11](index-3.11.html) (July 2021)
|
||||||
|
- [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
|
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.
|
**GF 3.2.9** source-only snapshot was released on 12 September 2011.
|
||||||
|
|
||||||
What's new? Faster grammar compilation!
|
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.2 index-3.2.html] (December 2011).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.2** was released on 23 December 2010.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.2.html].
|
What's new? See the [Release notes release-3.2.html].
|
||||||
@@ -27,7 +22,7 @@ More packages might be added later.
|
|||||||
|
|
||||||
===Notes===
|
===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.
|
It finds the libraries relative to the ``.exe`` file.
|
||||||
|
|
||||||
The ``.deb`` packages work on Ubuntu 10.04 and 10.10.
|
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.
|
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
|
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.
|
**GF 3.3.3** was released on 3 March 2012.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.3.3.html].
|
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===
|
===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.
|
It finds the libraries relative to the ``.exe`` file.
|
||||||
|
|
||||||
%The ``.deb`` packages work on Ubuntu 10.04 and 10.10.
|
%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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.3** was released on 27 October 2011.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.3.html].
|
What's new? See the [Release notes release-3.3.html].
|
||||||
@@ -27,7 +22,7 @@ More packages might be added later.
|
|||||||
|
|
||||||
===Notes===
|
===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.
|
It finds the libraries relative to the ``.exe`` file.
|
||||||
|
|
||||||
%The ``.deb`` packages work on Ubuntu 10.04 and 10.10.
|
%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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.4** was released on 31 January 2013.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.4.html].
|
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 ...``
|
| 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 (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``
|
| 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] |
|
| Windows | [gf-3.4-bin-windows.zip gf-3.4-bin-windows.zip] | -
|
||||||
%| ... | ... | ...
|
|
||||||
|
|
||||||
%More binary packages might be added later.
|
|
||||||
|
|
||||||
===Notes===
|
===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.
|
%It finds the libraries relative to the ``.exe`` file.
|
||||||
|
|
||||||
The ``.deb`` packages work on Ubuntu 12.04, 12.10 and 13.04.
|
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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.5** was released on 6 August 2013.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.5.html].
|
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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.6** was released on 23 June 2014.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.6.html].
|
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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.7.1** was released on 2 October 2015.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.7.1.html].
|
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).
|
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``
|
``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``.
|
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``,
|
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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.7** was released on 25 June 2015.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.7.html].
|
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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.8** was released on 22 June 2016.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.8.html].
|
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).
|
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``
|
``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``.
|
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``,
|
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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [GF 3.1 old-index.html] (December 2009).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
Grammatical Framework Download and Installation
|
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.
|
**GF 3.9** was released on 11 August 2017.
|
||||||
|
|
||||||
What's new? See the [Release notes release-3.9.html].
|
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.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``
|
| 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 ...``
|
%| 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 (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``
|
| 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``
|
| 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``
|
%| 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.2 index-3.2.html] (December 2010).
|
||||||
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
- [GF 3.1.6 index-3.1.6.html] (April 2010).
|
||||||
- [GF 3.1 old-index.html] (December 2009).
|
- [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.12.html" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
You are being redirected to <a href="index-3.12.html">the current version</a> of this page.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -5,13 +5,13 @@ GF Version 3.1.6 Release Notes
|
|||||||
=Installation=
|
=Installation=
|
||||||
|
|
||||||
The binaries now work out of the box for each platform and support
|
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.
|
changed to haskeline.
|
||||||
|
|
||||||
To compile from source, GHC 6.12 is now required. But GHC is not needed
|
To compile from source, GHC 6.12 is now required. But GHC is not needed
|
||||||
if the binary executables are used.
|
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
|
with 3.1.6 and must either be removed; alternatively, the ``-src`` flag can be
|
||||||
used when compiling.
|
used when compiling.
|
||||||
|
|
||||||
@@ -24,8 +24,8 @@ Grammar language
|
|||||||
- improved support for dependent types (see ``SUMO``, ``nqueens`` in ``examples``)
|
- improved support for dependent types (see ``SUMO``, ``nqueens`` in ``examples``)
|
||||||
|
|
||||||
|
|
||||||
Shell commands and options (see ``help`` in GF for more information)
|
Shell commands and options (see ``help`` in GF for more information)
|
||||||
- ``eb``: example-based grammar file conversion
|
- ``eb``: example-based grammar file conversion
|
||||||
(see ``examples/animals/QuestionI.gf``)
|
(see ``examples/animals/QuestionI.gf``)
|
||||||
- ``vd = visualize_dependency``: show dependency tree
|
- ``vd = visualize_dependency``: show dependency tree
|
||||||
- ``vp = visualize_parse``: show parse tree
|
- ``vp = visualize_parse``: show parse tree
|
||||||
@@ -57,8 +57,3 @@ Internal
|
|||||||
|
|
||||||
Javascript generation is not updated to the new PGF format.
|
Javascript generation is not updated to the new PGF format.
|
||||||
[GF 3.1 old-index.html] should still be used for building Javascript applications.
|
[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.
|
||||||
37
download/release-3.12.md
Normal file
37
download/release-3.12.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
title: GF 3.12 Release Notes
|
||||||
|
date: 08 August 2025
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
See the [download page](index-3.12.html).
|
||||||
|
|
||||||
|
## What's new
|
||||||
|
This release adds support for Apple Silicon M1 Mac computers and newer versions of GHC, along with various improvements and bug fixes.
|
||||||
|
|
||||||
|
Over 70 commits have been merged to gf-core since the release of GF 3.11 in July 2021.
|
||||||
|
|
||||||
|
## General
|
||||||
|
- Support for ARM, allowing to run GF on Mac computers with Apple Silicon M1
|
||||||
|
- Support for newer versions of GHC (8.10.7, 9.0.2, 9.2.4, 9.4, 9.6.7)
|
||||||
|
- Support compiling with Nix
|
||||||
|
- Better error messages
|
||||||
|
- Improvements to several GF shell commands
|
||||||
|
- Several bug fixes and performance improvements
|
||||||
|
- Temporarily dropped support for Java bindings
|
||||||
|
|
||||||
|
## GF compiler and run-time library
|
||||||
|
- Syntactic sugar for table update: `table {cases ; vvv => t \! vvv}.t` can now be written as `t ** { cases }`
|
||||||
|
- Adjust the `-view` command depending on the OS
|
||||||
|
- Improve output of the `visualize_dependencies` (`vd`) command for large dependency trees
|
||||||
|
- Reintroduce syntactic transfer with `pt -transfer` and fix a bug in `pt -compute`
|
||||||
|
- Bug fix: apply `gt` to all arguments when piped
|
||||||
|
- Fix many "Invalid character" messages by always encoding GF files in UTF-8
|
||||||
|
- Improve performance with long extend-lists
|
||||||
|
- Improve syntax error messages
|
||||||
|
- Add support for BIND tokens in the Python bindings
|
||||||
|
- Allow compilation with emscripten
|
||||||
|
|
||||||
|
## Other
|
||||||
|
- Add support for Visual Studio Code
|
||||||
@@ -1,9 +1,6 @@
|
|||||||
GF Version 3.2 Release Notes
|
GF Version 3.2 Release Notes
|
||||||
December 2010
|
December 2010
|
||||||
|
|
||||||
%!style:../css/style.css
|
|
||||||
%!postproc(html): <H1> <H1><IMG src="../doc/Logos/gf0.png">
|
|
||||||
|
|
||||||
==Installation==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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
|
- GF compiler: GPL
|
||||||
- Run-time libraries and Resource Grammar Library: LGPL + BSD
|
- 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
|
GF Version 3.3.3 Release Notes
|
||||||
March 2012
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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``,
|
- Fix for a bug that prevented the shell commands ``abstract_info``,
|
||||||
``generate_random`` and ``generate_trees`` from working properly.
|
``generate_random`` and ``generate_trees`` from working properly.
|
||||||
- Various other small improvements and bug fixes.
|
- Various other small improvements and bug fixes.
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,17 +1,13 @@
|
|||||||
GF Version 3.3 Release Notes
|
GF Version 3.3 Release Notes
|
||||||
October 2011
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
See the [download page http://www.grammaticalframework.org/download/index.html].
|
||||||
|
|
||||||
==New features==
|
==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]``.
|
header syntax ``instance Foo of Bar - [f,g,h]``.
|
||||||
- New functionalities in GF shell commands (more information with ``help`` command-name).
|
- New functionalities in GF shell commands (more information with ``help`` command-name).
|
||||||
- ``aw`` = ``align_words`` option ``-giza`` prints word alignments in Giza++ format.
|
- ``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.
|
and the web-based grammar editor.
|
||||||
- Faster grammar compilation (also included in the GF 3.2.9 source-only
|
- Faster grammar compilation (also included in the GF 3.2.9 source-only
|
||||||
snapshot).
|
snapshot).
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
GF Version 3.4 Release Notes
|
GF Version 3.4 Release Notes
|
||||||
January 2013
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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
|
- Some new functionality in the web-based grammar editor, e.g. preliminary
|
||||||
support for public grammars.
|
support for public grammars.
|
||||||
- Various other small improvements and bug fixes.
|
- Various other small improvements and bug fixes.
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
GF 3.5 Release Notes
|
GF 3.5 Release Notes
|
||||||
August 2013
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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].
|
[``network-2.4.1.1`` https://github.com/haskell/network/commit/f2168b1f8978b4ad9c504e545755f0795ac869ce].
|
||||||
- Various other small improvements and bug fixes.
|
- Various other small improvements and bug fixes.
|
||||||
%- [...]
|
%- [...]
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
GF 3.6 Release Notes
|
GF 3.6 Release Notes
|
||||||
June 2014
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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//.
|
as ``--# -coding=``//enc//, instead of ``flags coding=``//enc//.
|
||||||
See the separate document
|
See the separate document
|
||||||
[GF character encoding changes encoding-change.html] for more details.
|
[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
|
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
|
overlapping assignments in ``r`` and ``s`` were not supported, and their behaviour was
|
||||||
unpredictable.
|
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
|
- ``c-wordforword``: this works as ``c-translate`` but does a
|
||||||
word-for-word lookup to create a (potentially very low quality)
|
word-for-word lookup to create a (potentially very low quality)
|
||||||
translation that can be used if all else fails.
|
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
|
GF 3.7.1 Release Notes
|
||||||
October 2015
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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====
|
====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"``
|
``cc -trace mkV "debug"``
|
||||||
|
|
||||||
to see a trace of all opers with their arguments and results during the
|
to see a trace of all opers with their arguments and results during the
|
||||||
computation of ``mkV "debug"``.
|
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``.
|
from the GF shell by starting GF with ``gf -cshell`` or ``gf -crun``.
|
||||||
Only limited functionality is available when running the shell in these
|
Only limited functionality is available when running the shell in these
|
||||||
modes (use the ``help`` command in the shell for details):
|
modes (use the ``help`` command in the shell for details):
|
||||||
|
|
||||||
- You can only import ``.pgf`` files, not source files.
|
- You can only import ``.pgf`` files, not source files.
|
||||||
- The ``-retain`` flag can not be used and the commands that require it to
|
- The ``-retain`` flag can not be used and the commands that require it to
|
||||||
work are not available.
|
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.
|
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
|
This means that the output is left in a format that can be parsed in
|
||||||
a subsequent request.
|
a subsequent request.
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
[www.grammaticalframework.org http://www.grammaticalframework.org]
|
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
GF 3.7 Release Notes
|
GF 3.7 Release Notes
|
||||||
June 2015
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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
|
``BIND``, ``SOFT_BIND``, ``SOFT_SPACE``, ``CAPIT``, ``ALL_CAPIT`` and
|
||||||
``nonExist``.
|
``nonExist``.
|
||||||
- It is now possible to define callbacks for literals from the Haskell
|
- 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.
|
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.
|
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
|
- 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.
|
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
|
GF 3.8 Release Notes
|
||||||
June 2016
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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
|
[universal dependency http://universaldependencies.org/] diagrams
|
||||||
in various formats, see ``help vd``.
|
in various formats, see ``help vd``.
|
||||||
- The C runtime now includes an experimental library for managing
|
- 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,
|
a grammar. Since the ontology is based on an abstract syntax,
|
||||||
it is language independent by design. For now the library is
|
it is language independent by design. For now the library is
|
||||||
only used in the GF Offline Translator. The library uses
|
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.
|
translations in the domain they cover.
|
||||||
You can change the order in which the selected grammars are tried
|
You can change the order in which the selected grammars are tried
|
||||||
by dragging them up and down in the list.
|
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
|
GF 3.9 Release Notes
|
||||||
August 2017
|
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==
|
==Installation==
|
||||||
|
|
||||||
See the [download page http://www.grammaticalframework.org/download/index.html].
|
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.
|
- 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.
|
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
|
- PGF service: support for language-specific depencency configurations in
|
||||||
``command=deptree``.
|
``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 |
43
flake.lock
generated
Normal file
43
flake.lock
generated
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1704290814,
|
||||||
|
"narHash": "sha256-LWvKHp7kGxk/GEtlrGYV68qIvPHkU9iToomNFGagixU=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "70bdadeb94ffc8806c0570eb5c2695ad29f0e421",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-23.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"systems": "systems"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
50
flake.nix
Normal file
50
flake.nix
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05";
|
||||||
|
systems.url = "github:nix-systems/default";
|
||||||
|
};
|
||||||
|
|
||||||
|
nixConfig = {
|
||||||
|
# extra-trusted-public-keys =
|
||||||
|
# "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=";
|
||||||
|
# extra-substituters = "https://devenv.cachix.org";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, systems, ... }@inputs:
|
||||||
|
let forEachSystem = nixpkgs.lib.genAttrs (import systems);
|
||||||
|
in {
|
||||||
|
packages = forEachSystem (system:
|
||||||
|
let
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
haskellPackages = pkgs.haskell.packages.ghc925.override {
|
||||||
|
overrides = self: _super: {
|
||||||
|
cgi = pkgs.haskell.lib.unmarkBroken (pkgs.haskell.lib.dontCheck
|
||||||
|
(self.callHackage "cgi" "3001.5.0.1" { }));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
in {
|
||||||
|
gf = pkgs.haskell.lib.overrideCabal
|
||||||
|
(haskellPackages.callCabal2nixWithOptions "gf" self "--flag=-server"
|
||||||
|
{ }) (_old: {
|
||||||
|
# Fix utf8 encoding problems
|
||||||
|
patches = [
|
||||||
|
# Already applied in master
|
||||||
|
# (
|
||||||
|
# pkgs.fetchpatch {
|
||||||
|
# url = "https://github.com/anka-213/gf-core/commit/6f1ca05fddbcbc860898ddf10a557b513dfafc18.patch";
|
||||||
|
# sha256 = "17vn3hncxm1dwbgpfmrl6gk6wljz3r28j191lpv5zx741pmzgbnm";
|
||||||
|
# }
|
||||||
|
# )
|
||||||
|
./nix/expose-all.patch
|
||||||
|
./nix/revert-new-cabal-madness.patch
|
||||||
|
];
|
||||||
|
jailbreak = true;
|
||||||
|
# executableSystemDepends = [
|
||||||
|
# (pkgs.ncurses.override { enableStatic = true; })
|
||||||
|
# ];
|
||||||
|
# executableHaskellDepends = [ ];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ concrete FoodIta of Food = {
|
|||||||
lincat
|
lincat
|
||||||
Comment, Item, Kind, Quality = Str ;
|
Comment, Item, Kind, Quality = Str ;
|
||||||
lin
|
lin
|
||||||
Pred item quality = item ++ "è" ++ quality ;
|
Pred item quality = item ++ "è" ++ quality ;
|
||||||
This kind = "questo" ++ kind ;
|
This kind = "questo" ++ kind ;
|
||||||
That kind = "quel" ++ kind ;
|
That kind = "quel" ++ kind ;
|
||||||
Mod quality kind = kind ++ quality ;
|
Mod quality kind = kind ++ quality ;
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ resource ResIta = open Prelude in {
|
|||||||
in
|
in
|
||||||
adjective nero (ner+"a") (ner+"i") (ner+"e") ;
|
adjective nero (ner+"a") (ner+"i") (ner+"e") ;
|
||||||
copula : Number => Str =
|
copula : Number => Str =
|
||||||
table {Sg => "è" ; Pl => "sono"} ;
|
table {Sg => "è" ; Pl => "sono"} ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ instance LexFoodsFin of LexFoods =
|
|||||||
cheese_N = mkN "juusto" ;
|
cheese_N = mkN "juusto" ;
|
||||||
fish_N = mkN "kala" ;
|
fish_N = mkN "kala" ;
|
||||||
fresh_A = mkA "tuore" ;
|
fresh_A = mkA "tuore" ;
|
||||||
warm_A = mkA
|
warm_A = mkA
|
||||||
(mkN "lämmin" "lämpimän" "lämmintä" "lämpimänä" "lämpimään"
|
(mkN "lämmin" "lämpimän" "lämmintä" "lämpimänä" "lämpimään"
|
||||||
"lämpiminä" "lämpimiä" "lämpimien" "lämpimissä" "lämpimiin"
|
"lämpiminä" "lämpimiä" "lämpimien" "lämpimissä" "lämpimiin"
|
||||||
)
|
)
|
||||||
"lämpimämpi" "lämpimin" ;
|
"lämpimämpi" "lämpimin" ;
|
||||||
italian_A = mkA "italialainen" ;
|
italian_A = mkA "italialainen" ;
|
||||||
expensive_A = mkA "kallis" ;
|
expensive_A = mkA "kallis" ;
|
||||||
delicious_A = mkA "herkullinen" ;
|
delicious_A = mkA "herkullinen" ;
|
||||||
boring_A = mkA "tylsä" ;
|
boring_A = mkA "tylsä" ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
-- (c) 2009 Aarne Ranta under LGPL
|
-- (c) 2009 Aarne Ranta under LGPL
|
||||||
|
|
||||||
instance LexFoodsGer of LexFoods =
|
instance LexFoodsGer of LexFoods =
|
||||||
open SyntaxGer, ParadigmsGer in {
|
open SyntaxGer, ParadigmsGer in {
|
||||||
oper
|
oper
|
||||||
wine_N = mkN "Wein" ;
|
wine_N = mkN "Wein" ;
|
||||||
pizza_N = mkN "Pizza" "Pizzen" feminine ;
|
pizza_N = mkN "Pizza" "Pizzen" feminine ;
|
||||||
cheese_N = mkN "Käse" "Käse" masculine ;
|
cheese_N = mkN "Käse" "Käse" masculine ;
|
||||||
fish_N = mkN "Fisch" ;
|
fish_N = mkN "Fisch" ;
|
||||||
fresh_A = mkA "frisch" ;
|
fresh_A = mkA "frisch" ;
|
||||||
warm_A = mkA "warm" "wärmer" "wärmste" ;
|
warm_A = mkA "warm" "wärmer" "wärmste" ;
|
||||||
italian_A = mkA "italienisch" ;
|
italian_A = mkA "italienisch" ;
|
||||||
expensive_A = mkA "teuer" ;
|
expensive_A = mkA "teuer" ;
|
||||||
delicious_A = mkA "köstlich" ;
|
delicious_A = mkA "köstlich" ;
|
||||||
boring_A = mkA "langweilig" ;
|
boring_A = mkA "langweilig" ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ instance LexFoodsSwe of LexFoods =
|
|||||||
pizza_N = mkN "pizza" ;
|
pizza_N = mkN "pizza" ;
|
||||||
cheese_N = mkN "ost" ;
|
cheese_N = mkN "ost" ;
|
||||||
fish_N = mkN "fisk" ;
|
fish_N = mkN "fisk" ;
|
||||||
fresh_A = mkA "färsk" ;
|
fresh_A = mkA "färsk" ;
|
||||||
warm_A = mkA "varm" ;
|
warm_A = mkA "varm" ;
|
||||||
italian_A = mkA "italiensk" ;
|
italian_A = mkA "italiensk" ;
|
||||||
expensive_A = mkA "dyr" ;
|
expensive_A = mkA "dyr" ;
|
||||||
delicious_A = mkA "läcker" ;
|
delicious_A = mkA "läcker" ;
|
||||||
boring_A = mkA "tråkig" ;
|
boring_A = mkA "tråkig" ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ concrete QueryFin of Query = {
|
|||||||
Odd = pred "pariton" ;
|
Odd = pred "pariton" ;
|
||||||
Prime = pred "alkuluku" ;
|
Prime = pred "alkuluku" ;
|
||||||
Number i = i.s ;
|
Number i = i.s ;
|
||||||
Yes = "kyllä" ;
|
Yes = "kyllä" ;
|
||||||
No = "ei" ;
|
No = "ei" ;
|
||||||
oper
|
oper
|
||||||
pred : Str -> Str -> Str = \f,x -> "onko" ++ x ++ f ;
|
pred : Str -> Str -> Str = \f,x -> "onko" ++ x ++ f ;
|
||||||
|
|||||||
@@ -43,10 +43,10 @@ oper
|
|||||||
} ;
|
} ;
|
||||||
|
|
||||||
auxVerb : Aux -> Verb = \a -> case a of {
|
auxVerb : Aux -> Verb = \a -> case a of {
|
||||||
Avere =>
|
Avere =>
|
||||||
mkVerb "avere" "ho" "hai" "ha" "abbiamo" "avete" "hanno" "avuto" Avere ;
|
mkVerb "avere" "ho" "hai" "ha" "abbiamo" "avete" "hanno" "avuto" Avere ;
|
||||||
Essere =>
|
Essere =>
|
||||||
mkVerb "essere" "sono" "sei" "è" "siamo" "siete" "sono" "stato" Essere
|
mkVerb "essere" "sono" "sei" "è" "siamo" "siete" "sono" "stato" Essere
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
agrPart : Verb -> Agr -> ClitAgr -> Str = \v,a,c -> case v.aux of {
|
agrPart : Verb -> Agr -> ClitAgr -> Str = \v,a,c -> case v.aux of {
|
||||||
|
|||||||
205
gf.cabal
205
gf.cabal
@@ -1,19 +1,24 @@
|
|||||||
name: gf
|
name: gf
|
||||||
version: 3.10
|
version: 3.12.0
|
||||||
|
|
||||||
cabal-version: >= 1.22
|
cabal-version: 1.22
|
||||||
build-type: Custom
|
build-type: Simple
|
||||||
license: OtherLicense
|
license: OtherLicense
|
||||||
license-file: LICENSE
|
license-file: LICENSE
|
||||||
category: Natural Language Processing, Compiler
|
category: Natural Language Processing, Compiler
|
||||||
synopsis: Grammatical Framework
|
synopsis: Grammatical Framework
|
||||||
description: GF, Grammatical Framework, is a programming language for multilingual grammar applications
|
description: GF, Grammatical Framework, is a programming language for multilingual grammar applications
|
||||||
homepage: http://www.grammaticalframework.org/
|
maintainer: John J. Camilleri <john@digitalgrammars.com>
|
||||||
|
homepage: https://www.grammaticalframework.org/
|
||||||
bug-reports: https://github.com/GrammaticalFramework/gf-core/issues
|
bug-reports: https://github.com/GrammaticalFramework/gf-core/issues
|
||||||
maintainer: Thomas Hallgren
|
tested-with: GHC==7.10.3, GHC==8.0.2, GHC==8.10.4, GHC==9.0.2, GHC==9.2.4, GHC==9.6.7
|
||||||
tested-with: GHC==7.6.3, GHC==7.8.3, GHC==7.10.3, GHC==8.0.2
|
|
||||||
|
|
||||||
data-dir: src
|
data-dir: src
|
||||||
|
extra-source-files:
|
||||||
|
README.md
|
||||||
|
CHANGELOG.md
|
||||||
|
WebSetup.hs
|
||||||
|
doc/Logos/gf0.png
|
||||||
data-files:
|
data-files:
|
||||||
www/*.html
|
www/*.html
|
||||||
www/*.css
|
www/*.css
|
||||||
@@ -39,25 +44,17 @@ data-files:
|
|||||||
www/translator/*.css
|
www/translator/*.css
|
||||||
www/translator/*.js
|
www/translator/*.js
|
||||||
|
|
||||||
custom-setup
|
|
||||||
setup-depends:
|
|
||||||
base,
|
|
||||||
Cabal >=1.22.0.0,
|
|
||||||
directory,
|
|
||||||
filepath,
|
|
||||||
process >=1.0.1.1
|
|
||||||
|
|
||||||
source-repository head
|
source-repository head
|
||||||
type: git
|
type: git
|
||||||
location: https://github.com/GrammaticalFramework/gf-core.git
|
location: https://github.com/GrammaticalFramework/gf-core.git
|
||||||
|
|
||||||
flag interrupt
|
flag interrupt
|
||||||
Description: Enable Ctrl+Break in the shell
|
Description: Enable Ctrl+Break in the shell
|
||||||
Default: True
|
Default: True
|
||||||
|
|
||||||
flag server
|
flag server
|
||||||
Description: Include --server mode
|
Description: Include --server mode
|
||||||
Default: True
|
Default: True
|
||||||
|
|
||||||
flag network-uri
|
flag network-uri
|
||||||
description: Get Network.URI from the network-uri package
|
description: Get Network.URI from the network-uri package
|
||||||
@@ -69,19 +66,29 @@ flag network-uri
|
|||||||
|
|
||||||
flag c-runtime
|
flag c-runtime
|
||||||
Description: Include functionality from the C run-time library (which must be installed already)
|
Description: Include functionality from the C run-time library (which must be installed already)
|
||||||
Default: False
|
Default: False
|
||||||
|
|
||||||
|
library
|
||||||
|
default-language: Haskell2010
|
||||||
|
build-depends:
|
||||||
|
-- GHC 8.0.2 to GHC 8.10.4
|
||||||
|
array >= 0.5.1 && < 0.6,
|
||||||
|
base >= 4.9.1 && < 4.22,
|
||||||
|
bytestring >= 0.10.8 && < 0.12,
|
||||||
|
containers >= 0.5.7 && < 0.7,
|
||||||
|
exceptions >= 0.8.3 && < 0.11,
|
||||||
|
ghc-prim >= 0.5.0 && <= 0.10.0,
|
||||||
|
mtl >= 2.2.1 && <= 2.3.1,
|
||||||
|
pretty >= 1.1.3 && < 1.2,
|
||||||
|
random >= 1.1 && < 1.3,
|
||||||
|
utf8-string >= 1.0.1.1 && < 1.1
|
||||||
|
|
||||||
|
if impl(ghc<8.0)
|
||||||
|
build-depends:
|
||||||
|
-- We need this in order for ghc-7.10 to build
|
||||||
|
transformers-compat >= 0.6.3 && < 0.7,
|
||||||
|
fail >= 4.9.0 && < 4.10
|
||||||
|
|
||||||
Library
|
|
||||||
default-language: Haskell2010
|
|
||||||
build-depends: base >= 4.6 && <5,
|
|
||||||
array,
|
|
||||||
containers,
|
|
||||||
bytestring,
|
|
||||||
utf8-string,
|
|
||||||
random,
|
|
||||||
pretty,
|
|
||||||
mtl,
|
|
||||||
exceptions
|
|
||||||
hs-source-dirs: src/runtime/haskell
|
hs-source-dirs: src/runtime/haskell
|
||||||
|
|
||||||
other-modules:
|
other-modules:
|
||||||
@@ -96,8 +103,7 @@ Library
|
|||||||
--ghc-options: -fwarn-unused-imports
|
--ghc-options: -fwarn-unused-imports
|
||||||
--if impl(ghc>=7.8)
|
--if impl(ghc>=7.8)
|
||||||
-- ghc-options: +RTS -A20M -RTS
|
-- ghc-options: +RTS -A20M -RTS
|
||||||
ghc-prof-options: -fprof-auto
|
-- ghc-prof-options: -fprof-auto
|
||||||
extensions:
|
|
||||||
|
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
PGF
|
PGF
|
||||||
@@ -131,18 +137,29 @@ Library
|
|||||||
|
|
||||||
if flag(c-runtime)
|
if flag(c-runtime)
|
||||||
exposed-modules: PGF2
|
exposed-modules: PGF2
|
||||||
other-modules: PGF2.FFI PGF2.Expr PGF2.Type
|
other-modules:
|
||||||
GF.Interactive2 GF.Command.Commands2
|
PGF2.FFI
|
||||||
hs-source-dirs: src/runtime/haskell-bind
|
PGF2.Expr
|
||||||
build-tools: hsc2hs
|
PGF2.Type
|
||||||
|
GF.Interactive2
|
||||||
|
GF.Command.Commands2
|
||||||
|
hs-source-dirs: src/runtime/haskell-bind
|
||||||
|
build-tools: hsc2hs
|
||||||
extra-libraries: pgf gu
|
extra-libraries: pgf gu
|
||||||
c-sources: src/runtime/haskell-bind/utils.c
|
c-sources: src/runtime/haskell-bind/utils.c
|
||||||
cc-options: -std=c99
|
cc-options: -std=c99
|
||||||
|
|
||||||
---- GF compiler as a library:
|
---- GF compiler as a library:
|
||||||
|
|
||||||
build-depends: filepath, directory, time, time-compat, old-locale,
|
build-depends:
|
||||||
process, haskeline, parallel>=3
|
directory >= 1.3.0 && < 1.4,
|
||||||
|
filepath >= 1.4.1 && < 1.5,
|
||||||
|
haskeline >= 0.7.3 && < 0.9,
|
||||||
|
json >= 0.9.1 && <= 0.11,
|
||||||
|
parallel >= 3.2.1.1 && < 3.3,
|
||||||
|
process >= 1.4.3 && < 1.7,
|
||||||
|
time >= 1.6.0 && <= 1.12.2,
|
||||||
|
template-haskell >= 2.13.0.0 && < 2.21
|
||||||
|
|
||||||
hs-source-dirs: src/compiler
|
hs-source-dirs: src/compiler
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
@@ -150,14 +167,22 @@ Library
|
|||||||
GF.Support
|
GF.Support
|
||||||
GF.Text.Pretty
|
GF.Text.Pretty
|
||||||
GF.Text.Lexing
|
GF.Text.Lexing
|
||||||
|
GF.Grammar.Canonical
|
||||||
|
|
||||||
other-modules:
|
other-modules:
|
||||||
GF.Main GF.Compiler GF.Interactive
|
GF.Main
|
||||||
|
GF.Compiler
|
||||||
|
GF.Interactive
|
||||||
|
|
||||||
GF.Compile GF.CompileInParallel GF.CompileOne GF.Compile.GetGrammar
|
GF.Compile
|
||||||
|
GF.CompileInParallel
|
||||||
|
GF.CompileOne
|
||||||
|
GF.Compile.GetGrammar
|
||||||
GF.Grammar
|
GF.Grammar
|
||||||
|
|
||||||
GF.Data.Operations GF.Infra.Option GF.Infra.UseIO
|
GF.Data.Operations
|
||||||
|
GF.Infra.Option
|
||||||
|
GF.Infra.UseIO
|
||||||
|
|
||||||
GF.Command.Abstract
|
GF.Command.Abstract
|
||||||
GF.Command.CommandInfo
|
GF.Command.CommandInfo
|
||||||
@@ -172,9 +197,7 @@ Library
|
|||||||
GF.Command.TreeOperations
|
GF.Command.TreeOperations
|
||||||
GF.Compile.CFGtoPGF
|
GF.Compile.CFGtoPGF
|
||||||
GF.Compile.CheckGrammar
|
GF.Compile.CheckGrammar
|
||||||
GF.Compile.Compute.AppPredefined
|
GF.Compile.Compute.Concrete
|
||||||
GF.Compile.Compute.ConcreteNew
|
|
||||||
-- GF.Compile.Compute.ConcreteNew1
|
|
||||||
GF.Compile.Compute.Predef
|
GF.Compile.Compute.Predef
|
||||||
GF.Compile.Compute.Value
|
GF.Compile.Compute.Value
|
||||||
GF.Compile.ExampleBased
|
GF.Compile.ExampleBased
|
||||||
@@ -188,7 +211,10 @@ Library
|
|||||||
GF.Compile.PGFtoJava
|
GF.Compile.PGFtoJava
|
||||||
GF.Haskell
|
GF.Haskell
|
||||||
GF.Compile.ConcreteToHaskell
|
GF.Compile.ConcreteToHaskell
|
||||||
|
GF.Compile.GrammarToCanonical
|
||||||
|
GF.Grammar.CanonicalJSON
|
||||||
GF.Compile.PGFtoJS
|
GF.Compile.PGFtoJS
|
||||||
|
GF.Compile.PGFtoJSON
|
||||||
GF.Compile.PGFtoProlog
|
GF.Compile.PGFtoProlog
|
||||||
GF.Compile.PGFtoPython
|
GF.Compile.PGFtoPython
|
||||||
GF.Compile.ReadFiles
|
GF.Compile.ReadFiles
|
||||||
@@ -200,7 +226,6 @@ Library
|
|||||||
GF.Compile.TypeCheck.Concrete
|
GF.Compile.TypeCheck.Concrete
|
||||||
GF.Compile.TypeCheck.ConcreteNew
|
GF.Compile.TypeCheck.ConcreteNew
|
||||||
GF.Compile.TypeCheck.Primitives
|
GF.Compile.TypeCheck.Primitives
|
||||||
GF.Compile.TypeCheck.RConcrete
|
|
||||||
GF.Compile.TypeCheck.TC
|
GF.Compile.TypeCheck.TC
|
||||||
GF.Compile.Update
|
GF.Compile.Update
|
||||||
GF.Data.BacktrackM
|
GF.Data.BacktrackM
|
||||||
@@ -267,12 +292,17 @@ Library
|
|||||||
cpp-options: -DC_RUNTIME
|
cpp-options: -DC_RUNTIME
|
||||||
|
|
||||||
if flag(server)
|
if flag(server)
|
||||||
build-depends: httpd-shed>=0.4.0.3, network>=2.3 && <2.7, json,
|
build-depends:
|
||||||
cgi>=3001.2.2.0
|
cgi >= 3001.3.0.2 && < 3001.6,
|
||||||
|
httpd-shed >= 0.4.0 && < 0.5,
|
||||||
|
network>=2.3 && <3.2
|
||||||
if flag(network-uri)
|
if flag(network-uri)
|
||||||
build-depends: network-uri>=2.6, network>=2.6
|
build-depends:
|
||||||
|
network-uri >= 2.6.1.0 && < 2.7,
|
||||||
|
network>=2.6 && <3.2
|
||||||
else
|
else
|
||||||
build-depends: network<2.6
|
build-depends:
|
||||||
|
network >= 2.5 && <3.2
|
||||||
|
|
||||||
cpp-options: -DSERVER_MODE
|
cpp-options: -DSERVER_MODE
|
||||||
other-modules:
|
other-modules:
|
||||||
@@ -287,7 +317,12 @@ Library
|
|||||||
CGIUtils
|
CGIUtils
|
||||||
Cache
|
Cache
|
||||||
Fold
|
Fold
|
||||||
hs-source-dirs: src/server src/server/transfer
|
ExampleDemo
|
||||||
|
ExampleService
|
||||||
|
hs-source-dirs:
|
||||||
|
src/server
|
||||||
|
src/server/transfer
|
||||||
|
src/example-based
|
||||||
|
|
||||||
if flag(interrupt)
|
if flag(interrupt)
|
||||||
cpp-options: -DUSE_INTERRUPT
|
cpp-options: -DUSE_INTERRUPT
|
||||||
@@ -296,26 +331,41 @@ Library
|
|||||||
other-modules: GF.System.NoSignal
|
other-modules: GF.System.NoSignal
|
||||||
|
|
||||||
if impl(ghc>=7.8)
|
if impl(ghc>=7.8)
|
||||||
build-tools: happy>=1.19, alex>=3.1
|
build-tools:
|
||||||
|
happy>=1.19,
|
||||||
|
alex>=3.1
|
||||||
-- ghc-options: +RTS -A20M -RTS
|
-- ghc-options: +RTS -A20M -RTS
|
||||||
else
|
else
|
||||||
build-tools: happy, alex>=3
|
build-tools:
|
||||||
|
happy,
|
||||||
|
alex>=3
|
||||||
|
|
||||||
ghc-options: -fno-warn-tabs
|
ghc-options: -fno-warn-tabs
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
build-depends: Win32
|
build-depends:
|
||||||
|
Win32 >= 2.3.1.1 && < 2.7
|
||||||
else
|
else
|
||||||
build-depends: unix, terminfo>=0.4
|
build-depends:
|
||||||
|
terminfo >=0.4.0 && < 0.5
|
||||||
|
|
||||||
|
if impl(ghc >= 9.6)
|
||||||
|
build-depends: unix >= 2.8 && < 2.9
|
||||||
|
|
||||||
|
else
|
||||||
|
build-depends: unix >= 2.7.2 && < 2.8
|
||||||
|
|
||||||
|
|
||||||
if impl(ghc>=8.2)
|
if impl(ghc>=8.2)
|
||||||
ghc-options: -fhide-source-paths
|
ghc-options: -fhide-source-paths
|
||||||
|
|
||||||
Executable gf
|
executable gf
|
||||||
hs-source-dirs: src/programs
|
hs-source-dirs: src/programs
|
||||||
main-is: gf-main.hs
|
main-is: gf-main.hs
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
build-depends: gf, base
|
build-depends:
|
||||||
|
gf,
|
||||||
|
base >= 4.9.1 && < 4.22
|
||||||
ghc-options: -threaded
|
ghc-options: -threaded
|
||||||
--ghc-options: -fwarn-unused-imports
|
--ghc-options: -fwarn-unused-imports
|
||||||
|
|
||||||
@@ -324,24 +374,35 @@ Executable gf
|
|||||||
if impl(ghc<7.8)
|
if impl(ghc<7.8)
|
||||||
ghc-options: -with-rtsopts=-K64M
|
ghc-options: -with-rtsopts=-K64M
|
||||||
|
|
||||||
ghc-prof-options: -auto-all
|
-- ghc-prof-options: -auto-all
|
||||||
|
|
||||||
if impl(ghc>=8.2)
|
if impl(ghc>=8.2)
|
||||||
ghc-options: -fhide-source-paths
|
ghc-options: -fhide-source-paths
|
||||||
|
|
||||||
executable pgf-shell
|
-- executable pgf-shell
|
||||||
--if !flag(c-runtime)
|
-- --if !flag(c-runtime)
|
||||||
buildable: False
|
-- buildable: False
|
||||||
main-is: pgf-shell.hs
|
-- main-is: pgf-shell.hs
|
||||||
hs-source-dirs: src/runtime/haskell-bind/examples
|
-- hs-source-dirs: src/runtime/haskell-bind/examples
|
||||||
build-depends: gf, base, containers, mtl, lifted-base
|
-- build-depends:
|
||||||
default-language: Haskell2010
|
-- gf,
|
||||||
if impl(ghc>=7.0)
|
-- base,
|
||||||
ghc-options: -rtsopts
|
-- containers,
|
||||||
|
-- mtl,
|
||||||
|
-- lifted-base
|
||||||
|
-- default-language: Haskell2010
|
||||||
|
-- if impl(ghc>=7.0)
|
||||||
|
-- ghc-options: -rtsopts
|
||||||
|
|
||||||
test-suite gf-tests
|
test-suite gf-tests
|
||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
main-is: run.hs
|
main-is: run.hs
|
||||||
hs-source-dirs: testsuite
|
hs-source-dirs: testsuite
|
||||||
build-depends: base>=4.3 && <5, Cabal>=1.8, directory, filepath, process
|
build-depends:
|
||||||
default-language: Haskell2010
|
base >= 4.9.1 && < 4.22,
|
||||||
|
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
|
||||||
|
|||||||
740
index.html
740
index.html
@@ -1,418 +1,421 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<HTML>
|
<html lang="en">
|
||||||
<HEAD>
|
<head>
|
||||||
<TITLE>GF - Grammatical Framework</TITLE>
|
<meta charset="utf-8">
|
||||||
<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>
|
|
||||||
|
|
||||||
<body class=new>
|
<title>GF - Grammatical Framework</title>
|
||||||
|
<meta name="keywords" content="machine translation">
|
||||||
|
|
||||||
<div class="header sky blue">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<img class="gflogo" src="doc/Logos/gf1.svg" alt="">
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||||
<H1>Grammatical Framework</H1>
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" crossorigin="anonymous">
|
||||||
<small class=tagline>A programming language for multilingual grammar applications</small>
|
|
||||||
|
<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>
|
||||||
|
|
||||||
<div class=menu>
|
<div class="row mt-4">
|
||||||
|
|
||||||
<div class=links>
|
<div class="col-sm-6 col-md-3 mb-4">
|
||||||
<h4>Use GF</h4>
|
<h3>Get started</h3>
|
||||||
<ul>
|
<ul class="mb-2">
|
||||||
<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="https://www.youtube.com/watch?v=x1LFbDQhbso">Google Tech Talk</a></li>
|
||||||
<li><A HREF="demos/index.html">Other Demos</A>
|
<li>
|
||||||
</ul>
|
<a href="//cloud.grammaticalframework.org/">
|
||||||
<ul>
|
GF Cloud
|
||||||
<li><A HREF="http://www.grammaticalframework.org/download/index.html"><b>Download GF</b></A>
|
<img src="src/www/P/gf-cloud.png" style="height:30px" class="ml-2" alt="Cloud logo">
|
||||||
<li><a href="doc/gf-editor-modes.html">GF Editor Modes</a>
|
</a>
|
||||||
</ul>
|
</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>
|
<a href="download/index.html" class="btn btn-primary ml-3">
|
||||||
<li><A HREF="http://groups.google.com/group/gf-dev">User Group</A>
|
<i class="fas fa-download mr-1"></i>
|
||||||
<li><a href="https://github.com/GrammaticalFramework/gf-core/issues">Bug Reports</a>
|
Download GF
|
||||||
(<a href="http://code.google.com/p/grammatical-framework/issues/list">old</a>)
|
</a>
|
||||||
</ul>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class=links>
|
<div class="col-sm-6 col-md-3 mb-4">
|
||||||
<h4>Learn GF</h4>
|
<h3>Learn more</h3>
|
||||||
<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>
|
<ul class="mb-2">
|
||||||
<div class=links>
|
<li><a href="gf-book">The GF Book</a></li>
|
||||||
<h4>Develop GF</h4>
|
<li><a href="doc/gf-refman.html">Reference Manual</a></li>
|
||||||
<ul>
|
<li><a href="doc/gf-shell-reference.html">Shell Reference</a></li>
|
||||||
<li><a href="doc/gf-developers.html">GF Developers Guide</a>
|
<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://github.com/GrammaticalFramework/">GF on GitHub</A>
|
<li><a href="https://www.mitpressjournals.org/doi/pdf/10.1162/COLI_a_00378">Scaling Up (Computational Linguistics 2020)</a></li>
|
||||||
<li><a href="/~hallgren/gf-experiment/browse/">Browse Source Code</a>
|
<li><a href="https://inariksit.github.io/blog/">GF blog</a></li>
|
||||||
<li><A HREF="doc/gf-people.html">Authors</A>
|
</ul>
|
||||||
</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>
|
|
||||||
|
|
||||||
|
<a href="lib/doc/synopsis/index.html" class="btn btn-primary ml-3">
|
||||||
|
<i class="fab fa-readme mr-1"></i>
|
||||||
|
RGL API
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<div class="col-sm-6 col-md-3 mb-4">
|
||||||
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>')
|
<h3>Develop</h3>
|
||||||
</script>
|
<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>
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://hackage.haskell.org/package/gf/docs/PGF.html">Haskell</a>
|
||||||
|
</li><li><a href="doc/runtime-api.html#python">Python</a>
|
||||||
|
</li><li><a href="doc/runtime-api.html">C runtime</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</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="col-sm-6 col-md-3 mb-4">
|
||||||
|
<h3>Contribute</h3>
|
||||||
<div class=news2>
|
<ul class="mb-2">
|
||||||
|
<li>
|
||||||
<table class=news>
|
<a href="https://discord.gg/EvfUsjzmaz">
|
||||||
<tr><td>2018-07-25:<td>The GF repository has been split in two:
|
<i class="fab fa-discord"></i>
|
||||||
<a href="https://github.com/GrammaticalFramework/gf-core">gf-core</a> and
|
Discord
|
||||||
<a href="https://github.com/GrammaticalFramework/gf-rgl">gf-rgl</a>.
|
</a>
|
||||||
The original <a href="https://github.com/GrammaticalFramework/GF">GF</a> repository is now archived.
|
</li>
|
||||||
<tr><td>2017-08-11:<td><strong>GF 3.9 released!</strong>
|
<li>
|
||||||
<a href="download/release-3.9.html">Release notes</a>.
|
<a href="https://stackoverflow.com/questions/tagged/gf">
|
||||||
<tr><td>2017-06-29:<td>GF is moving to <a href="https://github.com/GrammaticalFramework/GF/">GitHub</a>!
|
<i class="fab fa-stack-overflow"></i>
|
||||||
<tr><td>2017-03-13:<td><strong>GF Summer School in Riga (Latvia), 14-25 August 2017</strong>
|
Stack Overflow
|
||||||
<a href="http://school.grammaticalframework.org/2017/">Summer
|
</a>
|
||||||
School web page</a>.
|
</li>
|
||||||
<tr><td>2016-09-07:<td><strong>Google Tech Talk on GF</strong> <a
|
<li><a href="https://groups.google.com/group/gf-dev">Mailing List</a></li>
|
||||||
href="https://www.youtube.com/watch?v=x1LFbDQhbso">on Youtube</a>.
|
<li><a href="https://github.com/GrammaticalFramework/gf-core/issues">Issue Tracker</a></li>
|
||||||
<tr><td>2016-07-05:<td>GitHub mirror temporarily not updated, due to server migration.
|
<li><a href="//school.grammaticalframework.org/">Summer School</a></li>
|
||||||
<tr><td>2016-06-22:<td><strong>GF 3.8 released!</strong>
|
<li><a href="doc/gf-people.html">Authors</a></li>
|
||||||
<a href="download/release-3.8.html">Release notes</a>.
|
</ul>
|
||||||
<tr><td>2015-06-21:<td><strong>Summer School in Rule-Based Machine
|
<a href="https://github.com/GrammaticalFramework/" class="btn btn-primary ml-3">
|
||||||
Translation in Alacant/Alicante (Spain), 11-21 July 2016</strong>
|
<i class="fab fa-github mr-1"></i>
|
||||||
featuring GF, Apertium, Matxin, and TectoMT.
|
GF on GitHub
|
||||||
<a href="http://xixona.dlsi.ua.es/rbmt-summer-school/2016/">Summer
|
</a>
|
||||||
School web page</a>.
|
</div>
|
||||||
<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>
|
</div>
|
||||||
|
|
||||||
<H2>What is GF</H2>
|
<h2>What is GF?</h2>
|
||||||
<P>
|
<p>
|
||||||
GF, Grammatical Framework, is a programming language for
|
GF, Grammatical Framework, is a programming language for
|
||||||
<B>multilingual grammar applications</B>. It is
|
<strong>multilingual grammar applications</strong>. It is
|
||||||
</P>
|
</p>
|
||||||
<UL>
|
<ul>
|
||||||
<LI>a <B>special-purpose language for grammars</B>, like
|
<li>a <strong>special-purpose language for grammars</strong>, like
|
||||||
<a href="http://dinosaur.compilertools.net/yacc/">YACC</a>,
|
<a href="http://dinosaur.compilertools.net/yacc/">YACC</a>,
|
||||||
<a href="http://www.gnu.org/software/bison/">Bison</a>,
|
<a href="http://www.gnu.org/software/bison/">Bison</a>,
|
||||||
<a href="http://www.haskell.org/happy/">Happy</a>,
|
<a href="http://www.haskell.org/happy/">Happy</a>,
|
||||||
<a href="http://bnfc.digitalgrammars.com/">BNFC</a>,
|
<a href="http://bnfc.digitalgrammars.com/">BNFC</a>,
|
||||||
but not restricted to programming languages
|
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://www.haskell.org/">Haskell</a>,
|
||||||
<a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)">Lisp</a>,
|
<a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)">Lisp</a>,
|
||||||
<a href="http://ocaml.org/">OCaml</a>,
|
<a href="http://ocaml.org/">OCaml</a>,
|
||||||
<a href="http://www.smlnj.org/">SML</a>,
|
<a href="http://www.smlnj.org/">SML</a>,
|
||||||
<a href="http://schemers.org/">Scheme</a>,
|
<a href="http://schemers.org/">Scheme</a>,
|
||||||
but specialized to grammar writing
|
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://moin.delph-in.net/LkbTop">LKB</a>,
|
||||||
<a href="http://www2.parc.com/isl/groups/nltt/xle/">XLE</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>,
|
<a href="http://www.issco.unige.ch/en/research/projects/regulus/news.shtml">Regulus</a>,
|
||||||
but based on functional programming and type theory
|
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://www.loria.fr/equipes/calligramme/acg/">ACG</a>,
|
||||||
<a href="http://openccg.sourceforge.net/">CCG</a>,
|
<a href="http://openccg.sourceforge.net/">CCG</a>,
|
||||||
but specialized for multilingual grammars,
|
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://wiki.portal.chalmers.se/agda/pmwiki.php">Agda</a>,
|
||||||
<a href="http://coq.inria.fr/">Coq</a>,
|
<a href="http://coq.inria.fr/">Coq</a>,
|
||||||
<a href="http://www.cl.cam.ac.uk/research/hvg/Isabelle/">Isabelle</a>,
|
<a href="http://www.cl.cam.ac.uk/research/hvg/Isabelle/">Isabelle</a>,
|
||||||
but equipped with concrete syntax in addition to logic
|
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.statmt.org/moses/">Moses</a>,
|
||||||
<a href="http://www.apertium.org/">Apertium</a>,
|
<a href="http://www.apertium.org/">Apertium</a>,
|
||||||
but based on deep structural analysis (and usually applied for
|
but based on deep structural analysis (and usually applied for
|
||||||
limited fragments of language).
|
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
|
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.
|
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>
|
||||||
|
|
||||||
<p>
|
<hr>
|
||||||
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>
|
|
||||||
|
|
||||||
<H2>Libraries</H2>
|
<div class="row">
|
||||||
<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>
|
|
||||||
|
|
||||||
<P>
|
<div class="col-md-6">
|
||||||
Adding a language to the resource library takes 3 to 9
|
<h2>Applications & availability</h2>
|
||||||
months - contributions
|
<p>
|
||||||
are welcome! You can start with the <A HREF="doc/gf-lrec-2010.pdf">resource grammarian's tutorial</A>.
|
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 <a href="https://discord.gg/EvfUsjzmaz">GF server on Discord</a>, where you are welcome to look for help with small questions or just start a general discussion.
|
||||||
|
</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">2025-08-08</dt>
|
||||||
|
<dd class="col-sm-9">
|
||||||
|
<strong>GF 3.12 released.</strong>
|
||||||
|
<a href="download/release-3.12.html">Release notes</a>
|
||||||
|
</dd>
|
||||||
|
<dt class="col-sm-3 text-center text-nowrap">2025-01-18</dt>
|
||||||
|
<dd class="col-sm-9">
|
||||||
|
<a href="//school.grammaticalframework.org/2025/">9th GF Summer School</a>, in Gothenburg, Sweden, 18 – 29 August 2025.
|
||||||
|
</dd>
|
||||||
|
<dt class="col-sm-3 text-center text-nowrap">2023-01-24</dt>
|
||||||
|
<dd class="col-sm-9">
|
||||||
|
<a href="//school.grammaticalframework.org/2023/">8th GF Summer School</a>, in Tampere, Finland, 14 – 25 August 2023.
|
||||||
|
</dd>
|
||||||
|
<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">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">
|
<script type="text/javascript">
|
||||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||||
@@ -423,5 +426,6 @@ try {
|
|||||||
var pageTracker = _gat._getTracker("UA-7811807-3");
|
var pageTracker = _gat._getTracker("UA-7811807-3");
|
||||||
pageTracker._trackPageview();
|
pageTracker._trackPageview();
|
||||||
} catch(err) {}</script>
|
} catch(err) {}</script>
|
||||||
</BODY>
|
|
||||||
</HTML>
|
</body>
|
||||||
|
</html>
|
||||||
|
|||||||
12
nix/expose-all.patch
Normal file
12
nix/expose-all.patch
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
diff --git a/gf.cabal b/gf.cabal
|
||||||
|
index 0076e7638..8d3fe4b49 100644
|
||||||
|
--- a/gf.cabal
|
||||||
|
+++ b/gf.cabal
|
||||||
|
@@ -168,7 +168,6 @@ Library
|
||||||
|
GF.Text.Lexing
|
||||||
|
GF.Grammar.Canonical
|
||||||
|
|
||||||
|
- other-modules:
|
||||||
|
GF.Main
|
||||||
|
GF.Compiler
|
||||||
|
GF.Interactive
|
||||||
193
nix/revert-new-cabal-madness.patch
Normal file
193
nix/revert-new-cabal-madness.patch
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
commit 45e5473fcd5707af93646d9a116867a4d4e3e9c9
|
||||||
|
Author: Andreas Källberg <anka.213@gmail.com>
|
||||||
|
Date: Mon Oct 10 14:57:12 2022 +0200
|
||||||
|
|
||||||
|
Revert "workaround for the Nix madness"
|
||||||
|
|
||||||
|
This reverts commit 1294269cd60f3db7b056135104615625baeb528c.
|
||||||
|
|
||||||
|
There are easier workarounds, like using
|
||||||
|
|
||||||
|
cabal v1-build
|
||||||
|
|
||||||
|
etc. instead of just `cabal build`
|
||||||
|
|
||||||
|
These changes also broke a whole bunch of other stuff
|
||||||
|
|
||||||
|
diff --git a/README.md b/README.md
|
||||||
|
index ba35795a4..79e6ab68f 100644
|
||||||
|
--- a/README.md
|
||||||
|
+++ b/README.md
|
||||||
|
@@ -38,21 +38,6 @@ or:
|
||||||
|
```
|
||||||
|
stack install
|
||||||
|
```
|
||||||
|
-Note that if you are unlucky to have Cabal 3.0 or later, then it uses
|
||||||
|
-the so-called Nix style commands. Using those for GF development is
|
||||||
|
-a pain. Every time when you change something in the source code, Cabal
|
||||||
|
-will generate a new folder for GF to look for the GF libraries and
|
||||||
|
-the GF cloud. Either reinstall everything with every change in the
|
||||||
|
-compiler, or be sane and stop using cabal-install. Instead you can do:
|
||||||
|
-```
|
||||||
|
-runghc Setup.hs configure
|
||||||
|
-runghc Setup.hs build
|
||||||
|
-sudo runghc Setup.hs install
|
||||||
|
-```
|
||||||
|
-The script will install the GF dependencies globally. The only solution
|
||||||
|
-to the Nix madness that I found is radical:
|
||||||
|
-
|
||||||
|
- "No person, no problem" (Нет человека – нет проблемы).
|
||||||
|
|
||||||
|
For more information, including links to precompiled binaries, see the [download page](https://www.grammaticalframework.org/download/index.html).
|
||||||
|
|
||||||
|
diff --git a/Setup.hs b/Setup.hs
|
||||||
|
index 58dc3e0c6..f8309cc00 100644
|
||||||
|
--- a/Setup.hs
|
||||||
|
+++ b/Setup.hs
|
||||||
|
@@ -4,68 +4,42 @@ import Distribution.Simple.LocalBuildInfo(LocalBuildInfo(..),absoluteInstallDirs
|
||||||
|
import Distribution.Simple.Setup(BuildFlags(..),Flag(..),InstallFlags(..),CopyDest(..),CopyFlags(..),SDistFlags(..))
|
||||||
|
import Distribution.PackageDescription(PackageDescription(..),emptyHookedBuildInfo)
|
||||||
|
import Distribution.Simple.BuildPaths(exeExtension)
|
||||||
|
-import System.Directory
|
||||||
|
import System.FilePath((</>),(<.>))
|
||||||
|
-import System.Process
|
||||||
|
-import Control.Monad(forM_,unless)
|
||||||
|
-import Control.Exception(bracket_)
|
||||||
|
-import Data.Char(isSpace)
|
||||||
|
|
||||||
|
import WebSetup
|
||||||
|
|
||||||
|
+-- | Notice about RGL not built anymore
|
||||||
|
+noRGLmsg :: IO ()
|
||||||
|
+noRGLmsg = putStrLn "Notice: the RGL is not built as part of GF anymore. See https://github.com/GrammaticalFramework/gf-rgl"
|
||||||
|
+
|
||||||
|
main :: IO ()
|
||||||
|
main = defaultMainWithHooks simpleUserHooks
|
||||||
|
- { preConf = gfPreConf
|
||||||
|
- , preBuild = gfPreBuild
|
||||||
|
+ { preBuild = gfPreBuild
|
||||||
|
, postBuild = gfPostBuild
|
||||||
|
, preInst = gfPreInst
|
||||||
|
, postInst = gfPostInst
|
||||||
|
, postCopy = gfPostCopy
|
||||||
|
}
|
||||||
|
where
|
||||||
|
- gfPreConf args flags = do
|
||||||
|
- pkgs <- fmap (map (dropWhile isSpace) . tail . lines)
|
||||||
|
- (readProcess "ghc-pkg" ["list"] "")
|
||||||
|
- forM_ dependencies $ \pkg -> do
|
||||||
|
- let name = takeWhile (/='/') (drop 36 pkg)
|
||||||
|
- unless (name `elem` pkgs) $ do
|
||||||
|
- let fname = name <.> ".tar.gz"
|
||||||
|
- callProcess "wget" [pkg,"-O",fname]
|
||||||
|
- callProcess "tar" ["-xzf",fname]
|
||||||
|
- removeFile fname
|
||||||
|
- bracket_ (setCurrentDirectory name) (setCurrentDirectory ".." >> removeDirectoryRecursive name) $ do
|
||||||
|
- exists <- doesFileExist "Setup.hs"
|
||||||
|
- unless exists $ do
|
||||||
|
- writeFile "Setup.hs" (unlines [
|
||||||
|
- "import Distribution.Simple",
|
||||||
|
- "main = defaultMain"
|
||||||
|
- ])
|
||||||
|
- let to_descr = reverse .
|
||||||
|
- (++) (reverse ".cabal") .
|
||||||
|
- drop 1 .
|
||||||
|
- dropWhile (/='-') .
|
||||||
|
- reverse
|
||||||
|
- callProcess "wget" [to_descr pkg, "-O", to_descr name]
|
||||||
|
- callProcess "runghc" ["Setup.hs","configure"]
|
||||||
|
- callProcess "runghc" ["Setup.hs","build"]
|
||||||
|
- callProcess "sudo" ["runghc","Setup.hs","install"]
|
||||||
|
-
|
||||||
|
- preConf simpleUserHooks args flags
|
||||||
|
-
|
||||||
|
- gfPreBuild args = gfPre args . buildDistPref
|
||||||
|
- gfPreInst args = gfPre args . installDistPref
|
||||||
|
+ gfPreBuild args = gfPre args . buildDistPref
|
||||||
|
+ gfPreInst args = gfPre args . installDistPref
|
||||||
|
|
||||||
|
gfPre args distFlag = do
|
||||||
|
return emptyHookedBuildInfo
|
||||||
|
|
||||||
|
gfPostBuild args flags pkg lbi = do
|
||||||
|
+ -- noRGLmsg
|
||||||
|
let gf = default_gf lbi
|
||||||
|
buildWeb gf flags (pkg,lbi)
|
||||||
|
|
||||||
|
gfPostInst args flags pkg lbi = do
|
||||||
|
+ -- noRGLmsg
|
||||||
|
+ saveInstallPath args flags (pkg,lbi)
|
||||||
|
installWeb (pkg,lbi)
|
||||||
|
|
||||||
|
gfPostCopy args flags pkg lbi = do
|
||||||
|
+ -- noRGLmsg
|
||||||
|
+ saveCopyPath args flags (pkg,lbi)
|
||||||
|
copyWeb flags (pkg,lbi)
|
||||||
|
|
||||||
|
-- `cabal sdist` will not make a proper dist archive, for that see `make sdist`
|
||||||
|
@@ -73,16 +47,27 @@ main = defaultMainWithHooks simpleUserHooks
|
||||||
|
gfSDist pkg lbi hooks flags = do
|
||||||
|
return ()
|
||||||
|
|
||||||
|
-dependencies = [
|
||||||
|
- "https://hackage.haskell.org/package/utf8-string-1.0.2/utf8-string-1.0.2.tar.gz",
|
||||||
|
- "https://hackage.haskell.org/package/json-0.10/json-0.10.tar.gz",
|
||||||
|
- "https://hackage.haskell.org/package/network-bsd-2.8.1.0/network-bsd-2.8.1.0.tar.gz",
|
||||||
|
- "https://hackage.haskell.org/package/httpd-shed-0.4.1.1/httpd-shed-0.4.1.1.tar.gz",
|
||||||
|
- "https://hackage.haskell.org/package/exceptions-0.10.5/exceptions-0.10.5.tar.gz",
|
||||||
|
- "https://hackage.haskell.org/package/stringsearch-0.3.6.6/stringsearch-0.3.6.6.tar.gz",
|
||||||
|
- "https://hackage.haskell.org/package/multipart-0.2.1/multipart-0.2.1.tar.gz",
|
||||||
|
- "https://hackage.haskell.org/package/cgi-3001.5.0.0/cgi-3001.5.0.0.tar.gz"
|
||||||
|
- ]
|
||||||
|
+saveInstallPath :: [String] -> InstallFlags -> (PackageDescription, LocalBuildInfo) -> IO ()
|
||||||
|
+saveInstallPath args flags bi = do
|
||||||
|
+ let
|
||||||
|
+ dest = NoCopyDest
|
||||||
|
+ dir = datadir (uncurry absoluteInstallDirs bi dest)
|
||||||
|
+ writeFile dataDirFile dir
|
||||||
|
+
|
||||||
|
+saveCopyPath :: [String] -> CopyFlags -> (PackageDescription, LocalBuildInfo) -> IO ()
|
||||||
|
+saveCopyPath args flags bi = do
|
||||||
|
+ let
|
||||||
|
+ dest = case copyDest flags of
|
||||||
|
+ NoFlag -> NoCopyDest
|
||||||
|
+ Flag d -> d
|
||||||
|
+ dir = datadir (uncurry absoluteInstallDirs bi dest)
|
||||||
|
+ writeFile dataDirFile dir
|
||||||
|
+
|
||||||
|
+-- | Name of file where installation's data directory is recording
|
||||||
|
+-- This is a last-resort way in which the seprate RGL build script
|
||||||
|
+-- can determine where to put the compiled RGL files
|
||||||
|
+dataDirFile :: String
|
||||||
|
+dataDirFile = "DATA_DIR"
|
||||||
|
|
||||||
|
-- | Get path to locally-built gf
|
||||||
|
default_gf :: LocalBuildInfo -> FilePath
|
||||||
|
diff --git a/gf.cabal b/gf.cabal
|
||||||
|
index a055b86be..d00a5b935 100644
|
||||||
|
--- a/gf.cabal
|
||||||
|
+++ b/gf.cabal
|
||||||
|
@@ -2,7 +2,7 @@ name: gf
|
||||||
|
version: 3.11.0-git
|
||||||
|
|
||||||
|
cabal-version: 1.22
|
||||||
|
-build-type: Simple
|
||||||
|
+build-type: Custom
|
||||||
|
license: OtherLicense
|
||||||
|
license-file: LICENSE
|
||||||
|
category: Natural Language Processing, Compiler
|
||||||
|
@@ -44,6 +44,14 @@ data-files:
|
||||||
|
www/translator/*.css
|
||||||
|
www/translator/*.js
|
||||||
|
|
||||||
|
+custom-setup
|
||||||
|
+ setup-depends:
|
||||||
|
+ base >= 4.9.1 && < 4.16,
|
||||||
|
+ 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
|
||||||
|
location: https://github.com/GrammaticalFramework/gf-core.git
|
||||||
@@ -19,7 +19,9 @@ module GF(
|
|||||||
module GF.Grammar.Printer,
|
module GF.Grammar.Printer,
|
||||||
module GF.Infra.Ident,
|
module GF.Infra.Ident,
|
||||||
-- ** Binary serialisation
|
-- ** Binary serialisation
|
||||||
module GF.Grammar.Binary
|
module GF.Grammar.Binary,
|
||||||
|
-- * Canonical GF
|
||||||
|
module GF.Compile.GrammarToCanonical
|
||||||
) where
|
) where
|
||||||
import GF.Main
|
import GF.Main
|
||||||
import GF.Compiler
|
import GF.Compiler
|
||||||
@@ -36,3 +38,5 @@ import GF.Grammar.Macros
|
|||||||
import GF.Grammar.Printer
|
import GF.Grammar.Printer
|
||||||
import GF.Infra.Ident
|
import GF.Infra.Ident
|
||||||
import GF.Grammar.Binary
|
import GF.Grammar.Binary
|
||||||
|
|
||||||
|
import GF.Compile.GrammarToCanonical
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
|
{-# LANGUAGE FlexibleInstances, UndecidableInstances, CPP #-}
|
||||||
module GF.Command.Commands (
|
module GF.Command.Commands (
|
||||||
PGFEnv,HasPGFEnv(..),pgf,mos,pgfEnv,pgfCommands,
|
PGFEnv,HasPGFEnv(..),pgf,mos,pgfEnv,pgfCommands,
|
||||||
options,flags,
|
options,flags,
|
||||||
) where
|
) where
|
||||||
import Prelude hiding (putStrLn,(<>)) -- GHC 8.4.1 clash with Text.PrettyPrint
|
import Prelude hiding (putStrLn,(<>)) -- GHC 8.4.1 clash with Text.PrettyPrint
|
||||||
|
import System.Info(os)
|
||||||
|
|
||||||
import PGF
|
import PGF
|
||||||
|
|
||||||
@@ -21,6 +22,7 @@ import GF.Infra.SIO
|
|||||||
import GF.Command.Abstract
|
import GF.Command.Abstract
|
||||||
import GF.Command.CommandInfo
|
import GF.Command.CommandInfo
|
||||||
import GF.Command.CommonCommands
|
import GF.Command.CommonCommands
|
||||||
|
import qualified GF.Command.CommonCommands as Common
|
||||||
import GF.Text.Clitics
|
import GF.Text.Clitics
|
||||||
import GF.Quiz
|
import GF.Quiz
|
||||||
|
|
||||||
@@ -34,6 +36,7 @@ import Data.Maybe
|
|||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
import GF.Text.Pretty
|
import GF.Text.Pretty
|
||||||
import Data.List (sort)
|
import Data.List (sort)
|
||||||
|
import qualified Control.Monad.Fail as Fail
|
||||||
--import Debug.Trace
|
--import Debug.Trace
|
||||||
|
|
||||||
|
|
||||||
@@ -44,7 +47,7 @@ pgfEnv pgf = Env pgf mos
|
|||||||
|
|
||||||
class (Functor m,Monad m,MonadSIO m) => HasPGFEnv m where getPGFEnv :: m PGFEnv
|
class (Functor m,Monad m,MonadSIO m) => HasPGFEnv m where getPGFEnv :: m PGFEnv
|
||||||
|
|
||||||
instance (Monad m,HasPGFEnv m) => TypeCheckArg m where
|
instance (Monad m,HasPGFEnv m,Fail.MonadFail m) => TypeCheckArg m where
|
||||||
typeCheckArg e = (either (fail . render . ppTcError) (return . fst)
|
typeCheckArg e = (either (fail . render . ppTcError) (return . fst)
|
||||||
. flip inferExpr e . pgf) =<< getPGFEnv
|
. flip inferExpr e . pgf) =<< getPGFEnv
|
||||||
|
|
||||||
@@ -164,14 +167,15 @@ pgfCommands = Map.fromList [
|
|||||||
synopsis = "generate random trees in the current abstract syntax",
|
synopsis = "generate random trees in the current abstract syntax",
|
||||||
syntax = "gr [-cat=CAT] [-number=INT]",
|
syntax = "gr [-cat=CAT] [-number=INT]",
|
||||||
examples = [
|
examples = [
|
||||||
mkEx "gr -- one tree in the startcat of the current grammar",
|
mkEx $ "gr -- one tree in the startcat of the current grammar, up to depth " ++ Common.default_depth_str,
|
||||||
mkEx "gr -cat=NP -number=16 -- 16 trees in the category NP",
|
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 -cat=NP -depth=2 -- one tree in the category NP, up to depth 2",
|
||||||
mkEx "gr -probs=FILE -- generate with bias",
|
mkEx "gr -lang=LangHin,LangTha -cat=Cl -- Cl, both in LangHin and LangTha",
|
||||||
mkEx "gr (AdjCN ? (UseN ?)) -- generate trees of form (AdjCN ? (UseN ?))"
|
mkEx "gr -probs=FILE -- generate with bias",
|
||||||
|
mkEx "gr (AdjCN ? (UseN ?)) -- generate trees of form (AdjCN ? (UseN ?))"
|
||||||
],
|
],
|
||||||
explanation = unlines [
|
explanation = unlines [
|
||||||
"Generates a list of random trees, by default one tree.",
|
"Generates a list of random trees, by default one tree up to depth " ++ Common.default_depth_str ++ ".",
|
||||||
"If a tree argument is given, the command completes the Tree with values to",
|
"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,",
|
"all metavariables in the tree. The generation can be biased by probabilities,",
|
||||||
"given in a file in the -probs flag."
|
"given in a file in the -probs flag."
|
||||||
@@ -180,13 +184,13 @@ pgfCommands = Map.fromList [
|
|||||||
("cat","generation category"),
|
("cat","generation category"),
|
||||||
("lang","uses only functions that have linearizations in all these languages"),
|
("lang","uses only functions that have linearizations in all these languages"),
|
||||||
("number","number of trees generated"),
|
("number","number of trees generated"),
|
||||||
("depth","the maximum generation depth"),
|
("depth","the maximum generation depth (default: " ++ Common.default_depth_str ++ ")"),
|
||||||
("probs", "file with biased probabilities (format 'f 0.4' one by line)")
|
("probs", "file with biased probabilities (format 'f 0.4' one by line)")
|
||||||
],
|
],
|
||||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||||
pgf <- optProbs opts (optRestricted opts pgf)
|
pgf <- optProbs opts (optRestricted opts pgf)
|
||||||
gen <- newStdGen
|
gen <- newStdGen
|
||||||
let dp = valIntOpts "depth" 4 opts
|
let dp = valIntOpts "depth" Common.default_depth opts
|
||||||
let ts = case mexp (toExprs arg) of
|
let ts = case mexp (toExprs arg) of
|
||||||
Just ex -> generateRandomFromDepth gen pgf ex (Just dp)
|
Just ex -> generateRandomFromDepth gen pgf ex (Just dp)
|
||||||
Nothing -> generateRandomDepth gen pgf (optType pgf opts) (Just dp)
|
Nothing -> generateRandomDepth gen pgf (optType pgf opts) (Just dp)
|
||||||
@@ -197,28 +201,28 @@ pgfCommands = Map.fromList [
|
|||||||
synopsis = "generates a list of trees, by default exhaustive",
|
synopsis = "generates a list of trees, by default exhaustive",
|
||||||
explanation = unlines [
|
explanation = unlines [
|
||||||
"Generates all trees of a given category. By default, ",
|
"Generates all trees of a given category. By default, ",
|
||||||
"the depth is limited to 4, but this can be changed by a flag.",
|
"the depth is limited to " ++ Common.default_depth_str ++ ", but this can be changed by a flag.",
|
||||||
"If a Tree argument is given, the command completes the Tree with values",
|
"If a Tree argument is given, the command completes the Tree with values",
|
||||||
"to all metavariables in the tree."
|
"to all metavariables in the tree."
|
||||||
],
|
],
|
||||||
flags = [
|
flags = [
|
||||||
("cat","the generation category"),
|
("cat","the generation category"),
|
||||||
("depth","the maximum generation depth"),
|
("depth","the maximum generation depth (default: " ++ Common.default_depth_str ++ ")"),
|
||||||
("lang","excludes functions that have no linearization in this language"),
|
("lang","excludes functions that have no linearization in this language"),
|
||||||
("number","the number of trees generated")
|
("number","the number of trees generated")
|
||||||
],
|
],
|
||||||
examples = [
|
examples = [
|
||||||
mkEx "gt -- all trees in the startcat, to depth 4",
|
mkEx $ "gt -- all trees in the startcat, to depth " ++ Common.default_depth_str,
|
||||||
mkEx "gt -cat=NP -number=16 -- 16 trees in the category NP",
|
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 -cat=NP -depth=2 -- trees in the category NP to depth 2",
|
||||||
mkEx "gt (AdjCN ? (UseN ?)) -- trees of form (AdjCN ? (UseN ?))"
|
mkEx "gt (AdjCN ? (UseN ?)) -- trees of form (AdjCN ? (UseN ?))"
|
||||||
],
|
],
|
||||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||||
let pgfr = optRestricted opts pgf
|
let pgfr = optRestricted opts pgf
|
||||||
let dp = valIntOpts "depth" 4 opts
|
let dp = valIntOpts "depth" Common.default_depth opts
|
||||||
let ts = case mexp (toExprs arg) of
|
let ts = case toExprs arg of
|
||||||
Just ex -> generateFromDepth pgfr ex (Just dp)
|
[] -> generateAllDepth pgfr (optType pgf opts) (Just dp)
|
||||||
Nothing -> generateAllDepth pgfr (optType pgf opts) (Just dp)
|
es -> concat [generateFromDepth pgfr e (Just dp) | e <- es]
|
||||||
returnFromExprs $ take (optNumInf opts) ts
|
returnFromExprs $ take (optNumInf opts) ts
|
||||||
}),
|
}),
|
||||||
("i", emptyCommandInfo {
|
("i", emptyCommandInfo {
|
||||||
@@ -426,7 +430,8 @@ pgfCommands = Map.fromList [
|
|||||||
"are type checking and semantic computation."
|
"are type checking and semantic computation."
|
||||||
],
|
],
|
||||||
examples = [
|
examples = [
|
||||||
mkEx "pt -compute (plus one two) -- compute value"
|
mkEx "pt -compute (plus one two) -- compute value",
|
||||||
|
mkEx ("p \"the 4 dogs\" | pt -transfer=digits2numeral | l -- \"the four dogs\" ")
|
||||||
],
|
],
|
||||||
exec = getEnv $ \ opts arg (Env pgf mos) ->
|
exec = getEnv $ \ opts arg (Env pgf mos) ->
|
||||||
returnFromExprs . takeOptNum opts . treeOps pgf opts $ toExprs arg,
|
returnFromExprs . takeOptNum opts . treeOps pgf opts $ toExprs arg,
|
||||||
@@ -544,7 +549,7 @@ pgfCommands = Map.fromList [
|
|||||||
"which is processed by dot (graphviz) and displayed by the program indicated",
|
"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",
|
"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).",
|
"flag -format. Results from multiple trees are combined to pdf with convert (ImageMagick).",
|
||||||
"See also 'vp -showdep' for another visualization of dependencies."
|
"See also 'vp -showdep' for another visualization of dependencies."
|
||||||
],
|
],
|
||||||
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
exec = getEnv $ \ opts arg (Env pgf mos) -> do
|
||||||
let absname = abstractName pgf
|
let absname = abstractName pgf
|
||||||
@@ -740,7 +745,7 @@ pgfCommands = Map.fromList [
|
|||||||
Nothing -> do putStrLn ("unknown category of function identifier "++show id)
|
Nothing -> do putStrLn ("unknown category of function identifier "++show id)
|
||||||
return void
|
return void
|
||||||
[e] -> case inferExpr pgf e of
|
[e] -> case inferExpr pgf e of
|
||||||
Left tcErr -> error $ render (ppTcError tcErr)
|
Left tcErr -> errorWithoutStackTrace $ render (ppTcError tcErr)
|
||||||
Right (e,ty) -> do putStrLn ("Expression: "++showExpr [] e)
|
Right (e,ty) -> do putStrLn ("Expression: "++showExpr [] e)
|
||||||
putStrLn ("Type: "++showType [] ty)
|
putStrLn ("Type: "++showType [] ty)
|
||||||
putStrLn ("Probability: "++show (probTree pgf e))
|
putStrLn ("Probability: "++show (probTree pgf e))
|
||||||
@@ -757,7 +762,7 @@ pgfCommands = Map.fromList [
|
|||||||
[] -> [parse_ pgf lang (optType pgf opts) (Just dp) s | lang <- optLangs pgf opts]
|
[] -> [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]
|
open_typs -> [parseWithRecovery pgf lang (optType pgf opts) open_typs (Just dp) s | lang <- optLangs pgf opts]
|
||||||
where
|
where
|
||||||
dp = valIntOpts "depth" 4 opts
|
dp = valIntOpts "depth" Common.default_depth opts
|
||||||
|
|
||||||
fromParse opts = foldr (joinPiped . fromParse1 opts) void
|
fromParse opts = foldr (joinPiped . fromParse1 opts) void
|
||||||
|
|
||||||
@@ -797,9 +802,9 @@ pgfCommands = Map.fromList [
|
|||||||
_ | isOpt "tabtreebank" opts ->
|
_ | isOpt "tabtreebank" opts ->
|
||||||
return $ concat $ intersperse "\t" $ (showExpr [] t) :
|
return $ concat $ intersperse "\t" $ (showExpr [] t) :
|
||||||
[s | lang <- optLangs pgf opts, s <- linear pgf opts lang t]
|
[s | lang <- optLangs pgf opts, s <- linear pgf opts lang t]
|
||||||
_ | isOpt "chunks" opts -> map snd $ linChunks pgf opts t
|
_ | isOpt "chunks" opts -> map snd $ linChunks pgf opts t
|
||||||
_ -> [s | lang <- optLangs pgf opts, s<-linear pgf opts lang t]
|
_ -> [s | lang <- optLangs pgf opts, s<-linear pgf opts lang t]
|
||||||
linChunks pgf opts t =
|
linChunks pgf opts t =
|
||||||
[(lang, unwords (intersperse "<+>" (map (unlines . linear pgf opts lang) (treeChunks t)))) | lang <- optLangs pgf opts]
|
[(lang, unwords (intersperse "<+>" (map (unlines . linear pgf opts lang) (treeChunks t)))) | lang <- optLangs pgf opts]
|
||||||
|
|
||||||
linear :: PGF -> [Option] -> CId -> Expr -> [String]
|
linear :: PGF -> [Option] -> CId -> Expr -> [String]
|
||||||
@@ -881,11 +886,15 @@ pgfCommands = Map.fromList [
|
|||||||
Right ty -> ty
|
Right ty -> ty
|
||||||
Nothing -> error ("Can't parse '"++str++"' as a type")
|
Nothing -> error ("Can't parse '"++str++"' as a type")
|
||||||
optViewFormat opts = valStrOpts "format" "png" opts
|
optViewFormat opts = valStrOpts "format" "png" opts
|
||||||
optViewGraph opts = valStrOpts "view" "open" opts
|
optViewGraph opts = valStrOpts "view" open_cmd opts
|
||||||
optNum opts = valIntOpts "number" 1 opts
|
optNum opts = valIntOpts "number" 1 opts
|
||||||
optNumInf opts = valIntOpts "number" 1000000000 opts ---- 10^9
|
optNumInf opts = valIntOpts "number" 1000000000 opts ---- 10^9
|
||||||
takeOptNum opts = take (optNumInf opts)
|
takeOptNum opts = take (optNumInf opts)
|
||||||
|
|
||||||
|
open_cmd | os == "linux" = "xdg-open"
|
||||||
|
| os == "mingw32" = "start"
|
||||||
|
| otherwise = "open"
|
||||||
|
|
||||||
returnFromExprs es = return $ case es of
|
returnFromExprs es = return $ case es of
|
||||||
[] -> pipeMessage "no trees found"
|
[] -> pipeMessage "no trees found"
|
||||||
_ -> fromExprs es
|
_ -> fromExprs es
|
||||||
@@ -999,13 +1008,13 @@ viewLatex view name grphs = do
|
|||||||
restrictedSystem $ "pdflatex " ++ texfile
|
restrictedSystem $ "pdflatex " ++ texfile
|
||||||
restrictedSystem $ view ++ " " ++ pdffile
|
restrictedSystem $ view ++ " " ++ pdffile
|
||||||
return void
|
return void
|
||||||
|
|
||||||
---- copied from VisualizeTree ; not sure about proper place AR Nov 2015
|
---- copied from VisualizeTree ; not sure about proper place AR Nov 2015
|
||||||
latexDoc :: [String] -> String
|
latexDoc :: [String] -> String
|
||||||
latexDoc body = unlines $
|
latexDoc body = unlines $
|
||||||
"\\batchmode"
|
"\\batchmode"
|
||||||
: "\\documentclass{article}"
|
: "\\documentclass{article}"
|
||||||
: "\\usepackage[utf8]{inputenc}"
|
: "\\usepackage[utf8]{inputenc}"
|
||||||
: "\\begin{document}"
|
: "\\begin{document}"
|
||||||
: spaces body
|
: spaces body
|
||||||
++ ["\\end{document}"]
|
++ ["\\end{document}"]
|
||||||
@@ -1018,3 +1027,7 @@ stanzas = map unlines . chop . lines where
|
|||||||
chop ls = case break (=="") ls of
|
chop ls = case break (=="") ls of
|
||||||
(ls1,[]) -> [ls1]
|
(ls1,[]) -> [ls1]
|
||||||
(ls1,_:ls2) -> ls1 : chop ls2
|
(ls1,_:ls2) -> ls1 : chop ls2
|
||||||
|
|
||||||
|
#if !(MIN_VERSION_base(4,9,0))
|
||||||
|
errorWithoutStackTrace = error
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import Data.Maybe
|
|||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
import GF.Text.Pretty
|
import GF.Text.Pretty
|
||||||
import Control.Monad(mplus)
|
import Control.Monad(mplus)
|
||||||
|
import qualified Control.Monad.Fail as Fail
|
||||||
|
|
||||||
|
|
||||||
data PGFEnv = Env {pgf::Maybe PGF,concs::Map.Map ConcName Concr}
|
data PGFEnv = Env {pgf::Maybe PGF,concs::Map.Map ConcName Concr}
|
||||||
@@ -25,7 +26,7 @@ data PGFEnv = Env {pgf::Maybe PGF,concs::Map.Map ConcName Concr}
|
|||||||
pgfEnv pgf = Env (Just pgf) (languages pgf)
|
pgfEnv pgf = Env (Just pgf) (languages pgf)
|
||||||
emptyPGFEnv = Env Nothing Map.empty
|
emptyPGFEnv = Env Nothing Map.empty
|
||||||
|
|
||||||
class (Monad m,MonadSIO m) => HasPGFEnv m where getPGFEnv :: m PGFEnv
|
class (Fail.MonadFail m,MonadSIO m) => HasPGFEnv m where getPGFEnv :: m PGFEnv
|
||||||
|
|
||||||
instance (Monad m,HasPGFEnv m) => TypeCheckArg m where
|
instance (Monad m,HasPGFEnv m) => TypeCheckArg m where
|
||||||
typeCheckArg e = do env <- getPGFEnv
|
typeCheckArg e = do env <- getPGFEnv
|
||||||
@@ -806,14 +807,22 @@ hsExpr c =
|
|||||||
Just (f,cs) -> H.mkApp (H.mkCId f) (map hsExpr cs)
|
Just (f,cs) -> H.mkApp (H.mkCId f) (map hsExpr cs)
|
||||||
_ -> case unStr c of
|
_ -> case unStr c of
|
||||||
Just str -> H.mkStr str
|
Just str -> H.mkStr str
|
||||||
_ -> error $ "GF.Command.Commands2.hsExpr "++show c
|
_ -> case unInt c of
|
||||||
|
Just n -> H.mkInt n
|
||||||
|
_ -> case unFloat c of
|
||||||
|
Just d -> H.mkFloat d
|
||||||
|
_ -> error $ "GF.Command.Commands2.hsExpr "++show c
|
||||||
|
|
||||||
cExpr e =
|
cExpr e =
|
||||||
case H.unApp e of
|
case H.unApp e of
|
||||||
Just (f,es) -> mkApp (H.showCId f) (map cExpr es)
|
Just (f,es) -> mkApp (H.showCId f) (map cExpr es)
|
||||||
_ -> case H.unStr e of
|
_ -> case H.unStr e of
|
||||||
Just str -> mkStr str
|
Just str -> mkStr str
|
||||||
_ -> error $ "GF.Command.Commands2.cExpr "++show e
|
_ -> case H.unInt e of
|
||||||
|
Just n -> mkInt n
|
||||||
|
_ -> case H.unFloat e of
|
||||||
|
Just d -> mkFloat d
|
||||||
|
_ -> error $ "GF.Command.Commands2.cExpr "++show e
|
||||||
|
|
||||||
needPGF exec opts ts =
|
needPGF exec opts ts =
|
||||||
do Env mb_pgf cncs <- getPGFEnv
|
do Env mb_pgf cncs <- getPGFEnv
|
||||||
|
|||||||
@@ -15,9 +15,16 @@ import GF.Command.Abstract --(isOpt,valStrOpts,prOpt)
|
|||||||
import GF.Text.Pretty
|
import GF.Text.Pretty
|
||||||
import GF.Text.Transliterations
|
import GF.Text.Transliterations
|
||||||
import GF.Text.Lexing(stringOp,opInEnv)
|
import GF.Text.Lexing(stringOp,opInEnv)
|
||||||
|
import Data.Char (isSpace)
|
||||||
|
|
||||||
import qualified PGF as H(showCId,showExpr,toATree,toTrie,Trie(..))
|
import qualified PGF as H(showCId,showExpr,toATree,toTrie,Trie(..))
|
||||||
|
|
||||||
|
-- store default generation depth in a variable and use everywhere
|
||||||
|
default_depth :: Int
|
||||||
|
default_depth = 5
|
||||||
|
default_depth_str = show default_depth
|
||||||
|
|
||||||
|
|
||||||
extend old new = Map.union (Map.fromList new) old -- Map.union is left-biased
|
extend old new = Map.union (Map.fromList new) old -- Map.union is left-biased
|
||||||
|
|
||||||
commonCommands :: (Monad m,MonadSIO m) => Map.Map String (CommandInfo m)
|
commonCommands :: (Monad m,MonadSIO m) => Map.Map String (CommandInfo m)
|
||||||
@@ -170,7 +177,8 @@ commonCommands = fmap (mapCommandExec liftSIO) $ Map.fromList [
|
|||||||
restrictedSystem $ syst ++ " <" ++ tmpi ++ " >" ++ tmpo
|
restrictedSystem $ syst ++ " <" ++ tmpi ++ " >" ++ tmpo
|
||||||
fmap fromString $ restricted $ readFile 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 = [
|
flags = [
|
||||||
("command","the system command applied to the argument")
|
("command","the system command applied to the argument")
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import GF.Infra.UseIO(putStrLnE)
|
|||||||
|
|
||||||
import Control.Monad(when)
|
import Control.Monad(when)
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
|
import GF.Infra.UseIO (Output)
|
||||||
|
import qualified Control.Monad.Fail as Fail
|
||||||
|
|
||||||
data CommandEnv m = CommandEnv {
|
data CommandEnv m = CommandEnv {
|
||||||
commands :: Map.Map String (CommandInfo m),
|
commands :: Map.Map String (CommandInfo m),
|
||||||
@@ -22,6 +24,7 @@ data CommandEnv m = CommandEnv {
|
|||||||
mkCommandEnv cmds = CommandEnv cmds Map.empty Map.empty
|
mkCommandEnv cmds = CommandEnv cmds Map.empty Map.empty
|
||||||
|
|
||||||
--interpretCommandLine :: CommandEnv -> String -> SIO ()
|
--interpretCommandLine :: CommandEnv -> String -> SIO ()
|
||||||
|
interpretCommandLine :: (Fail.MonadFail m, Output m, TypeCheckArg m) => CommandEnv m -> String -> m ()
|
||||||
interpretCommandLine env line =
|
interpretCommandLine env line =
|
||||||
case readCommandLine line of
|
case readCommandLine line of
|
||||||
Just [] -> return ()
|
Just [] -> return ()
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ import GF.Grammar.Parser (runP, pExp)
|
|||||||
import GF.Grammar.ShowTerm
|
import GF.Grammar.ShowTerm
|
||||||
import GF.Grammar.Lookup (allOpers,allOpersTo)
|
import GF.Grammar.Lookup (allOpers,allOpersTo)
|
||||||
import GF.Compile.Rename(renameSourceTerm)
|
import GF.Compile.Rename(renameSourceTerm)
|
||||||
import qualified GF.Compile.Compute.ConcreteNew as CN(normalForm,resourceValues)
|
import GF.Compile.Compute.Concrete(normalForm,resourceValues)
|
||||||
import GF.Compile.TypeCheck.RConcrete as TC(inferLType,ppType)
|
import GF.Compile.TypeCheck.Concrete as TC(inferLType,ppType)
|
||||||
import GF.Infra.Dependencies(depGraph)
|
import GF.Infra.Dependencies(depGraph)
|
||||||
import GF.Infra.CheckM(runCheck)
|
import GF.Infra.CheckM(runCheck)
|
||||||
|
|
||||||
@@ -259,7 +259,7 @@ checkComputeTerm os sgr t =
|
|||||||
((t,_),_) <- runCheck $ do t <- renameSourceTerm sgr mo t
|
((t,_),_) <- runCheck $ do t <- renameSourceTerm sgr mo t
|
||||||
inferLType sgr [] t
|
inferLType sgr [] t
|
||||||
let opts = modifyFlags (\fs->fs{optTrace=isOpt "trace" os})
|
let opts = modifyFlags (\fs->fs{optTrace=isOpt "trace" os})
|
||||||
t1 = CN.normalForm (CN.resourceValues opts sgr) (L NoLoc identW) t
|
t1 = normalForm (resourceValues opts sgr) (L NoLoc identW) t
|
||||||
t2 = evalStr t1
|
t2 = evalStr t1
|
||||||
checkPredefError t2
|
checkPredefError t2
|
||||||
where
|
where
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ module GF.Command.TreeOperations (
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
import PGF(Expr,PGF,CId,compute,mkApp,unApp,unapply,unMeta,exprSize,exprFunctions)
|
import PGF(Expr,PGF,CId,compute,mkApp,unApp,unapply,unMeta,exprSize,exprFunctions)
|
||||||
|
import PGF.Data(Expr(EApp,EFun))
|
||||||
|
import PGF.TypeCheck(inferExpr)
|
||||||
import Data.List
|
import Data.List
|
||||||
|
|
||||||
type TreeOp = [Expr] -> [Expr]
|
type TreeOp = [Expr] -> [Expr]
|
||||||
@@ -16,15 +18,17 @@ allTreeOps :: PGF -> [(String,(String,Either TreeOp (CId -> TreeOp)))]
|
|||||||
allTreeOps pgf = [
|
allTreeOps pgf = [
|
||||||
("compute",("compute by using semantic definitions (def)",
|
("compute",("compute by using semantic definitions (def)",
|
||||||
Left $ map (compute pgf))),
|
Left $ map (compute pgf))),
|
||||||
|
("transfer",("apply this transfer function to all maximal subtrees of suitable type",
|
||||||
|
Right $ \f -> map (transfer pgf f))), -- HL 12/24, modified from gf-3.3
|
||||||
("largest",("sort trees from largest to smallest, in number of nodes",
|
("largest",("sort trees from largest to smallest, in number of nodes",
|
||||||
Left $ largest)),
|
Left $ largest)),
|
||||||
("nub",("remove duplicate trees",
|
("nub\t",("remove duplicate trees",
|
||||||
Left $ nub)),
|
Left $ nub)),
|
||||||
("smallest",("sort trees from smallest to largest, in number of nodes",
|
("smallest",("sort trees from smallest to largest, in number of nodes",
|
||||||
Left $ smallest)),
|
Left $ smallest)),
|
||||||
("subtrees",("return all fully applied subtrees (stopping at abstractions), by default sorted from the largest",
|
("subtrees",("return all fully applied subtrees (stopping at abstractions), by default sorted from the largest",
|
||||||
Left $ concatMap subtrees)),
|
Left $ concatMap subtrees)),
|
||||||
("funs",("return all fun functions appearing in the tree, with duplications",
|
("funs\t",("return all fun functions appearing in the tree, with duplications",
|
||||||
Left $ \es -> [mkApp f [] | e <- es, f <- exprFunctions e]))
|
Left $ \es -> [mkApp f [] | e <- es, f <- exprFunctions e]))
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -48,3 +52,18 @@ subtrees :: Expr -> [Expr]
|
|||||||
subtrees t = t : case unApp t of
|
subtrees t = t : case unApp t of
|
||||||
Just (f,ts) -> concatMap subtrees ts
|
Just (f,ts) -> concatMap subtrees ts
|
||||||
_ -> [] -- don't go under abstractions
|
_ -> [] -- don't go under abstractions
|
||||||
|
|
||||||
|
-- Apply transfer function f:C -> D to all maximal subtrees s:C of tree e and replace
|
||||||
|
-- these s by the values of f(s). This modifies the 'simple-minded transfer' of gf-3.3.
|
||||||
|
-- If applied to strict subtrees s of e, better use with f:C -> C only. HL 12/2024
|
||||||
|
|
||||||
|
transfer :: PGF -> CId -> Expr -> Expr
|
||||||
|
transfer pgf f e = case inferExpr pgf (appf e) of
|
||||||
|
Left _err -> case e of
|
||||||
|
EApp g a -> EApp (transfer pgf f g) (transfer pgf f a)
|
||||||
|
_ -> e
|
||||||
|
Right _ty -> case (compute pgf (appf e)) of
|
||||||
|
v | v /= (appf e) -> v
|
||||||
|
_ -> e -- default case of f, or f has no computation rule
|
||||||
|
where
|
||||||
|
appf = EApp (EFun f)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import Data.List
|
|||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
cf2pgf :: FilePath -> ParamCFG -> PGF
|
cf2pgf :: FilePath -> ParamCFG -> PGF
|
||||||
cf2pgf fpath cf =
|
cf2pgf fpath cf =
|
||||||
let pgf = PGF Map.empty aname (cf2abstr cf) (Map.singleton cname (cf2concr cf))
|
let pgf = PGF Map.empty aname (cf2abstr cf) (Map.singleton cname (cf2concr cf))
|
||||||
in updateProductionIndices pgf
|
in updateProductionIndices pgf
|
||||||
where
|
where
|
||||||
@@ -33,7 +33,7 @@ cf2abstr cfg = Abstr aflags afuns acats
|
|||||||
|
|
||||||
acats = Map.fromList [(cat, ([], [(0,mkRuleName rule) | rule <- rules], 0))
|
acats = Map.fromList [(cat, ([], [(0,mkRuleName rule) | rule <- rules], 0))
|
||||||
| (cat,rules) <- (Map.toList . Map.fromListWith (++))
|
| (cat,rules) <- (Map.toList . Map.fromListWith (++))
|
||||||
[(cat2id cat, catRules cfg cat) |
|
[(cat2id cat, catRules cfg cat) |
|
||||||
cat <- allCats' cfg]]
|
cat <- allCats' cfg]]
|
||||||
afuns = Map.fromList [(mkRuleName rule, (cftype [cat2id c | NonTerminal c <- ruleRhs rule] (cat2id (ruleLhs rule)), 0, Nothing, 0))
|
afuns = Map.fromList [(mkRuleName rule, (cftype [cat2id c | NonTerminal c <- ruleRhs rule] (cat2id (ruleLhs rule)), 0, Nothing, 0))
|
||||||
| rule <- allRules cfg]
|
| rule <- allRules cfg]
|
||||||
@@ -52,7 +52,7 @@ cf2concr cfg = Concr Map.empty Map.empty
|
|||||||
cats = allCats' cfg
|
cats = allCats' cfg
|
||||||
rules = allRules cfg
|
rules = allRules cfg
|
||||||
|
|
||||||
sequences0 = Set.fromList (listArray (0,0) [SymCat 0 0] :
|
sequences0 = Set.fromList (listArray (0,0) [SymCat 0 0] :
|
||||||
map mkSequence rules)
|
map mkSequence rules)
|
||||||
sequences = listArray (0,Set.size sequences0-1) (Set.toList sequences0)
|
sequences = listArray (0,Set.size sequences0-1) (Set.toList sequences0)
|
||||||
|
|
||||||
@@ -102,7 +102,7 @@ cf2concr cfg = Concr Map.empty Map.empty
|
|||||||
|
|
||||||
mkLinDefRef (cat,_) =
|
mkLinDefRef (cat,_) =
|
||||||
(cat2fid cat 0,[0])
|
(cat2fid cat 0,[0])
|
||||||
|
|
||||||
addProd prods (fid,prod) =
|
addProd prods (fid,prod) =
|
||||||
case IntMap.lookup fid prods of
|
case IntMap.lookup fid prods of
|
||||||
Just set -> IntMap.insert fid (Set.insert prod set) prods
|
Just set -> IntMap.insert fid (Set.insert prod set) prods
|
||||||
@@ -130,5 +130,5 @@ cf2concr cfg = Concr Map.empty Map.empty
|
|||||||
|
|
||||||
mkRuleName rule =
|
mkRuleName rule =
|
||||||
case ruleName rule of
|
case ruleName rule of
|
||||||
CFObj n _ -> n
|
CFObj n _ -> n
|
||||||
_ -> wildCId
|
_ -> wildCId
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
-- Stability : (stable)
|
-- Stability : (stable)
|
||||||
-- Portability : (portable)
|
-- Portability : (portable)
|
||||||
--
|
--
|
||||||
-- > CVS $Date: 2005/11/11 23:24:33 $
|
-- > CVS $Date: 2005/11/11 23:24:33 $
|
||||||
-- > CVS $Author: aarne $
|
-- > CVS $Author: aarne $
|
||||||
-- > CVS $Revision: 1.31 $
|
-- > CVS $Revision: 1.31 $
|
||||||
--
|
--
|
||||||
@@ -27,21 +27,20 @@ import GF.Infra.Ident
|
|||||||
import GF.Infra.Option
|
import GF.Infra.Option
|
||||||
|
|
||||||
import GF.Compile.TypeCheck.Abstract
|
import GF.Compile.TypeCheck.Abstract
|
||||||
import GF.Compile.TypeCheck.RConcrete
|
import GF.Compile.TypeCheck.Concrete(computeLType,checkLType,inferLType,ppType)
|
||||||
import qualified GF.Compile.TypeCheck.ConcreteNew as CN
|
import qualified GF.Compile.TypeCheck.ConcreteNew as CN(checkLType,inferLType)
|
||||||
import qualified GF.Compile.Compute.ConcreteNew as CN
|
import qualified GF.Compile.Compute.Concrete as CN(normalForm,resourceValues)
|
||||||
|
|
||||||
import GF.Grammar
|
import GF.Grammar
|
||||||
import GF.Grammar.Lexer
|
import GF.Grammar.Lexer
|
||||||
import GF.Grammar.Lookup
|
import GF.Grammar.Lookup
|
||||||
--import GF.Grammar.Predef
|
|
||||||
--import GF.Grammar.PatternMatch
|
|
||||||
|
|
||||||
import GF.Data.Operations
|
import GF.Data.Operations
|
||||||
import GF.Infra.CheckM
|
import GF.Infra.CheckM
|
||||||
|
|
||||||
import Data.List
|
import Data.List
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
|
import qualified Data.Map as Map
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import GF.Text.Pretty
|
import GF.Text.Pretty
|
||||||
|
|
||||||
@@ -59,7 +58,7 @@ checkModule opts cwd sgr mo@(m,mi) = do
|
|||||||
where
|
where
|
||||||
updateCheckInfos mo = fmap (foldl update mo) . parallelCheck . map check
|
updateCheckInfos mo = fmap (foldl update mo) . parallelCheck . map check
|
||||||
where check (i,info) = fmap ((,) i) (checkInfo opts cwd sgr mo i info)
|
where check (i,info) = fmap ((,) i) (checkInfo opts cwd sgr mo i info)
|
||||||
update mo@(m,mi) (i,info) = (m,mi{jments=updateTree (i,info) (jments mi)})
|
update mo@(m,mi) (i,info) = (m,mi{jments=Map.insert i info (jments mi)})
|
||||||
|
|
||||||
-- check if restricted inheritance modules are still coherent
|
-- check if restricted inheritance modules are still coherent
|
||||||
-- i.e. that the defs of remaining names don't depend on omitted names
|
-- i.e. that the defs of remaining names don't depend on omitted names
|
||||||
@@ -72,12 +71,12 @@ checkRestrictedInheritance cwd sgr (name,mo) = checkInModule cwd mo NoLoc empty
|
|||||||
where
|
where
|
||||||
mos = modules sgr
|
mos = modules sgr
|
||||||
checkRem ((i,m),mi) = do
|
checkRem ((i,m),mi) = do
|
||||||
let (incl,excl) = partition (isInherited mi) (map fst (tree2list (jments m)))
|
let (incl,excl) = partition (isInherited mi) (Map.keys (jments m))
|
||||||
let incld c = Set.member c (Set.fromList incl)
|
let incld c = Set.member c (Set.fromList incl)
|
||||||
let illegal c = Set.member c (Set.fromList excl)
|
let illegal c = Set.member c (Set.fromList excl)
|
||||||
let illegals = [(f,is) |
|
let illegals = [(f,is) |
|
||||||
(f,cs) <- allDeps, incld f, let is = filter illegal cs, not (null is)]
|
(f,cs) <- allDeps, incld f, let is = filter illegal cs, not (null is)]
|
||||||
case illegals of
|
case illegals of
|
||||||
[] -> return ()
|
[] -> return ()
|
||||||
cs -> checkWarn ("In inherited module" <+> i <> ", dependence of excluded constants:" $$
|
cs -> checkWarn ("In inherited module" <+> i <> ", dependence of excluded constants:" $$
|
||||||
nest 2 (vcat [f <+> "on" <+> fsep is | (f,is) <- cs]))
|
nest 2 (vcat [f <+> "on" <+> fsep is | (f,is) <- cs]))
|
||||||
@@ -89,16 +88,16 @@ checkCompleteGrammar opts cwd gr (am,abs) (cm,cnc) = checkInModule cwd cnc NoLoc
|
|||||||
let jsc = jments cnc
|
let jsc = jments cnc
|
||||||
|
|
||||||
-- check that all concrete constants are in abstract; build types for all lin
|
-- check that all concrete constants are in abstract; build types for all lin
|
||||||
jsc <- foldM checkCnc emptyBinTree (tree2list jsc)
|
jsc <- foldM checkCnc Map.empty (Map.toList jsc)
|
||||||
|
|
||||||
-- check that all abstract constants are in concrete; build default lin and lincats
|
-- check that all abstract constants are in concrete; build default lin and lincats
|
||||||
jsc <- foldM checkAbs jsc (tree2list jsa)
|
jsc <- foldM checkAbs jsc (Map.toList jsa)
|
||||||
|
|
||||||
return (cm,cnc{jments=jsc})
|
return (cm,cnc{jments=jsc})
|
||||||
where
|
where
|
||||||
checkAbs js i@(c,info) =
|
checkAbs js i@(c,info) =
|
||||||
case info of
|
case info of
|
||||||
AbsFun (Just (L loc ty)) _ _ _
|
AbsFun (Just (L loc ty)) _ _ _
|
||||||
-> do let mb_def = do
|
-> do let mb_def = do
|
||||||
let (cxt,(_,i),_) = typeForm ty
|
let (cxt,(_,i),_) = typeForm ty
|
||||||
info <- lookupIdent i js
|
info <- lookupIdent i js
|
||||||
@@ -113,17 +112,17 @@ checkCompleteGrammar opts cwd gr (am,abs) (cm,cnc) = checkInModule cwd cnc NoLoc
|
|||||||
case lookupIdent c js of
|
case lookupIdent c js of
|
||||||
Ok (AnyInd _ _) -> return js
|
Ok (AnyInd _ _) -> return js
|
||||||
Ok (CncFun ty (Just def) mn mf) ->
|
Ok (CncFun ty (Just def) mn mf) ->
|
||||||
return $ updateTree (c,CncFun ty (Just def) mn mf) js
|
return $ Map.insert c (CncFun ty (Just def) mn mf) js
|
||||||
Ok (CncFun ty Nothing mn mf) ->
|
Ok (CncFun ty Nothing mn mf) ->
|
||||||
case mb_def of
|
case mb_def of
|
||||||
Ok def -> return $ updateTree (c,CncFun ty (Just (L NoLoc def)) mn mf) js
|
Ok def -> return $ Map.insert c (CncFun ty (Just (L NoLoc def)) mn mf) js
|
||||||
Bad _ -> do noLinOf c
|
Bad _ -> do noLinOf c
|
||||||
return js
|
return js
|
||||||
_ -> do
|
_ -> do
|
||||||
case mb_def of
|
case mb_def of
|
||||||
Ok def -> do (cont,val) <- linTypeOfType gr cm ty
|
Ok def -> do (cont,val) <- linTypeOfType gr cm ty
|
||||||
let linty = (snd (valCat ty),cont,val)
|
let linty = (snd (valCat ty),cont,val)
|
||||||
return $ updateTree (c,CncFun (Just linty) (Just (L NoLoc def)) Nothing Nothing) js
|
return $ Map.insert c (CncFun (Just linty) (Just (L NoLoc def)) Nothing Nothing) js
|
||||||
Bad _ -> do noLinOf c
|
Bad _ -> do noLinOf c
|
||||||
return js
|
return js
|
||||||
where noLinOf c = checkWarn ("no linearization of" <+> c)
|
where noLinOf c = checkWarn ("no linearization of" <+> c)
|
||||||
@@ -132,36 +131,42 @@ checkCompleteGrammar opts cwd gr (am,abs) (cm,cnc) = checkInModule cwd cnc NoLoc
|
|||||||
Ok (CncCat (Just _) _ _ _ _) -> return js
|
Ok (CncCat (Just _) _ _ _ _) -> return js
|
||||||
Ok (CncCat Nothing md mr mp mpmcfg) -> do
|
Ok (CncCat Nothing md mr mp mpmcfg) -> do
|
||||||
checkWarn ("no linearization type for" <+> c <> ", inserting default {s : Str}")
|
checkWarn ("no linearization type for" <+> c <> ", inserting default {s : Str}")
|
||||||
return $ updateTree (c,CncCat (Just (L NoLoc defLinType)) md mr mp mpmcfg) js
|
return $ Map.insert c (CncCat (Just (L NoLoc defLinType)) md mr mp mpmcfg) js
|
||||||
_ -> do
|
_ -> do
|
||||||
checkWarn ("no linearization type for" <+> c <> ", inserting default {s : Str}")
|
checkWarn ("no linearization type for" <+> c <> ", inserting default {s : Str}")
|
||||||
return $ updateTree (c,CncCat (Just (L NoLoc defLinType)) Nothing Nothing Nothing Nothing) js
|
return $ Map.insert c (CncCat (Just (L NoLoc defLinType)) Nothing Nothing Nothing Nothing) js
|
||||||
_ -> return js
|
_ -> return js
|
||||||
|
|
||||||
checkCnc js i@(c,info) =
|
checkCnc js (c,info) =
|
||||||
case info of
|
case info of
|
||||||
CncFun _ d mn mf -> case lookupOrigInfo gr (am,c) of
|
CncFun _ d mn mf -> case lookupOrigInfo gr (am,c) of
|
||||||
Ok (_,AbsFun (Just (L _ ty)) _ _ _) ->
|
Ok (_,AbsFun (Just (L _ ty)) _ _ _) ->
|
||||||
do (cont,val) <- linTypeOfType gr cm ty
|
do (cont,val) <- linTypeOfType gr cm ty
|
||||||
let linty = (snd (valCat ty),cont,val)
|
let linty = (snd (valCat ty),cont,val)
|
||||||
return $ updateTree (c,CncFun (Just linty) d mn mf) js
|
return $ Map.insert c (CncFun (Just linty) d mn mf) js
|
||||||
_ -> do checkWarn ("function" <+> c <+> "is not in abstract")
|
_ -> do checkWarn ("function" <+> c <+> "is not in abstract")
|
||||||
return js
|
return js
|
||||||
CncCat _ _ _ _ _ -> case lookupOrigInfo gr (am,c) of
|
CncCat {} ->
|
||||||
Ok _ -> return $ updateTree i js
|
case lookupOrigInfo gr (am,c) of
|
||||||
_ -> do checkWarn ("category" <+> c <+> "is not in abstract")
|
Ok (_,AbsCat _) -> return $ Map.insert c info js
|
||||||
return js
|
{- -- This might be too pedantic:
|
||||||
_ -> return $ updateTree i js
|
Ok (_,AbsFun {}) ->
|
||||||
|
checkError ("lincat:"<+>c<+>"is a fun, not a cat")
|
||||||
|
-}
|
||||||
|
_ -> do checkWarn ("category" <+> c <+> "is not in abstract")
|
||||||
|
return js
|
||||||
|
|
||||||
|
_ -> return $ Map.insert c info js
|
||||||
|
|
||||||
|
|
||||||
-- | General Principle: only Just-values are checked.
|
-- | General Principle: only Just-values are checked.
|
||||||
-- A May-value has always been checked in its origin module.
|
-- A May-value has always been checked in its origin module.
|
||||||
checkInfo :: Options -> FilePath -> SourceGrammar -> SourceModule -> Ident -> Info -> Check Info
|
checkInfo :: Options -> FilePath -> SourceGrammar -> SourceModule -> Ident -> Info -> Check Info
|
||||||
checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
||||||
checkReservedId c
|
checkReservedId c
|
||||||
case info of
|
case info of
|
||||||
AbsCat (Just (L loc cont)) ->
|
AbsCat (Just (L loc cont)) ->
|
||||||
mkCheck loc "the category" $
|
mkCheck loc "the category" $
|
||||||
checkContext gr cont
|
checkContext gr cont
|
||||||
|
|
||||||
AbsFun (Just (L loc typ0)) ma md moper -> do
|
AbsFun (Just (L loc typ0)) ma md moper -> do
|
||||||
@@ -170,13 +175,13 @@ checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
|||||||
checkTyp gr typ
|
checkTyp gr typ
|
||||||
case md of
|
case md of
|
||||||
Just eqs -> mapM_ (\(L loc eq) -> mkCheck loc "the definition of function" $
|
Just eqs -> mapM_ (\(L loc eq) -> mkCheck loc "the definition of function" $
|
||||||
checkDef gr (m,c) typ eq) eqs
|
checkDef gr (m,c) typ eq) eqs
|
||||||
Nothing -> return ()
|
Nothing -> return ()
|
||||||
return (AbsFun (Just (L loc typ)) ma md moper)
|
return (AbsFun (Just (L loc typ)) ma md moper)
|
||||||
|
|
||||||
CncCat mty mdef mref mpr mpmcfg -> do
|
CncCat mty mdef mref mpr mpmcfg -> do
|
||||||
mty <- case mty of
|
mty <- case mty of
|
||||||
Just (L loc typ) -> chIn loc "linearization type of" $
|
Just (L loc typ) -> chIn loc "linearization type of" $
|
||||||
(if False --flag optNewComp opts
|
(if False --flag optNewComp opts
|
||||||
then do (typ,_) <- CN.checkLType (CN.resourceValues opts gr) typ typeType
|
then do (typ,_) <- CN.checkLType (CN.resourceValues opts gr) typ typeType
|
||||||
typ <- computeLType gr [] typ
|
typ <- computeLType gr [] typ
|
||||||
@@ -186,19 +191,19 @@ checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
|||||||
return (Just (L loc typ)))
|
return (Just (L loc typ)))
|
||||||
Nothing -> return Nothing
|
Nothing -> return Nothing
|
||||||
mdef <- case (mty,mdef) of
|
mdef <- case (mty,mdef) of
|
||||||
(Just (L _ typ),Just (L loc def)) ->
|
(Just (L _ typ),Just (L loc def)) ->
|
||||||
chIn loc "default linearization of" $ do
|
chIn loc "default linearization of" $ do
|
||||||
(def,_) <- checkLType gr [] def (mkFunType [typeStr] typ)
|
(def,_) <- checkLType gr [] def (mkFunType [typeStr] typ)
|
||||||
return (Just (L loc def))
|
return (Just (L loc def))
|
||||||
_ -> return Nothing
|
_ -> return Nothing
|
||||||
mref <- case (mty,mref) of
|
mref <- case (mty,mref) of
|
||||||
(Just (L _ typ),Just (L loc ref)) ->
|
(Just (L _ typ),Just (L loc ref)) ->
|
||||||
chIn loc "reference linearization of" $ do
|
chIn loc "reference linearization of" $ do
|
||||||
(ref,_) <- checkLType gr [] ref (mkFunType [typ] typeStr)
|
(ref,_) <- checkLType gr [] ref (mkFunType [typ] typeStr)
|
||||||
return (Just (L loc ref))
|
return (Just (L loc ref))
|
||||||
_ -> return Nothing
|
_ -> return Nothing
|
||||||
mpr <- case mpr of
|
mpr <- case mpr of
|
||||||
(Just (L loc t)) ->
|
(Just (L loc t)) ->
|
||||||
chIn loc "print name of" $ do
|
chIn loc "print name of" $ do
|
||||||
(t,_) <- checkLType gr [] t typeStr
|
(t,_) <- checkLType gr [] t typeStr
|
||||||
return (Just (L loc t))
|
return (Just (L loc t))
|
||||||
@@ -207,13 +212,13 @@ checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
|||||||
|
|
||||||
CncFun mty mt mpr mpmcfg -> do
|
CncFun mty mt mpr mpmcfg -> do
|
||||||
mt <- case (mty,mt) of
|
mt <- case (mty,mt) of
|
||||||
(Just (cat,cont,val),Just (L loc trm)) ->
|
(Just (cat,cont,val),Just (L loc trm)) ->
|
||||||
chIn loc "linearization of" $ do
|
chIn loc "linearization of" $ do
|
||||||
(trm,_) <- checkLType gr [] trm (mkFunType (map (\(_,_,ty) -> ty) cont) val) -- erases arg vars
|
(trm,_) <- checkLType gr [] trm (mkFunType (map (\(_,_,ty) -> ty) cont) val) -- erases arg vars
|
||||||
return (Just (L loc trm))
|
return (Just (L loc trm))
|
||||||
_ -> return mt
|
_ -> return mt
|
||||||
mpr <- case mpr of
|
mpr <- case mpr of
|
||||||
(Just (L loc t)) ->
|
(Just (L loc t)) ->
|
||||||
chIn loc "print name of" $ do
|
chIn loc "print name of" $ do
|
||||||
(t,_) <- checkLType gr [] t typeStr
|
(t,_) <- checkLType gr [] t typeStr
|
||||||
return (Just (L loc t))
|
return (Just (L loc t))
|
||||||
@@ -246,16 +251,16 @@ checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
|||||||
ResOverload os tysts -> chIn NoLoc "overloading" $ do
|
ResOverload os tysts -> chIn NoLoc "overloading" $ do
|
||||||
tysts' <- mapM (uncurry $ flip (\(L loc1 t) (L loc2 ty) -> checkLType gr [] t ty >>= \(t,ty) -> return (L loc1 t, L loc2 ty))) tysts -- return explicit ones
|
tysts' <- mapM (uncurry $ flip (\(L loc1 t) (L loc2 ty) -> checkLType gr [] t ty >>= \(t,ty) -> return (L loc1 t, L loc2 ty))) tysts -- return explicit ones
|
||||||
tysts0 <- lookupOverload gr (m,c) -- check against inherited ones too
|
tysts0 <- lookupOverload gr (m,c) -- check against inherited ones too
|
||||||
tysts1 <- mapM (uncurry $ flip (checkLType gr []))
|
tysts1 <- mapM (uncurry $ flip (checkLType gr []))
|
||||||
[(mkFunType args val,tr) | (args,(val,tr)) <- tysts0]
|
[(mkFunType args val,tr) | (args,(val,tr)) <- tysts0]
|
||||||
--- this can only be a partial guarantee, since matching
|
--- this can only be a partial guarantee, since matching
|
||||||
--- with value type is only possible if expected type is given
|
--- with value type is only possible if expected type is given
|
||||||
checkUniq $
|
checkUniq $
|
||||||
sort [let (xs,t) = typeFormCnc x in t : map (\(b,x,t) -> t) xs | (_,x) <- tysts1]
|
sort [let (xs,t) = typeFormCnc x in t : map (\(b,x,t) -> t) xs | (_,x) <- tysts1]
|
||||||
return (ResOverload os [(y,x) | (x,y) <- tysts'])
|
return (ResOverload os [(y,x) | (x,y) <- tysts'])
|
||||||
|
|
||||||
ResParam (Just (L loc pcs)) _ -> do
|
ResParam (Just (L loc pcs)) _ -> do
|
||||||
ts <- chIn loc "parameter type" $
|
ts <- chIn loc "parameter type" $
|
||||||
liftM concat $ mapM mkPar pcs
|
liftM concat $ mapM mkPar pcs
|
||||||
return (ResParam (Just (L loc pcs)) (Just ts))
|
return (ResParam (Just (L loc pcs)) (Just ts))
|
||||||
|
|
||||||
@@ -265,13 +270,13 @@ checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
|||||||
chIn loc cat = checkInModule cwd mo loc ("Happened in" <+> cat <+> c)
|
chIn loc cat = checkInModule cwd mo loc ("Happened in" <+> cat <+> c)
|
||||||
|
|
||||||
mkPar (f,co) = do
|
mkPar (f,co) = do
|
||||||
vs <- liftM combinations $ mapM (\(_,_,ty) -> allParamValues gr ty) co
|
vs <- liftM sequence $ mapM (\(_,_,ty) -> allParamValues gr ty) co
|
||||||
return $ map (mkApp (QC (m,f))) vs
|
return $ map (mkApp (QC (m,f))) vs
|
||||||
|
|
||||||
checkUniq xss = case xss of
|
checkUniq xss = case xss of
|
||||||
x:y:xs
|
x:y:xs
|
||||||
| x == y -> checkError $ "ambiguous for type" <+>
|
| x == y -> checkError $ "ambiguous for type" <+>
|
||||||
ppType (mkFunType (tail x) (head x))
|
ppType (mkFunType (tail x) (head x))
|
||||||
| otherwise -> checkUniq $ y:xs
|
| otherwise -> checkUniq $ y:xs
|
||||||
_ -> return ()
|
_ -> return ()
|
||||||
|
|
||||||
@@ -289,7 +294,7 @@ checkInfo opts cwd sgr (m,mo) c info = checkInModule cwd mo NoLoc empty $ do
|
|||||||
t' <- compAbsTyp ((x,Vr x):g) t
|
t' <- compAbsTyp ((x,Vr x):g) t
|
||||||
return $ Prod b x a' t'
|
return $ Prod b x a' t'
|
||||||
Abs _ _ _ -> return t
|
Abs _ _ _ -> return t
|
||||||
_ -> composOp (compAbsTyp g) t
|
_ -> composOp (compAbsTyp g) t
|
||||||
|
|
||||||
|
|
||||||
-- | for grammars obtained otherwise than by parsing ---- update!!
|
-- | for grammars obtained otherwise than by parsing ---- update!!
|
||||||
@@ -311,7 +316,7 @@ linTypeOfType cnc m typ = do
|
|||||||
mkLinArg (i,(n,mc@(m,cat))) = do
|
mkLinArg (i,(n,mc@(m,cat))) = do
|
||||||
val <- lookLin mc
|
val <- lookLin mc
|
||||||
let vars = mkRecType varLabel $ replicate n typeStr
|
let vars = mkRecType varLabel $ replicate n typeStr
|
||||||
symb = argIdent n cat i
|
symb = argIdent n cat i
|
||||||
rec <- if n==0 then return val else
|
rec <- if n==0 then return val else
|
||||||
errIn (render ("extending" $$
|
errIn (render ("extending" $$
|
||||||
nest 2 vars $$
|
nest 2 vars $$
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
module GF.Compile.Coding where
|
|
||||||
{-
|
|
||||||
import GF.Grammar.Grammar
|
|
||||||
import GF.Grammar.Macros
|
|
||||||
import GF.Text.Coding
|
|
||||||
--import GF.Infra.Option
|
|
||||||
import GF.Data.Operations
|
|
||||||
|
|
||||||
--import Data.Char
|
|
||||||
import System.IO
|
|
||||||
import qualified Data.ByteString.Char8 as BS
|
|
||||||
|
|
||||||
encodeStringsInModule :: TextEncoding -> SourceModule -> SourceModule
|
|
||||||
encodeStringsInModule enc = codeSourceModule (BS.unpack . encodeUnicode enc)
|
|
||||||
|
|
||||||
decodeStringsInModule :: TextEncoding -> SourceModule -> SourceModule
|
|
||||||
decodeStringsInModule enc mo = codeSourceModule (decodeUnicode enc . BS.pack) mo
|
|
||||||
|
|
||||||
codeSourceModule :: (String -> String) -> SourceModule -> SourceModule
|
|
||||||
codeSourceModule co (id,mo) = (id,mo{jments = mapTree codj (jments mo)})
|
|
||||||
where
|
|
||||||
codj (c,info) = case info of
|
|
||||||
ResOper pty pt -> ResOper (codeLTerms co pty) (codeLTerms co pt)
|
|
||||||
ResOverload es tyts -> ResOverload es [(codeLTerm co ty,codeLTerm co t) | (ty,t) <- tyts]
|
|
||||||
CncCat mcat mdef mref mpr mpmcfg -> CncCat mcat (codeLTerms co mdef) (codeLTerms co mref) (codeLTerms co mpr) mpmcfg
|
|
||||||
CncFun mty mt mpr mpmcfg -> CncFun mty (codeLTerms co mt) (codeLTerms co mpr) mpmcfg
|
|
||||||
_ -> info
|
|
||||||
|
|
||||||
codeLTerms co = fmap (codeLTerm co)
|
|
||||||
|
|
||||||
codeLTerm :: (String -> String) -> L Term -> L Term
|
|
||||||
codeLTerm = fmap . codeTerm
|
|
||||||
|
|
||||||
codeTerm :: (String -> String) -> Term -> Term
|
|
||||||
codeTerm co = codt
|
|
||||||
where
|
|
||||||
codt t = case t of
|
|
||||||
K s -> K (co s)
|
|
||||||
T ty cs -> T ty [(codp p,codt v) | (p,v) <- cs]
|
|
||||||
EPatt p -> EPatt (codp p)
|
|
||||||
_ -> composSafeOp codt t
|
|
||||||
|
|
||||||
codp p = case p of --- really: composOpPatt
|
|
||||||
PR rs -> PR [(l,codp p) | (l,p) <- rs]
|
|
||||||
PString s -> PString (co s)
|
|
||||||
PChars s -> PChars (co s)
|
|
||||||
PT x p -> PT x (codp p)
|
|
||||||
PAs x p -> PAs x (codp p)
|
|
||||||
PNeg p -> PNeg (codp p)
|
|
||||||
PRep p -> PRep (codp p)
|
|
||||||
PSeq p q -> PSeq (codp p) (codp q)
|
|
||||||
PAlt p q -> PAlt (codp p) (codp q)
|
|
||||||
_ -> p
|
|
||||||
|
|
||||||
-- | Run an encoding function on all string literals within the given string.
|
|
||||||
codeStringLiterals :: (String -> String) -> String -> String
|
|
||||||
codeStringLiterals _ [] = []
|
|
||||||
codeStringLiterals co ('"':cs) = '"' : inStringLiteral cs
|
|
||||||
where inStringLiteral [] = error "codeStringLiterals: unterminated string literal"
|
|
||||||
inStringLiteral ('"':ds) = '"' : codeStringLiterals co ds
|
|
||||||
inStringLiteral ('\\':d:ds) = '\\' : co [d] ++ inStringLiteral ds
|
|
||||||
inStringLiteral (d:ds) = co [d] ++ inStringLiteral ds
|
|
||||||
codeStringLiterals co (c:cs) = c : codeStringLiterals co cs
|
|
||||||
-}
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
----------------------------------------------------------------------
|
|
||||||
-- |
|
|
||||||
-- Module : AppPredefined
|
|
||||||
-- Maintainer : AR
|
|
||||||
-- Stability : (stable)
|
|
||||||
-- Portability : (portable)
|
|
||||||
--
|
|
||||||
-- > CVS $Date: 2005/10/06 14:21:34 $
|
|
||||||
-- > CVS $Author: aarne $
|
|
||||||
-- > CVS $Revision: 1.13 $
|
|
||||||
--
|
|
||||||
-- Predefined function type signatures and definitions.
|
|
||||||
-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
module GF.Compile.Compute.AppPredefined ({-
|
|
||||||
isInPredefined, typPredefined, arrityPredefined, predefModInfo, appPredefined-}
|
|
||||||
) where
|
|
||||||
{-
|
|
||||||
import GF.Compile.TypeCheck.Primitives
|
|
||||||
import GF.Infra.Option
|
|
||||||
import GF.Data.Operations
|
|
||||||
import GF.Grammar
|
|
||||||
import GF.Grammar.Predef
|
|
||||||
|
|
||||||
import qualified Data.Map as Map
|
|
||||||
import GF.Text.Pretty
|
|
||||||
import Data.Char (isUpper,toUpper,toLower)
|
|
||||||
|
|
||||||
-- predefined function type signatures and definitions. AR 12/3/2003.
|
|
||||||
|
|
||||||
isInPredefined :: Ident -> Bool
|
|
||||||
isInPredefined f = Map.member f primitives
|
|
||||||
|
|
||||||
arrityPredefined :: Ident -> Maybe Int
|
|
||||||
arrityPredefined f = do ty <- typPredefined f
|
|
||||||
let (ctxt,_) = typeFormCnc ty
|
|
||||||
return (length ctxt)
|
|
||||||
|
|
||||||
predefModInfo :: SourceModInfo
|
|
||||||
predefModInfo = ModInfo MTResource MSComplete noOptions [] Nothing [] [] "Predef.gf" Nothing primitives
|
|
||||||
|
|
||||||
appPredefined :: Term -> Err (Term,Bool)
|
|
||||||
appPredefined t = case t of
|
|
||||||
App f x0 -> do
|
|
||||||
(x,_) <- appPredefined x0
|
|
||||||
case f of
|
|
||||||
-- one-place functions
|
|
||||||
Q (mod,f) | mod == cPredef ->
|
|
||||||
case x of
|
|
||||||
(K s) | f == cLength -> retb $ EInt $ length s
|
|
||||||
(K s) | f == cIsUpper -> retb $ if (all isUpper s) then predefTrue else predefFalse
|
|
||||||
(K s) | f == cToUpper -> retb $ K $ map toUpper s
|
|
||||||
(K s) | f == cToLower -> retb $ K $ map toLower s
|
|
||||||
(K s) | f == cError -> retb $ Error s
|
|
||||||
|
|
||||||
_ -> retb t
|
|
||||||
|
|
||||||
-- two-place functions
|
|
||||||
App (Q (mod,f)) z0 | mod == cPredef -> do
|
|
||||||
(z,_) <- appPredefined z0
|
|
||||||
case (norm z, norm x) of
|
|
||||||
(EInt i, K s) | f == cDrop -> retb $ K (drop i s)
|
|
||||||
(EInt i, K s) | f == cTake -> retb $ K (take i s)
|
|
||||||
(EInt i, K s) | f == cTk -> retb $ K (take (max 0 (length s - i)) s)
|
|
||||||
(EInt i, K s) | f == cDp -> retb $ K (drop (max 0 (length s - i)) s)
|
|
||||||
(K s, K t) | f == cEqStr -> retb $ if s == t then predefTrue else predefFalse
|
|
||||||
(K s, K t) | f == cOccur -> retb $ if substring s t then predefTrue else predefFalse
|
|
||||||
(K s, K t) | f == cOccurs -> retb $ if any (flip elem t) s then predefTrue else predefFalse
|
|
||||||
(EInt i, EInt j) | f == cEqInt -> retb $ if i==j then predefTrue else predefFalse
|
|
||||||
(EInt i, EInt j) | f == cLessInt -> retb $ if i<j then predefTrue else predefFalse
|
|
||||||
(EInt i, EInt j) | f == cPlus -> retb $ EInt $ i+j
|
|
||||||
(_, t) | f == cShow && notVar t -> retb $ foldrC $ map K $ words $ render (ppTerm Unqualified 0 t)
|
|
||||||
(_, K s) | f == cRead -> retb $ Cn (identS s) --- because of K, only works for atomic tags
|
|
||||||
(_, t) | f == cToStr -> trm2str t >>= retb
|
|
||||||
_ -> retb t ---- prtBad "cannot compute predefined" t
|
|
||||||
|
|
||||||
-- three-place functions
|
|
||||||
App (App (Q (mod,f)) z0) y0 | mod == cPredef -> do
|
|
||||||
(y,_) <- appPredefined y0
|
|
||||||
(z,_) <- appPredefined z0
|
|
||||||
case (z, y, x) of
|
|
||||||
(ty,op,t) | f == cMapStr -> retf $ mapStr ty op t
|
|
||||||
_ | f == cEqVal && notVar y && notVar x -> retb $ if y==x then predefTrue else predefFalse
|
|
||||||
_ -> retb t ---- prtBad "cannot compute predefined" t
|
|
||||||
|
|
||||||
_ -> retb t ---- prtBad "cannot compute predefined" t
|
|
||||||
_ -> retb t
|
|
||||||
---- should really check the absence of arg variables
|
|
||||||
where
|
|
||||||
retb t = return (retc t,True) -- no further computing needed
|
|
||||||
retf t = return (retc t,False) -- must be computed further
|
|
||||||
retc t = case t of
|
|
||||||
K [] -> t
|
|
||||||
K s -> foldr1 C (map K (words s))
|
|
||||||
_ -> t
|
|
||||||
norm t = case t of
|
|
||||||
Empty -> K []
|
|
||||||
C u v -> case (norm u,norm v) of
|
|
||||||
(K x,K y) -> K (x +++ y)
|
|
||||||
_ -> t
|
|
||||||
_ -> t
|
|
||||||
notVar t = case t of
|
|
||||||
Vr _ -> False
|
|
||||||
App f a -> notVar f && notVar a
|
|
||||||
_ -> True ---- would need to check that t is a value
|
|
||||||
foldrC ts = if null ts then Empty else foldr1 C ts
|
|
||||||
|
|
||||||
-- read makes variables into constants
|
|
||||||
|
|
||||||
predefTrue = QC (cPredef,cPTrue)
|
|
||||||
predefFalse = QC (cPredef,cPFalse)
|
|
||||||
|
|
||||||
substring :: String -> String -> Bool
|
|
||||||
substring s t = case (s,t) of
|
|
||||||
(c:cs, d:ds) -> (c == d && substring cs ds) || substring s ds
|
|
||||||
([],_) -> True
|
|
||||||
_ -> False
|
|
||||||
|
|
||||||
trm2str :: Term -> Err Term
|
|
||||||
trm2str t = case t of
|
|
||||||
R ((_,(_,s)):_) -> trm2str s
|
|
||||||
T _ ((_,s):_) -> trm2str s
|
|
||||||
V _ (s:_) -> trm2str s
|
|
||||||
C _ _ -> return $ t
|
|
||||||
K _ -> return $ t
|
|
||||||
S c _ -> trm2str c
|
|
||||||
Empty -> return $ t
|
|
||||||
_ -> Bad (render (text "cannot get Str from term" <+> ppTerm Unqualified 0 t))
|
|
||||||
|
|
||||||
-- simultaneous recursion on type and term: type arg is essential!
|
|
||||||
-- But simplify the task by assuming records are type-annotated
|
|
||||||
-- (this has been done in type checking)
|
|
||||||
mapStr :: Type -> Term -> Term -> Term
|
|
||||||
mapStr ty f t = case (ty,t) of
|
|
||||||
_ | elem ty [typeStr,typeTok] -> App f t
|
|
||||||
(_, R ts) -> R [(l,mapField v) | (l,v) <- ts]
|
|
||||||
(Table a b,T ti cs) -> T ti [(p,mapStr b f v) | (p,v) <- cs]
|
|
||||||
_ -> t
|
|
||||||
where
|
|
||||||
mapField (mty,te) = case mty of
|
|
||||||
Just ty -> (mty,mapStr ty f te)
|
|
||||||
_ -> (mty,te)
|
|
||||||
-}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user