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

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

lexer :: Lexer
lexer = Lexer
    { lName = "Io"
    , lAliases = ["io"]
    , lExtensions = [".io"]
    , lMimetypes = ["text/x-iosrc"]
    , lStart = root'
    , lFlags = [multiline]
    }

nestedcomment' :: TokenMatcher
nestedcomment' =
    [ tok "[^+/]+" (Arbitrary "Comment" :. Arbitrary "Multiline")
    , tokNext "/\\+" (Arbitrary "Comment" :. Arbitrary "Multiline") Push
    , tokNext "\\+/" (Arbitrary "Comment" :. Arbitrary "Multiline") Pop
    , tok "[+/]" (Arbitrary "Comment" :. Arbitrary "Multiline")
    ]

root' :: TokenMatcher
root' =
    [ tok "\\n" (Arbitrary "Text")
    , tok "\\s+" (Arbitrary "Text")
    , tok "//(.*?)\\n" (Arbitrary "Comment" :. Arbitrary "Single")
    , tok "#(.*?)\\n" (Arbitrary "Comment" :. Arbitrary "Single")
    , tok "/(\\\\\\n)?[*](.|\\n)*?[*](\\\\\\n)?/" (Arbitrary "Comment" :. Arbitrary "Multiline")
    , tokNext "/\\+" (Arbitrary "Comment" :. Arbitrary "Multiline") (GoTo nestedcomment')
    , tok "\"(\\\\\\\\|\\\\\"|[^\"])*\"" (Arbitrary "Literal" :. Arbitrary "String")
    , tok "::=|:=|=|\\(|\\)|;|,|\\*|-|\\+|>|<|@|!|/|\\||\\^|\\.|%|&|\\[|\\]|\\{|\\}" (Arbitrary "Operator")
    , tok "(clone|do|doFile|doString|method|for|if|else|elseif|then)\\b" (Arbitrary "Keyword")
    , tok "(nil|false|true)\\b" (Arbitrary "Name" :. Arbitrary "Constant")
    , tok "(Object|list|List|Map|args|Sequence|Coroutine|File)\8" (Arbitrary "Name" :. Arbitrary "Builtin")
    , tok "[a-zA-Z_][a-zA-Z0-9_]*" (Arbitrary "Name")
    , tok "(\\d+\\.?\\d*|\\d*\\.\\d+)([eE][+-]?[0-9]+)?" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Float")
    , tok "\\d+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Integer")
    ]