module Text.Highlighter.Lexers.Brainfuck (lexer) where

import Text.Regex.PCRE.Light
import Text.Highlighter.Types

lexer :: Lexer
lexer = Lexer
    { lName = "\66\114\97\105\110\102\117\99\107"
    , lAliases = ["\98\114\97\105\110\102\117\99\107", "\98\102"]
    , lExtensions = ["\46\98\102", "\46\98"]
    , lMimetypes = ["\97\112\112\108\105\99\97\116\105\111\110\47\120\45\98\114\97\105\110\102\117\99\107"]
    , lStart = root'
    , lFlags = [multiline]
    }

root' :: TokenMatcher
root' =
    [ tokNext "\92\91" (Arbitrary "\75\101\121\119\111\114\100") (GoTo loop')
    , tok "\92\93" (Arbitrary "\69\114\114\111\114")
    , anyOf common'
    ]

common' :: TokenMatcher
common' =
    [ tok "\91\46\44\93\43" (Arbitrary "\78\97\109\101" :. Arbitrary "\84\97\103")
    , tok "\91\43\45\93\43" (Arbitrary "\78\97\109\101" :. Arbitrary "\66\117\105\108\116\105\110")
    , tok "\91\60\62\93\43" (Arbitrary "\78\97\109\101" :. Arbitrary "\86\97\114\105\97\98\108\101")
    , tok "\91\94\46\44\43\92\45\60\62\92\91\92\93\93\43" (Arbitrary "\67\111\109\109\101\110\116")
    ]

loop' :: TokenMatcher
loop' =
    [ tokNext "\92\91" (Arbitrary "\75\101\121\119\111\114\100") Push
    , tokNext "\92\93" (Arbitrary "\75\101\121\119\111\114\100") Pop
    , anyOf common'
    ]