mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-20 08:32:50 -06:00
Compare commits
56 Commits
concrete-n
...
v3.11-test
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
e1a40640cd | ||
|
|
be231584f6 | ||
|
|
12c564f97c |
13
.github/workflows/build-all-versions.yml
vendored
13
.github/workflows/build-all-versions.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
cabal: ["3.2"]
|
cabal: ["latest"]
|
||||||
ghc:
|
ghc:
|
||||||
- "8.6.5"
|
- "8.6.5"
|
||||||
- "8.8.3"
|
- "8.8.3"
|
||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
||||||
|
|
||||||
- uses: actions/setup-haskell@v1.1.4
|
- uses: haskell/actions/setup@v1
|
||||||
id: setup-haskell-cabal
|
id: setup-haskell-cabal
|
||||||
name: Setup Haskell
|
name: Setup Haskell
|
||||||
with:
|
with:
|
||||||
@@ -65,7 +65,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
stack: ["2.3.3"]
|
stack: ["latest"]
|
||||||
ghc: ["7.10.3","8.0.2", "8.2.2", "8.4.4", "8.6.5", "8.8.4"]
|
ghc: ["7.10.3","8.0.2", "8.2.2", "8.4.4", "8.6.5", "8.8.4"]
|
||||||
# ghc: ["8.8.3"]
|
# ghc: ["8.8.3"]
|
||||||
|
|
||||||
@@ -73,11 +73,12 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.ref == 'refs/heads/master'
|
||||||
|
|
||||||
- uses: actions/setup-haskell@v1.1.4
|
- uses: haskell/actions/setup@v1
|
||||||
name: Setup Haskell Stack
|
name: Setup Haskell Stack
|
||||||
with:
|
with:
|
||||||
# ghc-version: ${{ matrix.ghc }}
|
ghc-version: ${{ matrix.ghc }}
|
||||||
stack-version: ${{ matrix.stack }}
|
stack-version: 'latest'
|
||||||
|
enable-stack: true
|
||||||
|
|
||||||
- uses: actions/cache@v1
|
- uses: actions/cache@v1
|
||||||
name: Cache ~/.stack
|
name: Cache ~/.stack
|
||||||
|
|||||||
73
.github/workflows/build-binary-packages.yml
vendored
73
.github/workflows/build-binary-packages.yml
vendored
@@ -3,6 +3,7 @@ name: Build Binary Packages
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
|
types: ["created"]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
@@ -10,11 +11,13 @@ jobs:
|
|||||||
|
|
||||||
ubuntu:
|
ubuntu:
|
||||||
name: Build Ubuntu package
|
name: Build Ubuntu package
|
||||||
runs-on: ubuntu-18.04
|
strategy:
|
||||||
# strategy:
|
matrix:
|
||||||
# matrix:
|
os:
|
||||||
# ghc: ["8.6.5"]
|
- ubuntu-18.04
|
||||||
# cabal: ["2.4"]
|
- ubuntu-20.04
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -53,19 +56,33 @@ jobs:
|
|||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: gf-${{ github.sha }}-ubuntu
|
name: gf-${{ github.event.release.tag_name }}-${{ matrix.os }}.deb
|
||||||
path: dist/gf_*.deb
|
path: dist/gf_*.deb
|
||||||
if-no-files-found: error
|
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:
|
macos:
|
||||||
name: Build macOS package
|
name: Build macOS package
|
||||||
runs-on: macos-10.15
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ghc: ["8.6.5"]
|
ghc: ["8.6.5"]
|
||||||
cabal: ["2.4"]
|
cabal: ["2.4"]
|
||||||
|
os: ["macos-10.15"]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -92,19 +109,33 @@ jobs:
|
|||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: gf-${{ github.sha }}-macos
|
name: gf-${{ github.event.release.tag_name }}-macos
|
||||||
path: dist/gf-*.pkg
|
path: dist/gf-*.pkg
|
||||||
if-no-files-found: error
|
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:
|
windows:
|
||||||
name: Build Windows package
|
name: Build Windows package
|
||||||
runs-on: windows-2019
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ghc: ["8.6.5"]
|
ghc: ["8.6.5"]
|
||||||
cabal: ["2.4"]
|
cabal: ["2.4"]
|
||||||
|
os: ["windows-2019"]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -136,16 +167,18 @@ jobs:
|
|||||||
cp /mingw64/bin/libpgf-0.dll /c/tmp-dist/c
|
cp /mingw64/bin/libpgf-0.dll /c/tmp-dist/c
|
||||||
cp /mingw64/bin/libgu-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
|
- name: Build Java bindings
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
run: |
|
run: |
|
||||||
export PATH="${PATH}:/c/Program Files/Java/jdk8u275-b01/bin"
|
export JDKPATH=/c/hostedtoolcache/windows/Java_Adopt_jdk/8.0.292-10/x64
|
||||||
|
export PATH="${PATH}:${JDKPATH}/bin"
|
||||||
cd src/runtime/java
|
cd src/runtime/java
|
||||||
make \
|
make \
|
||||||
JNI_INCLUDES="-I \"/c/Program Files/Java/jdk8u275-b01/include\" -I \"/c/Program Files/Java/jdk8u275-b01/include/win32\" -I \"/mingw64/include\" -D__int64=int64_t" \
|
JNI_INCLUDES="-I \"${JDKPATH}/include\" -I \"${JDKPATH}/include/win32\" -I \"/mingw64/include\" -D__int64=int64_t" \
|
||||||
WINDOWS_LDFLAGS="-L\"/mingw64/lib\" -no-undefined"
|
WINDOWS_LDFLAGS="-L\"/mingw64/lib\" -no-undefined"
|
||||||
make install
|
make install
|
||||||
cp .libs//msys-jpgf-0.dll /c/tmp-dist/java/jpgf.dll
|
cp .libs/msys-jpgf-0.dll /c/tmp-dist/java/jpgf.dll
|
||||||
cp jpgf.jar /c/tmp-dist/java
|
cp jpgf.jar /c/tmp-dist/java
|
||||||
|
|
||||||
- name: Build Python bindings
|
- name: Build Python bindings
|
||||||
@@ -157,7 +190,7 @@ jobs:
|
|||||||
cd src/runtime/python
|
cd src/runtime/python
|
||||||
python setup.py build
|
python setup.py build
|
||||||
python setup.py install
|
python setup.py install
|
||||||
cp /usr/lib/python3.8/site-packages/pgf* /c/tmp-dist/python
|
cp /usr/lib/python3.9/site-packages/pgf* /c/tmp-dist/python
|
||||||
|
|
||||||
- name: Setup Haskell
|
- name: Setup Haskell
|
||||||
uses: actions/setup-haskell@v1
|
uses: actions/setup-haskell@v1
|
||||||
@@ -180,6 +213,18 @@ jobs:
|
|||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: gf-${{ github.sha }}-windows
|
name: gf-${{ github.event.release.tag_name }}-windows
|
||||||
path: C:\tmp-dist\*
|
path: C:\tmp-dist\*
|
||||||
if-no-files-found: error
|
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
|
||||||
|
|||||||
41
Makefile
41
Makefile
@@ -1,31 +1,48 @@
|
|||||||
.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
|
bash bin/clean_html
|
||||||
|
|
||||||
gf:
|
|
||||||
cabal build rgl-none
|
|
||||||
strip dist/build/gf/gf
|
|
||||||
|
|
||||||
html::
|
html::
|
||||||
bash bin/update_html
|
bash bin/update_html
|
||||||
|
|
||||||
@@ -35,7 +52,7 @@ html::
|
|||||||
deb:
|
deb:
|
||||||
dpkg-buildpackage -b -uc
|
dpkg-buildpackage -b -uc
|
||||||
|
|
||||||
# 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
|
||||||
|
|
||||||
|
|||||||
6
debian/changelog
vendored
6
debian/changelog
vendored
@@ -1,3 +1,9 @@
|
|||||||
|
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-1) xenial bionic cosmic; urgency=low
|
||||||
|
|
||||||
* GF 3.10.4
|
* GF 3.10.4
|
||||||
|
|||||||
10
debian/rules
vendored
10
debian/rules
vendored
@@ -16,9 +16,9 @@ override_dh_shlibdeps:
|
|||||||
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 v1-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
|
SET_LDL=LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(CURDIR)/src/runtime/c/.libs
|
||||||
|
|
||||||
@@ -26,10 +26,10 @@ 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/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
|
cd src/runtime/java && make CFLAGS="-I$(CURDIR)/src/runtime/c -L$(CURDIR)/src/runtime/c/.libs" INSTALL_PATH=/usr
|
||||||
echo $(SET_LDL)
|
echo $(SET_LDL)
|
||||||
-$(SET_LDL) cabal build
|
-$(SET_LDL) cabal v1-build
|
||||||
|
|
||||||
override_dh_auto_install:
|
override_dh_auto_install:
|
||||||
$(SET_LDL) 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 install
|
cd src/runtime/java && make INSTALL_PATH=$(CURDIR)/debian/gf/usr install
|
||||||
|
|||||||
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,6 +1,6 @@
|
|||||||
GF Developers Guide
|
GF Developers Guide
|
||||||
|
|
||||||
2018-07-26
|
2021-07-15
|
||||||
|
|
||||||
%!options(html): --toc
|
%!options(html): --toc
|
||||||
|
|
||||||
@@ -15,388 +15,287 @@ 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/].
|
|
||||||
|
|
||||||
=== 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)
|
- **On Mac OS and Windows**, this should work automatically.
|
||||||
required by //haskeline// are installed. Here is one way to do this:
|
|
||||||
|
- **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 Ubuntu: ``sudo apt-get install libghc-haskeline-dev``
|
||||||
- On Fedora: ``sudo dnf install ghc-haskeline-devel``
|
- 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
|
$ git pull
|
||||||
```
|
```
|
||||||
This can be done anywhere in your local repository.
|
|
||||||
|
|
||||||
|
=== Contribute your changes: fork the main repository ===
|
||||||
|
|
||||||
==== Recording local changes ====[record]
|
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.
|
||||||
|
|
||||||
Since every copy is a repository, you can have local version control
|
+ **Creating and cloning a fork —**
|
||||||
of your changes.
|
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.
|
||||||
If you have added files, you first need to tell your local repository to
|
|
||||||
keep them under revision control:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git add file1 file2 ...
|
$ git clone https://github.com/<YOUR_USERNAME>/gf-core.git
|
||||||
```
|
```
|
||||||
|
|
||||||
To record changes, use:
|
+ **Updating your copy —**
|
||||||
|
Once you have cloned your fork, you need to set up the main repository as a remote:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git commit file1 file2 ...
|
$ git remote add upstream https://github.com/GrammaticalFramework/gf-core.git
|
||||||
```
|
```
|
||||||
|
|
||||||
This creates a patch against the previous version and stores it in your
|
Then you can get the latest updates by running the following:
|
||||||
local repository. You can record any number of changes before
|
|
||||||
pushing them to the main repo. In fact, you don't have to push them at
|
|
||||||
all if you want to keep the changes only in your local repo.
|
|
||||||
|
|
||||||
Instead of enumerating all modified files on the command line,
|
|
||||||
you can use the flag ``-a`` to automatically record //all// modified
|
|
||||||
files. You still need to use ``git add`` to add new files.
|
|
||||||
|
|
||||||
|
|
||||||
=== Read-write access ===
|
|
||||||
|
|
||||||
If you are a member of the GF project on GitHub, you can push your
|
|
||||||
changes directly to the GF git repository on GitHub.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git push
|
$ git pull upstream master
|
||||||
```
|
```
|
||||||
|
|
||||||
It is also possible for anyone else to contribute by
|
+ **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.
|
||||||
|
|
||||||
- creating a fork of the GF repository on GitHub,
|
+ **Pull request —**
|
||||||
- working with local clone of the fork (obtained with ``git clone``),
|
When you want to contribute your changes to the main gf-core repository,
|
||||||
- pushing changes to the fork,
|
[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]
|
||||||
- and finally sending 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
|
||||||
|
```
|
||||||
|
|
||||||
|
It will install GF and all necessary tools and libraries to do that.
|
||||||
|
|
||||||
|
|
||||||
|
=== Alternative: use Cabal ===
|
||||||
|
You can also install GF using Cabal, if you prefer Cabal to Stack. In that case, you may need to install some prerequisites yourself.
|
||||||
|
|
||||||
|
The actual installation process is similar to Stack: open a terminal, go to the top directory (``gf-core``), and type the following command.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cabal install
|
$ cabal install
|
||||||
```
|
```
|
||||||
|
|
||||||
This will automatically download any additional Haskell libraries needed to
|
//The old (potentially outdated) instructions for Cabal are moved to a [separate page ../doc/gf-developers-old-cabal.html]. If you run into trouble with ``cabal install``, you may want to take a look.//
|
||||||
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
|
== Compiling GF with C runtime system support ==
|
||||||
//configure//, //build// and //install// steps.
|
|
||||||
|
|
||||||
=== Configure ===
|
The C runtime system is a separate implementation of the PGF runtime services.
|
||||||
|
|
||||||
During the configuration phase Cabal will check that you have all
|
|
||||||
necessary tools and libraries needed for GF. The configuration is
|
|
||||||
started by the command:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal configure
|
|
||||||
```
|
|
||||||
|
|
||||||
If you don't see any error message from the above command then you
|
|
||||||
have everything that is needed for GF. You can also add the option
|
|
||||||
``-v`` to see more details about the configuration.
|
|
||||||
|
|
||||||
You can use ``cabal configure --help`` to get a list of configuration options.
|
|
||||||
|
|
||||||
=== Build ===
|
|
||||||
|
|
||||||
The build phase does two things. First it builds the GF compiler from
|
|
||||||
the Haskell source code and after that it builds the GF Resource Grammar
|
|
||||||
Library using the already build compiler. The simplest command is:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal build
|
|
||||||
```
|
|
||||||
|
|
||||||
Again you can add the option ``-v`` if you want to see more details.
|
|
||||||
|
|
||||||
==== Parallel builds ====
|
|
||||||
|
|
||||||
If you have Cabal>=1.20 you can enable parallel compilation by using
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal build -j
|
|
||||||
```
|
|
||||||
|
|
||||||
or by putting a line
|
|
||||||
```
|
|
||||||
jobs: $ncpus
|
|
||||||
```
|
|
||||||
in your ``.cabal/config`` file. Cabal
|
|
||||||
will pass this option to GHC when building the GF compiler, if you
|
|
||||||
have GHC>=7.8.
|
|
||||||
|
|
||||||
Cabal also passes ``-j`` to GF to enable parallel compilation of the
|
|
||||||
Resource Grammar Library. This is done unconditionally to avoid
|
|
||||||
causing problems for developers with Cabal<1.20. You can disable this
|
|
||||||
by editing the last few lines in ``WebSetup.hs``.
|
|
||||||
|
|
||||||
|
|
||||||
==== Partial builds ====
|
|
||||||
|
|
||||||
**NOTE**: The following doesn't work with recent versions of ``cabal``.
|
|
||||||
%% // TH 2015-06-22
|
|
||||||
|
|
||||||
Sometimes you just want to work on the GF compiler and don't want to
|
|
||||||
recompile the resource library after each change. In this case use
|
|
||||||
this extended command:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal build rgl-none
|
|
||||||
```
|
|
||||||
|
|
||||||
The resource library could also be compiled in two modes: with present
|
|
||||||
tense only and with all tenses. By default it is compiled with all
|
|
||||||
tenses. If you want to use the library with only present tense you can
|
|
||||||
compile it in this special mode with the command:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal build present
|
|
||||||
```
|
|
||||||
|
|
||||||
You could also control which languages you want to be recompiled by
|
|
||||||
adding the option ``langs=list``. For example the following command
|
|
||||||
will compile only the English and the Swedish language:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal build langs=Eng,Swe
|
|
||||||
```
|
|
||||||
|
|
||||||
=== Install ===
|
|
||||||
|
|
||||||
After you have compiled GF you need to install the executable and libraries
|
|
||||||
to make the system usable.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal copy
|
|
||||||
$ cabal register
|
|
||||||
```
|
|
||||||
|
|
||||||
This command installs the GF compiler for a single user, in the standard
|
|
||||||
place used by Cabal.
|
|
||||||
On Linux and Mac this could be ``$HOME/.cabal/bin``.
|
|
||||||
On Mac it could also be ``$HOME/Library/Haskell/bin``.
|
|
||||||
On Windows this is ``C:\Program Files\Haskell\bin``.
|
|
||||||
|
|
||||||
The compiled GF Resource Grammar Library will be installed
|
|
||||||
under the same prefix, e.g. in
|
|
||||||
``$HOME/.cabal/share/gf-3.3.3/lib`` on Linux and
|
|
||||||
in ``C:\Program Files\Haskell\gf-3.3.3\lib`` on Windows.
|
|
||||||
|
|
||||||
If you want to install in some other place then use the ``--prefix``
|
|
||||||
option during the configuration phase.
|
|
||||||
|
|
||||||
=== Clean ===
|
|
||||||
|
|
||||||
Sometimes you want to clean up the compilation and start again from clean
|
|
||||||
sources. Use the clean command for this purpose:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cabal clean
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
%=== SDist ===
|
|
||||||
%
|
|
||||||
%You can use the command:
|
|
||||||
%
|
|
||||||
%% This does *NOT* include everything that is needed // TH 2012-08-06
|
|
||||||
%```
|
|
||||||
%$ cabal sdist
|
|
||||||
%```
|
|
||||||
%
|
|
||||||
%to prepare archive with all source codes needed to compile GF.
|
|
||||||
|
|
||||||
=== Known problems with Cabal ===
|
|
||||||
|
|
||||||
Some versions of Cabal (at least version 1.16) seem to have a bug that can
|
|
||||||
cause the following error:
|
|
||||||
|
|
||||||
```
|
|
||||||
Configuring gf-3.x...
|
|
||||||
setup: Distribution/Simple/PackageIndex.hs:124:8-13: Assertion failed
|
|
||||||
```
|
|
||||||
|
|
||||||
The exact cause of this problem is unclear, but it seems to happen
|
|
||||||
during the configure phase if the same version of GF is already installed,
|
|
||||||
so a workaround is to remove the existing installation with
|
|
||||||
|
|
||||||
```
|
|
||||||
ghc-pkg unregister gf
|
|
||||||
```
|
|
||||||
|
|
||||||
You can check with ``ghc-pkg list gf`` that it is gone.
|
|
||||||
|
|
||||||
== Compilation with make ==
|
|
||||||
|
|
||||||
If you feel more comfortable with Makefiles then there is a thin Makefile
|
|
||||||
wrapper arround Cabal for you. If you just type:
|
|
||||||
```
|
|
||||||
$ make
|
|
||||||
```
|
|
||||||
the configuration phase will be run automatically if needed and after that
|
|
||||||
the sources will be compiled.
|
|
||||||
|
|
||||||
%% cabal build rgl-none does not work with recent versions of Cabal
|
|
||||||
%If you don't want to compile the resource library
|
|
||||||
%every time then you can use:
|
|
||||||
%```
|
|
||||||
%$ make gf
|
|
||||||
%```
|
|
||||||
|
|
||||||
For installation use:
|
|
||||||
```
|
|
||||||
$ make install
|
|
||||||
```
|
|
||||||
For cleaning:
|
|
||||||
```
|
|
||||||
$ make clean
|
|
||||||
```
|
|
||||||
%and to build source distribution archive run:
|
|
||||||
%```
|
|
||||||
%$ make sdist
|
|
||||||
%```
|
|
||||||
|
|
||||||
== Compiling GF with C run-time system support ==
|
|
||||||
|
|
||||||
The C run-time system is a separate implementation of the PGF run-time services.
|
|
||||||
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
|
||||||
cabal install -fserver -fc-runtime
|
|
||||||
```
|
|
||||||
from the top directory. This give you three new things:
|
|
||||||
|
|
||||||
- ``PGF2``: a module to import in Haskell programs, providing a binding to
|
``$ bash install.sh``
|
||||||
the C run-time system.
|
|
||||||
|
|
||||||
- The GF shell can be started with ``gf -cshell`` or ``gf -crun`` to use
|
This will install the C header files and libraries need to write C programs
|
||||||
|
that use PGF grammars.
|
||||||
|
|
||||||
|
% If this doesn't work for you, follow the manual instructions in the [INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file under your operating system.
|
||||||
|
|
||||||
|
- **On other operating systems —** Follow the instructions in the
|
||||||
|
[INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file under your operating system.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Depending on what you want to do with the C runtime, you can follow one or more of the following steps.
|
||||||
|
|
||||||
|
=== Use the C runtime from another programming language ===[bindings]
|
||||||
|
|
||||||
|
% **If you just want to use the C runtime from Python, Java, or Haskell, you don't need to change your GF installation.**
|
||||||
|
|
||||||
|
- **What —**
|
||||||
|
This is the most common use case for the C runtime: compile
|
||||||
|
your GF grammars into PGF with the standard GF executable,
|
||||||
|
and manipulate the PGFs from another programming language,
|
||||||
|
using the bindings to the C runtime.
|
||||||
|
|
||||||
|
|
||||||
|
- **How —**
|
||||||
|
The Python, Java and Haskell bindings are found in the
|
||||||
|
``src/runtime/{python,java,haskell-bind}`` directories,
|
||||||
|
respecively. Compile them by following the instructions
|
||||||
|
in the ``INSTALL`` or ``README`` files in those directories.
|
||||||
|
|
||||||
|
The Python library can also be installed from PyPI using ``pip install pgf``.
|
||||||
|
|
||||||
|
|
||||||
|
//If you are on Mac and get an error about ``clang`` version, you can try some of [these solutions https://stackoverflow.com/questions/63972113/big-sur-clang-invalid-version-error-due-to-macosx-deployment-target]—but be careful before removing any existing installations.//
|
||||||
|
|
||||||
|
|
||||||
|
=== Use GF shell with C runtime support ===
|
||||||
|
|
||||||
|
- **What —**
|
||||||
|
If you want to use the GF shell with C runtime functionalities, then you need to (re)compile GF with special flags.
|
||||||
|
|
||||||
|
The GF shell can be started with ``gf -cshell`` or ``gf -crun`` to use
|
||||||
the C run-time system instead of the Haskell run-time system.
|
the C run-time system instead of the Haskell run-time system.
|
||||||
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).
|
||||||
|
|
||||||
- ``gf -server`` mode is extended with new requests to call the C run-time
|
(Re)compiling your GF with these flags will also give you
|
||||||
|
Haskell bindings to the C runtime, as a library called ``PGF2``,
|
||||||
|
but if you want Python or Java bindings, you need to do [the previous step #bindings].
|
||||||
|
|
||||||
|
% ``PGF2``: a module to import in Haskell programs, providing a binding to the C run-time system.
|
||||||
|
|
||||||
|
- **How —**
|
||||||
|
If you use cabal, run the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
cabal install -fc-runtime
|
||||||
|
```
|
||||||
|
|
||||||
|
from the top directory (``gf-core``).
|
||||||
|
|
||||||
|
If you use stack, uncomment the following lines in the ``stack.yaml`` file:
|
||||||
|
|
||||||
|
```
|
||||||
|
flags:
|
||||||
|
gf:
|
||||||
|
c-runtime: true
|
||||||
|
extra-lib-dirs:
|
||||||
|
- /usr/local/lib
|
||||||
|
```
|
||||||
|
and then run ``stack install`` from the top directory (``gf-core``).
|
||||||
|
|
||||||
|
|
||||||
|
//If you get an "``error while loading shared libraries``" when trying to run GF with C runtime, remember to declare your ``LD_LIBRARY_PATH``.//
|
||||||
|
//Add ``export LD_LIBRARY_PATH="/usr/local/lib"`` to either your ``.bashrc`` or ``.profile``. You should now be able to start GF with C runtime.//
|
||||||
|
|
||||||
|
|
||||||
|
=== Use GF server mode with C runtime ===
|
||||||
|
|
||||||
|
- **What —**
|
||||||
|
With this feature, ``gf -server`` mode is extended with new requests to call the C run-time
|
||||||
system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
|
system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
|
||||||
|
|
||||||
|
- **How —**
|
||||||
|
If you use cabal, run the following command:
|
||||||
|
|
||||||
=== Python and Java bindings ===
|
```
|
||||||
|
cabal install -fc-runtime -fserver
|
||||||
|
```
|
||||||
|
from the top directory.
|
||||||
|
|
||||||
|
If you use stack, add the following lines in the ``stack.yaml`` file:
|
||||||
|
|
||||||
|
```
|
||||||
|
flags:
|
||||||
|
gf:
|
||||||
|
c-runtime: true
|
||||||
|
server: true
|
||||||
|
extra-lib-dirs:
|
||||||
|
- /usr/local/lib
|
||||||
|
```
|
||||||
|
|
||||||
|
and then run ``stack install``, also from the top directory.
|
||||||
|
|
||||||
The C run-time system can also be used from Python and Java. Python and Java
|
|
||||||
bindings are found in the ``src/runtime/python`` and ``src/runtime/java``
|
|
||||||
directories, respecively. Compile them by following the instructions in
|
|
||||||
the ``INSTALL`` files in those directories.
|
|
||||||
|
|
||||||
The Python library can also be installed from PyPI using `pip install pgf`.
|
|
||||||
|
|
||||||
== 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:
|
||||||
```
|
```
|
||||||
@@ -418,103 +317,68 @@ If you do not have Haskell installed, you can use the simple build script ``Setu
|
|||||||
|
|
||||||
== 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 ====
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo apt-get install dpkg-dev debhelper
|
|
||||||
```
|
|
||||||
|
|
||||||
==== Creating the package ====
|
|
||||||
|
|
||||||
Make sure the ``debian/changelog`` starts with an entry that describes the
|
|
||||||
version you are building. Then run
|
|
||||||
|
|
||||||
```
|
|
||||||
make deb
|
|
||||||
```
|
|
||||||
|
|
||||||
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 test suite ==
|
== Running the test suite ==
|
||||||
|
|
||||||
**NOTE:** The test suite has not been maintained recently, so expect many
|
The GF test suite is run with one of the following commands from the top directory:
|
||||||
tests to fail.
|
|
||||||
%% // TH 2012-08-06
|
|
||||||
|
|
||||||
GF has testsuite. It is run with the following command:
|
|
||||||
```
|
```
|
||||||
$ cabal test
|
$ cabal test
|
||||||
```
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```
|
||||||
|
$ stack 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.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: GF 3.11 Release Notes
|
title: GF 3.11 Release Notes
|
||||||
date: ... December 2020
|
date: ... July 2021
|
||||||
...
|
...
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
@@ -12,24 +12,27 @@ See the [download page](index-3.11.html).
|
|||||||
From this release, the binary GF core packages do not contain the RGL.
|
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).
|
The RGL's release cycle is now completely separate from GF's. See [RGL releases](https://github.com/GrammaticalFramework/gf-rgl/releases).
|
||||||
|
|
||||||
Over 400 changes have been pushed to GF core
|
Over 500 changes have been pushed to GF core
|
||||||
since the release of GF 3.10 in December 2018.
|
since the release of GF 3.10 in December 2018.
|
||||||
|
|
||||||
## General
|
## General
|
||||||
|
|
||||||
- Make the test suite work again.
|
- Make the test suite work again.
|
||||||
- Compatibility with new versions of GHC, including multiple Stack files for the different versions.
|
- Compatibility with new versions of GHC, including multiple Stack files for the different versions.
|
||||||
- Updates to build scripts and CI.
|
- Support for newer version of Ubuntu 20.04 in the precompiled binaries.
|
||||||
- Bug fixes.
|
- Updates to build scripts and CI workflows.
|
||||||
|
- Bug fixes and code cleanup.
|
||||||
|
|
||||||
## GF compiler and run-time library
|
## GF compiler and run-time library
|
||||||
|
|
||||||
- Huge improvements in time & space requirements for grammar compilation (pending [#87](https://github.com/GrammaticalFramework/gf-core/pull/87)).
|
|
||||||
- Add CoNLL output to `visualize_tree` shell command.
|
- Add CoNLL output to `visualize_tree` shell command.
|
||||||
- Add canonical GF as output format in the compiler.
|
- Add canonical GF as output format in the compiler.
|
||||||
- Add PGF JSON 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).
|
- 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 Haskell export.
|
||||||
|
- Improvements to the GF shell.
|
||||||
|
- Improvements to canonical GF compilation.
|
||||||
- Improvements to the C runtime.
|
- Improvements to the C runtime.
|
||||||
- Improvements to `gf -server` mode.
|
- Improvements to `gf -server` mode.
|
||||||
- Clearer compiler error messages.
|
- Clearer compiler error messages.
|
||||||
|
|||||||
146
gf.cabal
146
gf.cabal
@@ -1,17 +1,16 @@
|
|||||||
name: gf
|
name: gf
|
||||||
version: 3.10.4-git
|
version: 3.11.0-git
|
||||||
|
|
||||||
cabal-version: >= 1.22
|
cabal-version: 1.22
|
||||||
build-type: Custom
|
build-type: Custom
|
||||||
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/
|
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
|
||||||
tested-with: GHC==7.10.3, GHC==8.0.2, GHC==8.2.2, GHC==8.4.3
|
|
||||||
|
|
||||||
data-dir: src
|
data-dir: src
|
||||||
extra-source-files: WebSetup.hs
|
extra-source-files: WebSetup.hs
|
||||||
@@ -42,11 +41,11 @@ data-files:
|
|||||||
|
|
||||||
custom-setup
|
custom-setup
|
||||||
setup-depends:
|
setup-depends:
|
||||||
base,
|
base >= 4.9.1 && < 4.15,
|
||||||
Cabal >= 1.22.0.0,
|
Cabal >= 1.22.0.0,
|
||||||
directory,
|
directory >= 1.3.0 && < 1.4,
|
||||||
filepath,
|
filepath >= 1.4.1 && < 1.5,
|
||||||
process >=1.0.1.1
|
process >= 1.0.1.1 && < 1.7
|
||||||
|
|
||||||
source-repository head
|
source-repository head
|
||||||
type: git
|
type: git
|
||||||
@@ -74,20 +73,25 @@ flag c-runtime
|
|||||||
|
|
||||||
library
|
library
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
build-depends: base >= 4.6 && <5,
|
build-depends:
|
||||||
array,
|
-- GHC 8.0.2 to GHC 8.10.4
|
||||||
containers,
|
array >= 0.5.1 && < 0.6,
|
||||||
bytestring,
|
base >= 4.9.1 && < 4.15,
|
||||||
utf8-string,
|
bytestring >= 0.10.8 && < 0.11,
|
||||||
random,
|
containers >= 0.5.7 && < 0.7,
|
||||||
pretty,
|
exceptions >= 0.8.3 && < 0.11,
|
||||||
mtl,
|
ghc-prim >= 0.5.0 && < 0.7,
|
||||||
exceptions,
|
mtl >= 2.2.1 && < 2.3,
|
||||||
fail,
|
pretty >= 1.1.3 && < 1.2,
|
||||||
-- For compatability with ghc < 8
|
random >= 1.1 && < 1.3,
|
||||||
|
utf8-string >= 1.0.1.1 && < 1.1,
|
||||||
-- We need transformers-compat >= 0.6.3, but that is only in newer snapshots where it is redundant.
|
-- We need transformers-compat >= 0.6.3, but that is only in newer snapshots where it is redundant.
|
||||||
transformers-compat,
|
transformers-compat >= 0.5.1.4 && < 0.7
|
||||||
ghc-prim
|
|
||||||
|
if impl(ghc<8.0)
|
||||||
|
build-depends:
|
||||||
|
fail >= 4.9.0 && < 4.10
|
||||||
|
|
||||||
hs-source-dirs: src/runtime/haskell
|
hs-source-dirs: src/runtime/haskell
|
||||||
|
|
||||||
other-modules:
|
other-modules:
|
||||||
@@ -136,8 +140,12 @@ 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
|
||||||
|
PGF2.Expr
|
||||||
|
PGF2.Type
|
||||||
|
GF.Interactive2
|
||||||
|
GF.Command.Commands2
|
||||||
hs-source-dirs: src/runtime/haskell-bind
|
hs-source-dirs: src/runtime/haskell-bind
|
||||||
build-tools: hsc2hs
|
build-tools: hsc2hs
|
||||||
extra-libraries: pgf gu
|
extra-libraries: pgf gu
|
||||||
@@ -146,8 +154,14 @@ library
|
|||||||
|
|
||||||
---- GF compiler as a library:
|
---- GF compiler as a library:
|
||||||
|
|
||||||
build-depends: filepath, directory>=1.2, time,
|
build-depends:
|
||||||
process, haskeline, parallel>=3, json
|
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.10
|
||||||
|
|
||||||
hs-source-dirs: src/compiler
|
hs-source-dirs: src/compiler
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
@@ -158,12 +172,19 @@ library
|
|||||||
GF.Grammar.Canonical
|
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
|
||||||
@@ -273,12 +294,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,
|
build-depends:
|
||||||
cgi>=3001.2.2.0
|
cgi >= 3001.3.0.2 && < 3001.6,
|
||||||
|
httpd-shed >= 0.4.0 && < 0.5,
|
||||||
|
network>=2.3 && <2.7
|
||||||
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 && <2.7
|
||||||
else
|
else
|
||||||
build-depends: network<2.6
|
build-depends:
|
||||||
|
network >= 2.5 && <2.6
|
||||||
|
|
||||||
cpp-options: -DSERVER_MODE
|
cpp-options: -DSERVER_MODE
|
||||||
other-modules:
|
other-modules:
|
||||||
@@ -295,7 +321,10 @@ library
|
|||||||
Fold
|
Fold
|
||||||
ExampleDemo
|
ExampleDemo
|
||||||
ExampleService
|
ExampleService
|
||||||
hs-source-dirs: src/server src/server/transfer src/example-based
|
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
|
||||||
@@ -304,17 +333,24 @@ 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,
|
||||||
|
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
|
||||||
@@ -323,7 +359,9 @@ 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
|
||||||
ghc-options: -threaded
|
ghc-options: -threaded
|
||||||
--ghc-options: -fwarn-unused-imports
|
--ghc-options: -fwarn-unused-imports
|
||||||
|
|
||||||
@@ -337,20 +375,30 @@ executable gf
|
|||||||
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:
|
||||||
|
base >= 4.9.1 && < 4.15,
|
||||||
|
Cabal >= 1.8,
|
||||||
|
directory >= 1.3.0 && < 1.4,
|
||||||
|
filepath >= 1.4.1 && < 1.5,
|
||||||
|
process >= 1.4.3 && < 1.7
|
||||||
build-tool-depends: gf:gf
|
build-tool-depends: gf:gf
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|||||||
@@ -214,9 +214,9 @@ least one, it may help you to get a first idea of what GF is.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
We run the IRC channel <strong><code>#gf</code></strong> on the Freenode network, where you are welcome to look for help with small questions or just start a general discussion.
|
We run the IRC channel <strong><code>#gf</code></strong> on the Libera network, where you are welcome to look for help with small questions or just start a general discussion.
|
||||||
You can <a href="https://webchat.freenode.net/?channels=gf">open a web chat</a>
|
You can <a href="https://web.libera.chat/?channels=#gf">open a web chat</a>
|
||||||
or <a href="/irc/">browse the channel logs</a>.
|
or <a href="https://www.grammaticalframework.org/irc/?C=M;O=D">browse the channel logs</a>.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
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>.
|
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>.
|
||||||
|
|||||||
@@ -30,11 +30,12 @@ import Debug.Trace(trace)
|
|||||||
normalForm :: GlobalEnv -> L Ident -> Term -> Term
|
normalForm :: GlobalEnv -> L Ident -> Term -> Term
|
||||||
normalForm (GE gr rv opts _) loc = err (bugloc loc) id . nfx (GE gr rv opts loc)
|
normalForm (GE gr rv opts _) loc = err (bugloc loc) id . nfx (GE gr rv opts loc)
|
||||||
|
|
||||||
|
nfx :: GlobalEnv -> Term -> Err Term
|
||||||
nfx env@(GE _ _ _ loc) t = do
|
nfx env@(GE _ _ _ loc) t = do
|
||||||
v <- eval env [] t
|
v <- eval env [] t
|
||||||
case value2term loc [] v of
|
return (value2term loc [] v)
|
||||||
Left i -> fail ("variable #"++show i++" is out of scope")
|
-- Old value2term error message:
|
||||||
Right t -> return t
|
-- Left i -> fail ("variable #"++show i++" is out of scope")
|
||||||
|
|
||||||
eval :: GlobalEnv -> Env -> Term -> Err Value
|
eval :: GlobalEnv -> Env -> Term -> Err Value
|
||||||
eval (GE gr rvs opts loc) env t = ($ (map snd env)) # value cenv t
|
eval (GE gr rvs opts loc) env t = ($ (map snd env)) # value cenv t
|
||||||
@@ -288,9 +289,9 @@ glue env (v1,v2) = glu v1 v2
|
|||||||
(v1,v2) -> if flag optPlusAsBind (opts env)
|
(v1,v2) -> if flag optPlusAsBind (opts env)
|
||||||
then VC v1 (VC (VApp BIND []) v2)
|
then VC v1 (VC (VApp BIND []) v2)
|
||||||
else let loc = gloc env
|
else let loc = gloc env
|
||||||
vt v = case value2term loc (local env) v of
|
vt v = value2term loc (local env) v
|
||||||
Left i -> Error ('#':show i)
|
-- Old value2term error message:
|
||||||
Right t -> t
|
-- Left i -> Error ('#':show i)
|
||||||
originalMsg = render $ ppL loc (hang "unsupported token gluing" 4
|
originalMsg = render $ ppL loc (hang "unsupported token gluing" 4
|
||||||
(Glue (vt v1) (vt v2)))
|
(Glue (vt v1) (vt v2)))
|
||||||
term = render $ pp $ Glue (vt v1) (vt v2)
|
term = render $ pp $ Glue (vt v1) (vt v2)
|
||||||
@@ -355,9 +356,9 @@ select env vv =
|
|||||||
(v1,v2) -> ok2 VS v1 v2
|
(v1,v2) -> ok2 VS v1 v2
|
||||||
|
|
||||||
match loc cs v =
|
match loc cs v =
|
||||||
case value2term loc [] v of
|
err bad return (matchPattern cs (value2term loc [] v))
|
||||||
Left i -> bad ("variable #"++show i++" is out of scope")
|
-- Old value2term error message:
|
||||||
Right t -> err bad return (matchPattern cs t)
|
-- Left i -> bad ("variable #"++show i++" is out of scope")
|
||||||
where
|
where
|
||||||
bad = fail . ("In pattern matching: "++)
|
bad = fail . ("In pattern matching: "++)
|
||||||
|
|
||||||
@@ -383,9 +384,8 @@ valueTable env i cs =
|
|||||||
wild = case i of TWild _ -> True; _ -> False
|
wild = case i of TWild _ -> True; _ -> False
|
||||||
|
|
||||||
convertv cs' vty =
|
convertv cs' vty =
|
||||||
case value2term (gloc env) [] vty of
|
convert' cs' =<< paramValues'' env (value2term (gloc env) [] vty)
|
||||||
Left i -> fail ("variable #"++show i++" is out of scope")
|
-- Old value2term error message: Left i -> fail ("variable #"++show i++" is out of scope")
|
||||||
Right pty -> convert' cs' =<< paramValues'' env pty
|
|
||||||
|
|
||||||
convert cs' ty = convert' cs' =<< paramValues' env ty
|
convert cs' ty = convert' cs' =<< paramValues' env ty
|
||||||
|
|
||||||
@@ -492,58 +492,60 @@ vtrace loc arg res = trace (render (hang (pv arg) 4 ("->"<+>pv res))) res
|
|||||||
pf (_,VString n) = pp n
|
pf (_,VString n) = pp n
|
||||||
pf (_,v) = ppV v
|
pf (_,v) = ppV v
|
||||||
pa (_,v) = ppV v
|
pa (_,v) = ppV v
|
||||||
ppV v = case value2term' True loc [] v of
|
ppV v = ppTerm Unqualified 10 (value2term' True loc [] v)
|
||||||
Left i -> "variable #" <> pp i <+> "is out of scope"
|
-- Old value2term error message:
|
||||||
Right t -> ppTerm Unqualified 10 t
|
-- Left i -> "variable #" <> pp i <+> "is out of scope"
|
||||||
|
|
||||||
-- | Convert a value back to a term
|
-- | Convert a value back to a term
|
||||||
value2term :: GLocation -> [Ident] -> Value -> Either Int Term
|
value2term :: GLocation -> [Ident] -> Value -> Term
|
||||||
value2term = value2term' False
|
value2term = value2term' False
|
||||||
|
|
||||||
|
value2term' :: Bool -> p -> [Ident] -> Value -> Term
|
||||||
value2term' stop loc xs v0 =
|
value2term' stop loc xs v0 =
|
||||||
case v0 of
|
case v0 of
|
||||||
VApp pre vs -> liftM (foldl App (Q (cPredef,predefName pre))) (mapM v2t vs)
|
VApp pre vs -> applyMany (Q (cPredef,predefName pre)) vs
|
||||||
VCApp f vs -> liftM (foldl App (QC f)) (mapM v2t vs)
|
VCApp f vs -> applyMany (QC f) vs
|
||||||
VGen j vs -> liftM2 (foldl App) (var j) (mapM v2t vs)
|
VGen j vs -> applyMany (var j) vs
|
||||||
VMeta j env vs -> liftM (foldl App (Meta j)) (mapM v2t vs)
|
VMeta j env vs -> applyMany (Meta j) vs
|
||||||
VProd bt v x f -> liftM2 (Prod bt x) (v2t v) (v2t' x f)
|
VProd bt v x f -> Prod bt x (v2t v) (v2t' x f)
|
||||||
VAbs bt x f -> liftM (Abs bt x) (v2t' x f)
|
VAbs bt x f -> Abs bt x (v2t' x f)
|
||||||
VInt n -> return (EInt n)
|
VInt n -> EInt n
|
||||||
VFloat f -> return (EFloat f)
|
VFloat f -> EFloat f
|
||||||
VString s -> return (if null s then Empty else K s)
|
VString s -> if null s then Empty else K s
|
||||||
VSort s -> return (Sort s)
|
VSort s -> Sort s
|
||||||
VImplArg v -> liftM ImplArg (v2t v)
|
VImplArg v -> ImplArg (v2t v)
|
||||||
VTblType p res -> liftM2 Table (v2t p) (v2t res)
|
VTblType p res -> Table (v2t p) (v2t res)
|
||||||
VRecType rs -> liftM RecType (mapM (\(l,v) -> fmap ((,) l) (v2t v)) rs)
|
VRecType rs -> RecType [(l, v2t v) | (l,v) <- rs]
|
||||||
VRec as -> liftM R (mapM (\(l,v) -> v2t v >>= \t -> return (l,(Nothing,t))) as)
|
VRec as -> R [(l, (Nothing, v2t v)) | (l,v) <- as]
|
||||||
VV t _ vs -> liftM (V t) (mapM v2t vs)
|
VV t _ vs -> V t (map v2t vs)
|
||||||
VT wild v cs -> v2t v >>= \t -> liftM (T ((if wild then TWild else TTyped) t)) (mapM nfcase cs)
|
VT wild v cs -> T ((if wild then TWild else TTyped) (v2t v)) (map nfcase cs)
|
||||||
VFV vs -> liftM FV (mapM v2t vs)
|
VFV vs -> FV (map v2t vs)
|
||||||
VC v1 v2 -> liftM2 C (v2t v1) (v2t v2)
|
VC v1 v2 -> C (v2t v1) (v2t v2)
|
||||||
VS v1 v2 -> liftM2 S (v2t v1) (v2t v2)
|
VS v1 v2 -> S (v2t v1) (v2t v2)
|
||||||
VP v l -> v2t v >>= \t -> return (P t l)
|
VP v l -> P (v2t v) l
|
||||||
VPatt p -> return (EPatt p)
|
VPatt p -> EPatt p
|
||||||
VPattType v -> v2t v >>= return . EPattType
|
VPattType v -> EPattType $ v2t v
|
||||||
VAlts v vvs -> liftM2 Alts (v2t v) (mapM (\(x,y) -> liftM2 (,) (v2t x) (v2t y)) vvs)
|
VAlts v vvs -> Alts (v2t v) [(v2t x, v2t y) | (x,y) <- vvs]
|
||||||
VStrs vs -> liftM Strs (mapM v2t vs)
|
VStrs vs -> Strs (map v2t vs)
|
||||||
-- VGlue v1 v2 -> Glue (v2t v1) (v2t v2)
|
-- VGlue v1 v2 -> Glue (v2t v1) (v2t v2)
|
||||||
-- VExtR v1 v2 -> ExtR (v2t v1) (v2t v2)
|
-- VExtR v1 v2 -> ExtR (v2t v1) (v2t v2)
|
||||||
VError err -> return (Error err)
|
VError err -> Error err
|
||||||
|
|
||||||
where
|
where
|
||||||
|
applyMany f vs = foldl App f (map v2t vs)
|
||||||
v2t = v2txs xs
|
v2t = v2txs xs
|
||||||
v2txs = value2term' stop loc
|
v2txs = value2term' stop loc
|
||||||
v2t' x f = v2txs (x:xs) (bind f (gen xs))
|
v2t' x f = v2txs (x:xs) (bind f (gen xs))
|
||||||
|
|
||||||
var j
|
var j
|
||||||
| j<length xs = Right (Vr (reverse xs !! j))
|
| j<length xs = Vr (reverse xs !! j)
|
||||||
| otherwise = Left j
|
| otherwise = error ("variable #"++show j++" is out of scope")
|
||||||
|
|
||||||
|
|
||||||
pushs xs e = foldr push e xs
|
pushs xs e = foldr push e xs
|
||||||
push x (env,xs) = ((x,gen xs):env,x:xs)
|
push x (env,xs) = ((x,gen xs):env,x:xs)
|
||||||
gen xs = VGen (length xs) []
|
gen xs = VGen (length xs) []
|
||||||
|
|
||||||
nfcase (p,f) = liftM ((,) p) (v2txs xs' (bind f env'))
|
nfcase (p,f) = (,) p (v2txs xs' (bind f env'))
|
||||||
where (env',xs') = pushs (pattVars p) ([],xs)
|
where (env',xs') = pushs (pattVars p) ([],xs)
|
||||||
|
|
||||||
bind (Bind f) x = if stop
|
bind (Bind f) x = if stop
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ instance Predef Int where
|
|||||||
|
|
||||||
instance Predef Bool where
|
instance Predef Bool where
|
||||||
toValue = boolV
|
toValue = boolV
|
||||||
|
fromValue v = case v of
|
||||||
|
VCApp (mn,i) [] | mn == cPredef && i == cPTrue -> return True
|
||||||
|
VCApp (mn,i) [] | mn == cPredef && i == cPFalse -> return False
|
||||||
|
_ -> verror "Bool" v
|
||||||
|
|
||||||
instance Predef String where
|
instance Predef String where
|
||||||
toValue = string
|
toValue = string
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ computeLType gr g0 t = comp (reverse [(b,x, Vr x) | (b,x,_) <- g0] ++ g0) t
|
|||||||
lockRecType c t' ---- locking to be removed AR 20/6/2009
|
lockRecType c t' ---- locking to be removed AR 20/6/2009
|
||||||
|
|
||||||
_ | ty == typeTok -> return typeStr
|
_ | ty == typeTok -> return typeStr
|
||||||
_ | isPredefConstant ty -> return ty
|
|
||||||
|
|
||||||
_ -> composOp (comp g) ty
|
_ -> composOp (comp g) ty
|
||||||
|
|
||||||
|
|||||||
@@ -568,9 +568,9 @@ unifyVar ge scope i env vs ty2 = do -- Check whether i is bound
|
|||||||
Bound ty1 -> do v <- liftErr (eval ge env ty1)
|
Bound ty1 -> do v <- liftErr (eval ge env ty1)
|
||||||
unify ge scope (vapply (geLoc ge) v vs) ty2
|
unify ge scope (vapply (geLoc ge) v vs) ty2
|
||||||
Unbound scope' _ -> case value2term (geLoc ge) (scopeVars scope') ty2 of
|
Unbound scope' _ -> case value2term (geLoc ge) (scopeVars scope') ty2 of
|
||||||
Left i -> let (v,_) = reverse scope !! i
|
-- Left i -> let (v,_) = reverse scope !! i
|
||||||
in tcError ("Variable" <+> pp v <+> "has escaped")
|
-- in tcError ("Variable" <+> pp v <+> "has escaped")
|
||||||
Right ty2' -> do ms2 <- getMetaVars (geLoc ge) [(scope,ty2)]
|
ty2' -> do ms2 <- getMetaVars (geLoc ge) [(scope,ty2)]
|
||||||
if i `elem` ms2
|
if i `elem` ms2
|
||||||
then tcError ("Occurs check for" <+> ppMeta i <+> "in:" $$
|
then tcError ("Occurs check for" <+> ppMeta i <+> "in:" $$
|
||||||
nest 2 (ppTerm Unqualified 0 ty2'))
|
nest 2 (ppTerm Unqualified 0 ty2'))
|
||||||
@@ -765,9 +765,9 @@ zonkTerm (Meta i) = do
|
|||||||
zonkTerm t = composOp zonkTerm t
|
zonkTerm t = composOp zonkTerm t
|
||||||
|
|
||||||
tc_value2term loc xs v =
|
tc_value2term loc xs v =
|
||||||
case value2term loc xs v of
|
return $ value2term loc xs v
|
||||||
Left i -> tcError ("Variable #" <+> pp i <+> "has escaped")
|
-- Old value2term error message:
|
||||||
Right t -> return t
|
-- Left i -> tcError ("Variable #" <+> pp i <+> "has escaped")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
-- Thierry Coquand's type checking algorithm that creates a trace
|
-- Thierry Coquand's type checking algorithm that creates a trace
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
module GF.Compile.TypeCheck.TC (AExp(..),
|
module GF.Compile.TypeCheck.TC (
|
||||||
|
AExp(..),
|
||||||
Theory,
|
Theory,
|
||||||
checkExp,
|
checkExp,
|
||||||
inferExp,
|
inferExp,
|
||||||
@@ -321,4 +322,3 @@ mkAnnot :: (Val -> AExp) -> Err (Val,[(Val,Val)]) -> Err (AExp,Val,[(Val,Val)])
|
|||||||
mkAnnot a ti = do
|
mkAnnot a ti = do
|
||||||
(v,cs) <- ti
|
(v,cs) <- ti
|
||||||
return (a v, v, cs)
|
return (a v, v, cs)
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ buildAnyTree :: Fail.MonadFail m => ModuleName -> [(Ident,Info)] -> m (Map.Map I
|
|||||||
buildAnyTree m = go Map.empty
|
buildAnyTree m = go Map.empty
|
||||||
where
|
where
|
||||||
go map [] = return map
|
go map [] = return map
|
||||||
go map ((c,j):is) = do
|
go map ((c,j):is) =
|
||||||
case Map.lookup c map of
|
case Map.lookup c map of
|
||||||
Just i -> case unifyAnyInfo m i j of
|
Just i -> case unifyAnyInfo m i j of
|
||||||
Ok k -> go (Map.insert c k map) is
|
Ok k -> go (Map.insert c k map) is
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
-- pattern matching for both concrete and abstract syntax. AR -- 16\/6\/2003
|
-- pattern matching for both concrete and abstract syntax. AR -- 16\/6\/2003
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
module GF.Grammar.PatternMatch (matchPattern,
|
module GF.Grammar.PatternMatch (
|
||||||
|
matchPattern,
|
||||||
testOvershadow,
|
testOvershadow,
|
||||||
findMatch,
|
findMatch,
|
||||||
measurePatt
|
measurePatt
|
||||||
|
|||||||
@@ -362,4 +362,3 @@ getLet :: Term -> ([LocalDef], Term)
|
|||||||
getLet (Let l e) = let (ls,e') = getLet e
|
getLet (Let l e) = let (ls,e') = getLet e
|
||||||
in (l:ls,e')
|
in (l:ls,e')
|
||||||
getLet e = ([],e)
|
getLet e = ([],e)
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
-- (Description of the module)
|
-- (Description of the module)
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
module GF.Grammar.Values (-- ** Values used in TC type checking
|
module GF.Grammar.Values (
|
||||||
|
-- ** Values used in TC type checking
|
||||||
Val(..), Env,
|
Val(..), Env,
|
||||||
-- ** Annotated tree used in editing
|
-- ** Annotated tree used in editing
|
||||||
Binds, Constraints, MetaSubst,
|
Binds, Constraints, MetaSubst,
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ import GF.Server(server)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
import GF.Command.Messages(welcome)
|
import GF.Command.Messages(welcome)
|
||||||
import GF.Infra.UseIO (Output)
|
|
||||||
-- Provides an orphan instance of MonadFail for StateT in ghc versions < 8
|
-- Provides an orphan instance of MonadFail for StateT in ghc versions < 8
|
||||||
import Control.Monad.Trans.Instances ()
|
import Control.Monad.Trans.Instances ()
|
||||||
|
|
||||||
@@ -56,6 +55,7 @@ mainGFI opts files = do
|
|||||||
|
|
||||||
shell opts files = flip evalStateT (emptyGFEnv opts) $
|
shell opts files = flip evalStateT (emptyGFEnv opts) $
|
||||||
do mapStateT runSIO $ importInEnv opts files
|
do mapStateT runSIO $ importInEnv opts files
|
||||||
|
modify $ \ gfenv0 -> gfenv0 {history = [unwords ("i":files)]}
|
||||||
loop
|
loop
|
||||||
|
|
||||||
#ifdef SERVER_MODE
|
#ifdef SERVER_MODE
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ mainGFI opts files = do
|
|||||||
|
|
||||||
shell opts files = flip evalStateT (emptyGFEnv opts) $
|
shell opts files = flip evalStateT (emptyGFEnv opts) $
|
||||||
do mapStateT runSIO $ importInEnv opts files
|
do mapStateT runSIO $ importInEnv opts files
|
||||||
|
modify $ \ gfenv0 -> gfenv0 {history = [unwords ("i":files)]}
|
||||||
loop
|
loop
|
||||||
|
|
||||||
{-
|
{-
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import Data.Version
|
|||||||
import System.Directory
|
import System.Directory
|
||||||
import System.Environment (getArgs)
|
import System.Environment (getArgs)
|
||||||
import System.Exit
|
import System.Exit
|
||||||
import GF.System.Console (setConsoleEncoding)
|
-- import GF.System.Console (setConsoleEncoding)
|
||||||
|
|
||||||
-- | Run the GF main program, taking arguments from the command line.
|
-- | Run the GF main program, taking arguments from the command line.
|
||||||
-- (It calls 'setConsoleEncoding' and 'getOptions', then 'mainOpts'.)
|
-- (It calls 'setConsoleEncoding' and 'getOptions', then 'mainOpts'.)
|
||||||
@@ -28,6 +28,7 @@ main = do
|
|||||||
|
|
||||||
-- | Get and parse GF command line arguments. Fix relative paths.
|
-- | Get and parse GF command line arguments. Fix relative paths.
|
||||||
-- Calls 'getArgs' and 'parseOptions'.
|
-- Calls 'getArgs' and 'parseOptions'.
|
||||||
|
getOptions :: IO (Options, [FilePath])
|
||||||
getOptions = do
|
getOptions = do
|
||||||
args <- getArgs
|
args <- getArgs
|
||||||
case parseOptions args of
|
case parseOptions args of
|
||||||
|
|||||||
@@ -110,4 +110,3 @@ prepunctuate p (x:xs) = x : map (p <>) xs
|
|||||||
|
|
||||||
($++$) :: Doc -> Doc -> Doc
|
($++$) :: Doc -> Doc -> Doc
|
||||||
x $++$ y = x $$ emptyLine $$ y
|
x $++$ y = x $$ emptyLine $$ y
|
||||||
|
|
||||||
|
|||||||
@@ -125,4 +125,3 @@ prepunctuate p (x:xs) = x : map (p <>) xs
|
|||||||
|
|
||||||
($++$) :: Doc -> Doc -> Doc
|
($++$) :: Doc -> Doc -> Doc
|
||||||
x $++$ y = x $$ emptyLine $$ y
|
x $++$ y = x $$ emptyLine $$ y
|
||||||
|
|
||||||
|
|||||||
@@ -300,9 +300,7 @@ transAncientGreek = mkTransliteration "ancient Greek" allTrans allCodes where
|
|||||||
|
|
||||||
transAmharic :: Transliteration
|
transAmharic :: Transliteration
|
||||||
transAmharic = mkTransliteration "Amharic" allTrans allCodes where
|
transAmharic = mkTransliteration "Amharic" allTrans allCodes where
|
||||||
|
|
||||||
allTrans = words $
|
allTrans = words $
|
||||||
|
|
||||||
" h. h- h' h( h) h h? h* l. l- l' l( l) l l? l* "++
|
" h. h- h' h( h) h h? h* l. l- l' l( l) l l? l* "++
|
||||||
" H. H- H' H( H) H H? H* m. m- m' m( m) m m? m* "++
|
" H. H- H' H( H) H H? H* m. m- m' m( m) m m? m* "++
|
||||||
" s. s- s' s( s) s s? s* r. r- r' r( r) r r? r* "++
|
" s. s- s' s( s) s s? s* r. r- r' r( r) r r? r* "++
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ For Linux users
|
|||||||
|
|
||||||
You will need the packages: autoconf, automake, libtool, make
|
You will need the packages: autoconf, automake, libtool, make
|
||||||
|
|
||||||
|
- On Ubuntu: $ apt-get install autotools-dev
|
||||||
|
- On Fedora: $ dnf install autoconf automake libtool
|
||||||
|
|
||||||
The compilation steps are:
|
The compilation steps are:
|
||||||
|
|
||||||
$ autoreconf -i
|
$ autoreconf -i
|
||||||
@@ -28,7 +31,7 @@ For Mac OSX users
|
|||||||
The following is what I did to make it work on MacOSX 10.8:
|
The following is what I did to make it work on MacOSX 10.8:
|
||||||
|
|
||||||
- Install XCode and XCode command line tools
|
- Install XCode and XCode command line tools
|
||||||
- Install Homebrew: http://mxcl.github.com/homebrew/
|
- Install Homebrew: https://brew.sh
|
||||||
|
|
||||||
$ brew install automake autoconf libtool
|
$ brew install automake autoconf libtool
|
||||||
$ glibtoolize
|
$ glibtoolize
|
||||||
|
|||||||
3
src/runtime/c/install.sh
Executable file
3
src/runtime/c/install.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
bash setup.sh configure
|
||||||
|
bash setup.sh build
|
||||||
|
bash setup.sh install
|
||||||
@@ -140,7 +140,9 @@ unStr (Expr expr touch) =
|
|||||||
touch
|
touch
|
||||||
return (Just s)
|
return (Just s)
|
||||||
|
|
||||||
-- | Constructs an expression from an integer literal
|
-- | Constructs an expression from an integer literal.
|
||||||
|
-- Note that the C runtime does not support long integers, and you may run into overflow issues with large values.
|
||||||
|
-- See [here](https://github.com/GrammaticalFramework/gf-core/issues/109) for more details.
|
||||||
mkInt :: Int -> Expr
|
mkInt :: Int -> Expr
|
||||||
mkInt val =
|
mkInt val =
|
||||||
unsafePerformIO $ do
|
unsafePerformIO $ do
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
name: pgf2
|
name: pgf2
|
||||||
version: 1.3.0
|
version: 1.3.0
|
||||||
|
|
||||||
|
cabal-version: 1.22
|
||||||
|
build-type: Simple
|
||||||
|
license: LGPL-3
|
||||||
|
license-file: LICENSE
|
||||||
|
category: Natural Language Processing
|
||||||
synopsis: Bindings to the C version of the PGF runtime
|
synopsis: Bindings to the C version of the PGF runtime
|
||||||
description:
|
description:
|
||||||
GF, Grammatical Framework, is a programming language for multilingual grammar applications.
|
GF, Grammatical Framework, is a programming language for multilingual grammar applications.
|
||||||
GF grammars are compiled into Portable Grammar Format (PGF) which can be used with the PGF runtime, written in C.
|
GF grammars are compiled into Portable Grammar Format (PGF) which can be used with the PGF runtime, written in C.
|
||||||
This package provides Haskell bindings to that runtime.
|
This package provides Haskell bindings to that runtime.
|
||||||
homepage: https://www.grammaticalframework.org
|
homepage: https://www.grammaticalframework.org/
|
||||||
license: LGPL-3
|
bug-reports: https://github.com/GrammaticalFramework/gf-core/issues
|
||||||
license-file: LICENSE
|
|
||||||
author: Krasimir Angelov
|
author: Krasimir Angelov
|
||||||
category: Natural Language Processing
|
|
||||||
build-type: Simple
|
|
||||||
extra-source-files: CHANGELOG.md, README.md
|
extra-source-files: CHANGELOG.md, README.md
|
||||||
cabal-version: >=1.10
|
tested-with: GHC==7.10.3, GHC==8.0.2, GHC==8.10.4
|
||||||
|
|
||||||
library
|
library
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
@@ -23,9 +26,9 @@ library
|
|||||||
PGF2.Expr,
|
PGF2.Expr,
|
||||||
PGF2.Type
|
PGF2.Type
|
||||||
build-depends:
|
build-depends:
|
||||||
base >=4.3 && <5,
|
base >= 4.9.1 && < 4.15,
|
||||||
containers,
|
containers >= 0.5.7 && < 0.7,
|
||||||
pretty
|
pretty >= 1.1.3 && < 1.2
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
build-tools: hsc2hs
|
build-tools: hsc2hs
|
||||||
extra-libraries: pgf gu
|
extra-libraries: pgf gu
|
||||||
|
|||||||
3
src/runtime/haskell-bind/stack-ghc7.10.3.yaml
Normal file
3
src/runtime/haskell-bind/stack-ghc7.10.3.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
resolver: lts-6.35 # ghc 7.10.3
|
||||||
|
|
||||||
|
allow-newer: true
|
||||||
1
src/runtime/haskell-bind/stack-ghc8.0.2.yaml
Normal file
1
src/runtime/haskell-bind/stack-ghc8.0.2.yaml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
resolver: lts-9.21 # ghc 8.0.2
|
||||||
1
src/runtime/haskell-bind/stack-ghc8.10.4.yaml
Normal file
1
src/runtime/haskell-bind/stack-ghc8.10.4.yaml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
resolver: lts-18.0 # ghc 8.10.4
|
||||||
@@ -185,6 +185,7 @@ instance Binary Instr where
|
|||||||
put (PUSH_ACCUM (LFlt d)) = putWord8 78 >> put d
|
put (PUSH_ACCUM (LFlt d)) = putWord8 78 >> put d
|
||||||
put (POP_ACCUM ) = putWord8 80
|
put (POP_ACCUM ) = putWord8 80
|
||||||
put (ADD ) = putWord8 84
|
put (ADD ) = putWord8 84
|
||||||
|
get = fail "Missing implementation for ‘get’ in the instance declaration for ‘Binary Instr’"
|
||||||
|
|
||||||
instance Binary Type where
|
instance Binary Type where
|
||||||
put (DTyp hypos cat exps) = put (hypos,cat,exps)
|
put (DTyp hypos cat exps) = put (hypos,cat,exps)
|
||||||
|
|||||||
@@ -1,29 +1,32 @@
|
|||||||
name: pgf
|
name: pgf
|
||||||
version: 3.10.1-git
|
version: 3.11.0-git
|
||||||
|
|
||||||
cabal-version: >= 1.20
|
cabal-version: 1.22
|
||||||
build-type: Simple
|
build-type: Simple
|
||||||
license: OtherLicense
|
license: OtherLicense
|
||||||
category: Natural Language Processing
|
category: Natural Language Processing
|
||||||
synopsis: Grammatical Framework
|
synopsis: Grammatical Framework
|
||||||
description: A library for interpreting the Portable Grammar Format (PGF)
|
description: A library for interpreting the Portable Grammar Format (PGF)
|
||||||
homepage: http://www.grammaticalframework.org/
|
homepage: https://www.grammaticalframework.org/
|
||||||
bug-reports: https://github.com/GrammaticalFramework/gf-core/issues
|
bug-reports: https://github.com/GrammaticalFramework/gf-core/issues
|
||||||
tested-with: GHC==7.6.3, GHC==7.8.3, GHC==7.10.3, GHC==8.0.2, GHC==8.4.4
|
tested-with: GHC==7.10.3, GHC==8.0.2, GHC==8.10.4
|
||||||
|
|
||||||
library
|
library
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
build-depends:
|
build-depends:
|
||||||
array,
|
array >= 0.5.1 && < 0.6,
|
||||||
base >= 4.6 && <5,
|
base >= 4.9.1 && < 4.15,
|
||||||
bytestring,
|
bytestring >= 0.10.8 && < 0.11,
|
||||||
containers,
|
containers >= 0.5.7 && < 0.7,
|
||||||
-- exceptions,
|
ghc-prim >= 0.5.0 && < 0.7,
|
||||||
ghc-prim,
|
mtl >= 2.2.1 && < 2.3,
|
||||||
mtl,
|
pretty >= 1.1.3 && < 1.2,
|
||||||
pretty,
|
random >= 1.1 && < 1.3,
|
||||||
random,
|
utf8-string >= 1.0.1.1 && < 1.1
|
||||||
utf8-string
|
|
||||||
|
if impl(ghc<8.0)
|
||||||
|
build-depends:
|
||||||
|
fail >= 4.9.0 && < 4.10
|
||||||
|
|
||||||
other-modules:
|
other-modules:
|
||||||
-- not really part of GF but I have changed the original binary library
|
-- not really part of GF but I have changed the original binary library
|
||||||
|
|||||||
3
src/runtime/haskell/stack-ghc7.10.3.yaml
Normal file
3
src/runtime/haskell/stack-ghc7.10.3.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
resolver: lts-6.35 # ghc 7.10.3
|
||||||
|
|
||||||
|
allow-newer: true
|
||||||
1
src/runtime/haskell/stack-ghc8.0.2.yaml
Normal file
1
src/runtime/haskell/stack-ghc8.0.2.yaml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
resolver: lts-9.21 # ghc 8.0.2
|
||||||
1
src/runtime/haskell/stack-ghc8.10.4.yaml
Normal file
1
src/runtime/haskell/stack-ghc8.10.4.yaml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
resolver: lts-18.0 # ghc 8.10.4
|
||||||
14
stack-ghc8.10.4.yaml
Normal file
14
stack-ghc8.10.4.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
resolver: lts-18.0 # ghc 8.10.4
|
||||||
|
|
||||||
|
extra-deps:
|
||||||
|
- network-2.6.3.6
|
||||||
|
- httpd-shed-0.4.0.3
|
||||||
|
- cgi-3001.5.0.0@sha256:3d1193a328d5f627a021a0ef3927c1ae41dd341e32dba612fed52d0e3a6df056,2990
|
||||||
|
- json-0.10@sha256:d9fc6b07ce92b8894825a17d2cf14799856767eb30c8bf55962baa579207d799,3210
|
||||||
|
- multipart-0.2.0@sha256:b8770e3ff6089be4dd089a8250894b31287cca671f3d258190a505f9351fa8a9,1084
|
||||||
|
|
||||||
|
# flags:
|
||||||
|
# gf:
|
||||||
|
# c-runtime: true
|
||||||
|
# extra-lib-dirs:
|
||||||
|
# - /usr/local/lib
|
||||||
@@ -1,13 +1,15 @@
|
|||||||
# This default stack file is a copy of stack-ghc8.6.5.yaml
|
# This default stack file is a copy of stack-ghc8.10.4.yaml
|
||||||
# But committing a symlink can be problematic on Windows, so it's a real copy.
|
# But committing a symlink can be problematic on Windows, so it's a real copy.
|
||||||
# See: https://github.com/GrammaticalFramework/gf-core/pull/106
|
# See: https://github.com/GrammaticalFramework/gf-core/pull/106
|
||||||
|
|
||||||
resolver: lts-14.27 # ghc 8.6.5
|
resolver: lts-18.0 # ghc 8.10.4
|
||||||
|
|
||||||
extra-deps:
|
extra-deps:
|
||||||
- network-2.6.3.6
|
- network-2.6.3.6
|
||||||
- httpd-shed-0.4.0.3
|
- httpd-shed-0.4.0.3
|
||||||
- cgi-3001.5.0.0
|
- cgi-3001.5.0.0@sha256:3d1193a328d5f627a021a0ef3927c1ae41dd341e32dba612fed52d0e3a6df056,2990
|
||||||
|
- json-0.10@sha256:d9fc6b07ce92b8894825a17d2cf14799856767eb30c8bf55962baa579207d799,3210
|
||||||
|
- multipart-0.2.0@sha256:b8770e3ff6089be4dd089a8250894b31287cca671f3d258190a505f9351fa8a9,1084
|
||||||
|
|
||||||
# flags:
|
# flags:
|
||||||
# gf:
|
# gf:
|
||||||
|
|||||||
Reference in New Issue
Block a user