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

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

lexer :: Lexer
lexer = Lexer
    { lName = "\77\111\100\117\108\97\45\50"
    , lAliases = ["\109\111\100\117\108\97\50", "\109\50"]
    , lExtensions = ["\46\100\101\102", "\46\109\111\100"]
    , lMimetypes = ["\116\101\120\116\47\120\45\109\111\100\117\108\97\50"]
    , lStart = root'
    , lFlags = [multiline, dotall]
    }

punctuation' :: TokenMatcher
punctuation' =
    [ tok "\91\92\40\92\41\92\91\92\93\123\125\44\46\58\59\124\93" (Arbitrary "\80\117\110\99\116\117\97\116\105\111\110")
    ]

pragmas' :: TokenMatcher
pragmas' =
    [ tok "\92\40\92\42\92\36\40\46\42\63\41\92\42\92\41" (Arbitrary "\67\111\109\109\101\110\116" :. Arbitrary "\80\114\101\112\114\111\99")
    , tok "\60\92\42\40\46\42\63\41\92\42\62" (Arbitrary "\67\111\109\109\101\110\116" :. Arbitrary "\80\114\101\112\114\111\99")
    ]

whitespace' :: TokenMatcher
whitespace' =
    [ tok "\92\110\43" (Arbitrary "\84\101\120\116")
    , tok "\92\115\43" (Arbitrary "\84\101\120\116")
    ]

numliterals' :: TokenMatcher
numliterals' =
    [ tok "\91\48\49\93\43\66" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\66\105\110\97\114\121")
    , tok "\91\48\45\55\93\43\66" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\79\99\116")
    , tok "\91\48\45\55\93\43\67" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\79\99\116")
    , tok "\91\48\45\57\65\45\70\93\43\67" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\72\101\120")
    , tok "\91\48\45\57\65\45\70\93\43\72" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\72\101\120")
    , tok "\91\48\45\57\93\43\92\46\91\48\45\57\93\43\69\91\43\45\93\91\48\45\57\93\43" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\70\108\111\97\116")
    , tok "\91\48\45\57\93\43\92\46\91\48\45\57\93\43" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\70\108\111\97\116")
    , tok "\91\48\45\57\93\43" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114" :. Arbitrary "\73\110\116\101\103\101\114")
    ]

operators' :: TokenMatcher
operators' =
    [ tok "\91\42\47\43\61\35\126\38\60\62\92\94\45\93" (Arbitrary "\79\112\101\114\97\116\111\114")
    , tok "\58\61" (Arbitrary "\79\112\101\114\97\116\111\114")
    , tok "\64" (Arbitrary "\79\112\101\114\97\116\111\114")
    , tok "\92\46\92\46" (Arbitrary "\79\112\101\114\97\116\111\114")
    , tok "\96" (Arbitrary "\79\112\101\114\97\116\111\114")
    , tok "\58\58" (Arbitrary "\79\112\101\114\97\116\111\114")
    ]

identifiers' :: TokenMatcher
identifiers' =
    [ tok "\40\91\97\45\122\65\45\90\95\92\36\93\91\97\45\122\65\45\90\48\45\57\95\92\36\93\42\41" (Arbitrary "\78\97\109\101")
    ]

root' :: TokenMatcher
root' =
    [ anyOf whitespace'
    , anyOf comments'
    , anyOf pragmas'
    , anyOf identifiers'
    , anyOf numliterals'
    , anyOf strings'
    , anyOf operators'
    , anyOf punctuation'
    ]

strings' :: TokenMatcher
strings' =
    [ tok "\39\40\92\92\92\92\124\92\92\39\124\91\94\39\93\41\42\39" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103")
    , tok "\34\40\92\92\92\92\124\92\92\34\124\91\94\34\93\41\42\34" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103")
    ]

comments' :: TokenMatcher
comments' =
    [ tok "\47\47\46\42\63\92\110" (Arbitrary "\67\111\109\109\101\110\116" :. Arbitrary "\83\105\110\103\108\101")
    , tok "\47\92\42\40\46\42\63\41\92\42\47" (Arbitrary "\67\111\109\109\101\110\116" :. Arbitrary "\77\117\108\116\105\108\105\110\101")
    , tok "\92\40\92\42\40\91\94\92\36\93\46\42\63\41\92\42\92\41" (Arbitrary "\67\111\109\109\101\110\116" :. Arbitrary "\77\117\108\116\105\108\105\110\101")
    ]