# B language keywords
# by Gyorgy Rotter
#
# For the proper syntax highlight the order of the keywords are
# important. This is why the related keywords are not listed in a block.
# To create semantic relationship between the keywords I used groups.
# Some keywords are in a group (the name of the group is
# indicated in a commented line above the keyword definition)
#
# With the one-liner for example we could replace
# the color of the keywords which are the members of the
# "Sequences" group from "yellow" to "red"...
#
#  echo Sequences yellow red | xargs -l bash -c 'sed -z "s/\(# $0\n[^\n]*\)$1/\1$2/g" b.syntax'
#         ^         ^     ^
#         |         |     |
#         |         |     -- new_color
#         |         -- actual_color
#         -- groupname
#
#
# Usable groups:
#   Relations, Sequences, Logical, Arithmetic, Sets, Substitutions
#
# Usable colors:
#   described in the Syntax file
#

context default
    keyword whole ABSTRACT_CONSTANTS yellow
    keyword whole ABSTRACT_VARIABLES yellow
    keyword whole CONCRETE_CONSTANTS yellow
    keyword whole CONCRETE_VARIABLES yellow
    keyword whole LOCAL_OPERATIONS yellow
    keyword whole IMPLEMENTATION yellow
    keyword whole INITIALISATION yellow
    keyword whole CONSTRAINTS yellow
    keyword whole DEFINITIONS yellow
    keyword whole ASSERTIONS yellow
    keyword whole OPERATIONS yellow
    keyword whole PROPERTIES yellow
    keyword whole REFINEMENT yellow
    keyword whole CONSTANTS yellow
    keyword whole INVARIANT yellow
    keyword whole sequences yellow
    keyword whole VARIABLES yellow
    keyword whole Cardinal yellow

    # Relations
    keyword whole closure1 white

    keyword whole INCLUDES yellow

    # Arithmetic
    keyword whole NATURAL1 yellow

    keyword whole PROMOTES yellow
    keyword whole Boolean yellow
    keyword whole EXTENDS yellow
    keyword whole IMPORTS yellow

    # Arithmetic
    keyword whole INTEGER yellow

    keyword whole iterate yellow
    keyword whole MACHINE yellow

    # Arithmetic
    keyword whole NATURAL yellow

    keyword whole postfix yellow
    keyword whole REFINES yellow
    keyword whole subtree yellow
    keyword whole VARIANT yellow
    keyword whole ASSERT yellow
    keyword whole CHOICE yellow

    # Relations
    keyword whole closure white

    keyword whole EITHER yellow
    keyword whole father yellow
    keyword whole MAXINT yellow
    keyword whole MININT yellow
    keyword whole mirror yellow
    keyword whole modulo yellow
    keyword whole prefix yellow
    keyword whole SELECT yellow
    keyword whole STRING yellow
    keyword whole struct yellow
    keyword whole VALUES yellow
    keyword whole arity yellow
    keyword whole BEGIN yellow
    keyword whole btree yellow
    keyword whole const yellow
    keyword whole ELSIF yellow
    keyword whole FALSE yellow
    keyword whole first yellow
    keyword whole front yellow
    keyword whole infix yellow

    # Sets
    keyword whole INTER yellow

    keyword whole inter yellow
    keyword whole iseq1 yellow
    keyword whole right yellow

    # Arithmetic
    keyword whole SIGMA yellow

    keyword whole sizet yellow

    # Sets
    keyword whole UNION yellow

    keyword whole union yellow
    keyword whole WHERE yellow
    keyword whole WHILE yellow
    keyword whole bool yellow
    keyword whole BOOL yellow
    keyword whole card yellow
    keyword whole CASE yellow
    keyword whole conc yellow
    keyword whole ELSE yellow

    # Sets
    keyword whole FIN1 yellow

    keyword whole iseq yellow
    keyword whole last yellow
    keyword whole left yellow
    keyword whole NAT1 yellow

    # Sets
    keyword whole POW1 yellow

    keyword whole perm yellow
    keyword whole pred yellow
    keyword whole prj1 yellow
    keyword whole prj2 yellow
    keyword whole rank yellow
    keyword whole SEES yellow
    keyword whole seq1 yellow
    keyword whole SETS yellow
    keyword whole size yellow
    keyword whole skip yellow
    keyword whole sons yellow
    keyword whole succ yellow
    keyword whole tail yellow
    keyword whole THEN yellow
    keyword whole tree yellow
    keyword whole TRUE yellow
    keyword whole USES yellow
    keyword whole WHEN yellow
    keyword whole ANY yellow
    keyword whole bin yellow
    keyword whole dom yellow
    keyword whole END yellow

    # Sets
    keyword whole FIN yellow

    keyword whole fnc yellow
    keyword whole INT yellow
    keyword whole LET yellow
    keyword whole max yellow
    keyword whole min yellow
    keyword whole mod yellow
    keyword whole NAT yellow

    # Logical
    keyword whole not cyan

    # Sets
    keyword whole POW yellow

    keyword whole PRE yellow
    keyword whole ran yellow
    keyword whole rec yellow
    keyword whole rel yellow
    keyword whole rev yellow
    keyword whole seq yellow
    keyword whole Set yellow
    keyword whole son yellow
    keyword whole top yellow
    keyword whole VAR yellow
    keyword whole BE yellow
    keyword whole DO yellow
    keyword whole id yellow
    keyword whole IF yellow
    keyword whole IN yellow
    keyword whole OF yellow
    keyword whole OR yellow

    # Logical
    keyword whole or cyan

    # Arithmetic
    keyword whole PI yellow

# prevents - keyword from interfering with comment
    keyword /\* green
    keyword \*/ green
    keyword // green


    keyword <-- yellow
    keyword := yellow


    # Relations
    keyword \+->> white

    # Relations
    keyword -->> white

    # Sets
    keyword /<<: yellow

    # Sequences
    keyword /|\\ magenta

    # Relations
    keyword >->> white

    # Relations
    keyword >\+> white

    # Arithmetic
    keyword \*\* yellow

    # Relations
    keyword \+-> white

    # Sequences
    keyword \\|/ magenta

    # Relations
    keyword --> white

    # Sets
    keyword /<: yellow

    # Sets
    keyword /\\ yellow

    # Relations
    keyword <-> white

    # Sets
    keyword <<: yellow

    # Relations
    keyword <<| white

    # Logical
    keyword <=> cyan

    # Relations
    keyword <\+ white

    # Relations
    keyword >-> white

    # Sets
    keyword \\/ yellow

    # Relations
    keyword |-> white

    # Relations
    keyword |>> white

    keyword != yellow

    # Sequences
    keyword -> magenta

    # Sets
    keyword /: yellow

    # Logical
    keyword /= cyan

    # Substitutions
    keyword :: yellow

    # Sequences
    keyword <- magenta

    # Sets
    keyword <: yellow

    # Arithmetic
    keyword <= yellow

    # Relations
    keyword <| white

    keyword == yellow

    # Logical
    keyword => cyan

    # Relations
    keyword >< white

    # Arithmetic
    keyword >= yellow

    # Arithmetic
    keyword \* yellow

    # Arithmetic
    keyword \+ yellow

    # Sets
    keyword {} yellow

    # Relations
    keyword |> white

    # Logical
    keyword ! cyan

    # Logical
    keyword # cyan

    # Relations
    keyword % white

    # Logical
    keyword & cyan

    keyword ( yellow
    keyword ) yellow
    keyword , yellow

    # Arithmetic
    keyword - yellow

    # Arithmetic
    keyword / yellow

    # Sets
    keyword : yellow

    keyword ; yellow

    # Arithmetic
    keyword < yellow

    # Logical
    keyword = cyan

    # Arithmetic
    keyword > yellow

    keyword ? yellow
    keyword [ yellow
    keyword ] yellow

    # Sequences
    keyword ^ magenta

    keyword { yellow
    keyword } yellow

    keyword | yellow

    # Relations
    keyword ~ white


context exclusive /\* \*/ green
    spellcheck

context exclusive // \n green
    spellcheck

context " "    brightgreen
