Next: , Previous: , Up: Source Code with tree-sitter   [Contents][Index]


2.1.3 Per-language Modules

Each language has its own module that can be used with tree-sitter. All of the languages that are currently supported can be found here: https://github.com/tree-sitter.

For convience:

To set-up a language, the following script can be used from the base directory of the language module’s directory:

    #!/bin/bash
    language=$1

    [ $# -eq 0 ] && { echo "Usage: $0 language_name"; exit 1; }

    cd src/

    if test -f "scanner.cc"; then
        clang++ -fPIC scanner.cc -c -lstdc++
        clang -std=c99 -fPIC parser.c -c
        clang++ -shared scanner.o parser.o -o /usr/lib/tree-sitter-$(echo ${language}|sed 's|/|-|').so
    elif test -f "scanner.c"; then
        clang -std=c99 -fPIC scanner.c -c
        clang -std=c99 -fPIC parser.c -c
        clang -shared scanner.o parser.o -o /usr/lib/tree-sitter-$(echo ${language}|sed 's|/|-|').so
    else
        clang -std=c99 -fPIC parser.c -c
        clang -shared parser.o -o /usr/lib/tree-sitter-$(echo ${language}|sed 's|/|-|').so
    fi

    sudo mkdir -p /usr/share/tree-sitter/${language}/
    sudo cp grammar.json node-types.json /usr/share/tree-sitter/${language}

If everything is desired, the following can be used:

    #!/bin/bash
    for language in agda bash c c-sharp cpp css go html java javascript jsdoc json julia ocaml/ocaml ocaml/interface php python ql regex ruby rust scala typescript/tsx typescript/typescript;do
        [ -d tree-sitter-${language%/*} ] || git clone --depth=1 https://github.com/tree-sitter/tree-sitter-${language%/*}
        cd tree-sitter-${language}/src
        if test -f "scanner.cc"; then
            clang++ -fPIC scanner.cc -c -lstdc++
            clang -std=c99 -fPIC parser.c -c
            clang++ -shared scanner.o parser.o -o /usr/lib/tree-sitter-$(echo ${language}|sed 's|/|-|').so
        elif test -f "scanner.c"; then
            clang -std=c99 -fPIC scanner.c -c
            clang -std=c99 -fPIC parser.c -c
            clang -shared scanner.o parser.o -o /usr/lib/tree-sitter-$(echo ${language}|sed 's|/|-|').so
        else
            clang -std=c99 -fPIC parser.c -c
            clang -shared parser.o -o /usr/lib/tree-sitter-$(echo ${language}|sed 's|/|-|').so
        fi
        mkdir -p /usr/share/tree-sitter/${language}/
        cp grammar.json node-types.json /usr/share/tree-sitter/${language}
        cd -
    done

On Arch Linux the tree-sitter-languages-git aur package may be used to install tree-sitter support for many languages.

On MacOS the following shell script may be used to achieve similar results:

    #!/bin/bash

    declare -a LANGUAGES
    LANGUAGES=agda bash c c-sharp cpp css go html java javascript jsdoc json julia ocaml/ocaml ocaml/interface php python ql regex ruby rust scala typescript/tsx typescript/typescript

    clone() {
      for language in ${LANGUAGES};do
        LANG="$(echo ${language}|sed 's|/|-|')"
        git clone https://github.com/tree-sitter/tree-sitter-${LANG} src/tree-sitter-${LANG}
      done
    }

    package() {
      for language in ${LANGUAGES};do
        echo $language
        LANG="$(echo ${language}|sed 's|/|-|')"
        BASE="tree-sitter-${LANG}"
        cd src/tree-sitter-${language}/src
        if test -f "scanner.cc"; then
            c++ -fPIC scanner.cc -c -lstdc++
            cc -std=c99 -fPIC parser.c -c
            ar rcs ${BASE}.a scanner.o parser.o
            c++ -dynamiclib -Wl,-install_name,/usr/local/lib/${BASE}.0.dylib scanner.o parser.o -o ${BASE}.0.0.dylib
            ln -sf ${BASE}.0.0.dylib ${BASE}.dylib
            ln -sf ${BASE}.0.0.dylib ${BASE}.0.dylib
            sudo install -d "/usr/local/lib/tree-sitter/$LANG"
            sudo install -m755 ${BASE}.a "/usr/local/lib/tree-sitter/${BASE}".a
            sudo install -m755 ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.0.0.dylib
            ln -sf ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.0.dylib
            ln -sf ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.dylib
        elif test -f "scanner.c"; then
            cc -std=c99 -fPIC scanner.c -c
            cc -std=c99 -fPIC parser.c -c
            ar rcs ${BASE}.a scanner.o parser.o
            c++ -dynamiclib -Wl,-install_name,/usr/local/lib/${BASE}.0.dylib scanner.o parser.o -o ${BASE}.0.0.dylib
            ln -sf ${BASE}.0.0.dylib ${BASE}.dylib
            ln -sf ${BASE}.0.0.dylib ${BASE}.0.dylib
            sudo install -d "/usr/local/lib/tree-sitter/$LANG"
            sudo install -m755 ${BASE}.a "/usr/local/lib/tree-sitter/${BASE}".a
            sudo install -m755 ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.0.0.dylib
            ln -sf ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.0.dylib
            ln -sf ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.dylib
        else
            cc -std=c99 -fPIC parser.c -c
            ar rcs ${BASE}.a parser.o
            c++ -dynamiclib -Wl,-install_name,/usr/local/lib/${BASE}.0.dylib parser.o -o ${BASE}.0.0.dylib
            ln -sf ${BASE}.0.0.dylib ${BASE}.dylib
            ln -sf ${BASE}.0.0.dylib ${BASE}.0.dylib
            sudo install -d "/usr/local/lib/tree-sitter/$LANG"
            sudo install -m755 ${BASE}.a "/usr/local/lib/tree-sitter/${BASE}".a
            sudo install -m755 ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.0.0.dylib
            ln -sf ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.0.dylib
            ln -sf ${BASE}.0.0.dylib '/usr/local/lib'/${BASE}.dylib
        fi
        sudo install -d /usr/local/share/tree-sitter/${language}/
        sudo install -m644 grammar.json node-types.json /usr/local/share/tree-sitter/${language}/
        cd - >/dev/null
      done

    }

    mkdir -p src/
    clone
    package

Next: , Previous: , Up: Source Code with tree-sitter   [Contents][Index]