# Author : Sergei Trofimovich <slyfox@inbox.ru>
# Language : haskell
#
# 'Syntax rules for the C and the C++ programming languages' is taken as base
# (haskell compilers support CPP macros)
#
# haskell keywords and reserved symbols are grabbed from ghc-6.10.1/compiler/parser/Lexer.hs
context default
# haskell keywords
# reserved keywords:
# unused symbols
keyword whole _\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\] color90
keyword whole as color19
keyword whole case color19
keyword whole class color19
keyword whole data color19
keyword whole default color19
keyword whole deriving color19
keyword whole do color19
keyword whole else color19
keyword whole hiding color19
keyword whole if color19
keyword whole import color19
keyword whole in color19
keyword whole infix color19
keyword whole infixl color19
keyword whole infixr color19
keyword whole instance color19
keyword whole let color19
keyword whole module color19
keyword whole newtype color19
keyword whole of color19
keyword whole qualified color19
keyword whole then color19
keyword whole type color19
keyword whole where color19
# extension keywords
keyword whole forall color19
keyword whole mdo color19
keyword whole family color19
keyword whole group color19
keyword whole by color19
keyword whole using color19
# ffi
keyword whole foreign color19
keyword whole export color19
keyword whole label color19
keyword whole dynamic color19
keyword whole safe color19
keyword whole threadsafe color19
keyword whole unsafe color19
keyword whole stdcall color19
keyword whole ccall color19
keyword whole dotnet color19
keyword whole rec color19
keyword whole proc color19
# other
keyword . color243
# keyword whole .. color243
# unboxed (started from upcase)
keyword whole \{ABCDEFGHIJKLMNOPQRSTUVWXYZ\}\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\]# color243
# types/modules
keyword whole \{ABCDEFGHIJKLMNOPQRSTUVWXYZ\}\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\] color243
# C keywords (TODO: remove unused in haskell source)
keyword whole auto color19
keyword whole break color19
keyword whole case color19
keyword whole char color19
keyword whole const color19
keyword whole continue color19
keyword whole do color19
keyword whole double color19
keyword whole else color19
keyword whole enum color19
keyword whole extern color19
keyword whole float color19
keyword whole for color19
keyword whole goto color19
keyword whole if color19
keyword whole int color19
keyword whole long color19
keyword whole register color19
keyword whole return color19
keyword whole short color19
keyword whole signed color19
keyword whole sizeof color19
keyword whole static color19
keyword whole struct color19
keyword whole switch color19
keyword whole typedef color19
keyword whole union color19
keyword whole unsigned color19
keyword whole void color19
keyword whole volatile color19
keyword whole while color19
keyword whole asm color19
keyword whole inline color19
keyword whole wchar_t color19
keyword whole ... color19
keyword whole linestart \{\s\t\}\[\s\t\]#*\n color90
keyword whole \[\s\t\]default color19
keyword whole linestart \[\s\t\]\{ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\}\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\]: color26
#digits
keyword whole 0\{xX\}\{0123456789abcdefABCDEF\}\[0123456789abcdefABCDEF\] color88
keyword whole \{0123456789\}\[0123456789\] color88
keyword whole \[0123456789\]\.\{0123456789\}\[0123456789\] color88
keyword whole \{0123456789\}\[0123456789\]\.\[0123456789\] color88
keyword whole \{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] color88
keyword whole \{0123456789\}\[0123456789\]\{eE\}\{\-\+\}\{0123456789\}\[0123456789\] color88
keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] color88
keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{\-\+\}\{0123456789\}\[0123456789\] color88
#comments
keyword {- color30
keyword -} color30
keyword -- color30
keyword \*/ color30
keyword /\* color30
keyword // color30
keyword '\\\{"abtnvfr\}' color88
#haskell standalone char escapes
keyword '\\NUL' color88
keyword '\\SOH' color88
keyword '\\STX' color88
keyword '\\ETX' color88
keyword '\\EOT' color88
keyword '\\ENQ' color88
keyword '\\ACK' color88
keyword '\\BEL' color88
keyword '\\BS' color88
keyword '\\HT' color88
keyword '\\LF' color88
keyword '\\VT' color88
keyword '\\FF' color88
keyword '\\CR' color88
keyword '\\SO' color88
keyword '\\SI' color88
keyword '\\DLE' color88
keyword '\\DC1' color88
keyword '\\DC2' color88
keyword '\\DC3' color88
keyword '\\DC4' color88
keyword '\\NAK' color88
keyword '\\SYN' color88
keyword '\\ETB' color88
keyword '\\CAN' color88
keyword '\\EM' color88
keyword '\\SUB' color88
keyword '\\ESC' color88
keyword '\\FS' color88
keyword '\\GS' color88
keyword '\\RS' color88
keyword '\\US' color88
keyword '\\SP' color88
keyword '\\DEL' color88
keyword '\\\{0123\}\{01234567\}\{01234567\}' color88
keyword '\\'' color88
keyword '\\\\' color88
keyword '\\0' color88
keyword '\{\s!"#$%&()\*\+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\}' color88
# some punctuation characters
keyword whole $ color19
keyword whole ! color243
keyword whole && color243
keyword whole \* color19
keyword whole \+ color19
keyword whole / color19
keyword whole < color19
keyword whole > color19
keyword whole ^ color243
keyword whole || color243
keyword whole | color243
keyword ~ color243
keyword , color17
keyword - color19
keyword : color17
keyword ; color19
keyword = color19
keyword { color243
keyword } color243
keyword [ color17
keyword ] color17
keyword ( color17
keyword ) color17
# comments
context exclusive /\* \*/ color30
spellcheck
context exclusive {-# #-} color28
spellcheck
context exclusive {- -} color30
spellcheck
context exclusive // \n color30
spellcheck
context exclusive \-\- \n color30
spellcheck
# C macros
context linestart # \n color196
keyword \\\n color19
keyword /\**\*/ color30
keyword //*\n color30
keyword "+" color160
keyword <+> color160
context " " color28
spellcheck
#haskell escapes in ""s
keyword \\NUL color88
keyword \\SOH color88
keyword \\STX color88
keyword \\ETX color88
keyword \\EOT color88
keyword \\ENQ color88
keyword \\ACK color88
keyword \\BEL color88
keyword \\BS color88
keyword \\HT color88
keyword \\LF color88
keyword \\VT color88
keyword \\FF color88
keyword \\CR color88
keyword \\SO color88
keyword \\SI color88
keyword \\DLE color88
keyword \\DC1 color88
keyword \\DC2 color88
keyword \\DC3 color88
keyword \\DC4 color88
keyword \\NAK color88
keyword \\SYN color88
keyword \\ETB color88
keyword \\CAN color88
keyword \\EM color88
keyword \\SUB color88
keyword \\ESC color88
keyword \\FS color88
keyword \\GS color88
keyword \\RS color88
keyword \\US color88
keyword \\SP color88
keyword \\DEL color88
keyword \\" color88
keyword %% color88
keyword %\[#0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[L\]\{eEfgGoxX\} color88
keyword %\[0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[hl\]\{diuxX\} color88
keyword %\[hl\]n color88
keyword %\[-\]\[0123456789\*\]\[.\]\[0123456789\*\]s color88
keyword %[*] color88
keyword %c color88
keyword %p color88
keyword \\\{0123\}\{01234567\}\{01234567\} color88
keyword \\\\ color88
keyword \\' color88
keyword \\\{abtnvfr\} color88
# infix binop
context exclusive ` ` color243