package h import ( . "github.com/alecthomas/chroma" // nolint "github.com/alecthomas/chroma/lexers/internal" ) // Haskell lexer. var Haskell = internal.Register(MustNewLazyLexer( &Config{ Name: "Haskell", Aliases: []string{"haskell", "hs"}, Filenames: []string{"*.hs"}, MimeTypes: []string{"text/x-haskell"}, }, haskellRules, )) func haskellRules() Rules { return Rules{ "root": { {`\s+`, Text, nil}, {`--(?![!#$%&*+./<=>?@^|_~:\\]).*?$`, CommentSingle, nil}, {`\{-`, CommentMultiline, Push("comment")}, {`\bimport\b`, KeywordReserved, Push("import")}, {`\bmodule\b`, KeywordReserved, Push("module")}, {`\berror\b`, NameException, nil}, {`\b(case|class|data|default|deriving|do|else|family|if|in|infix[lr]?|instance|let|newtype|of|then|type|where|_)(?!\')\b`, KeywordReserved, nil}, {`'[^\\]'`, LiteralStringChar, nil}, {`^[_\p{Ll}][\w\']*`, NameFunction, nil}, {`'?[_\p{Ll}][\w']*`, Name, nil}, {`('')?[\p{Lu}][\w\']*`, KeywordType, nil}, {`(')[\p{Lu}][\w\']*`, KeywordType, nil}, {`(')\[[^\]]*\]`, KeywordType, nil}, {`(')\([^)]*\)`, KeywordType, nil}, {`\\(?![:!#$%&*+.\\/<=>?@^|~-]+)`, NameFunction, nil}, {`(<-|::|->|=>|=)(?![:!#$%&*+.\\/<=>?@^|~-]+)`, OperatorWord, nil}, {`:[:!#$%&*+.\\/<=>?@^|~-]*`, KeywordType, nil}, {`[:!#$%&*+.\\/<=>?@^|~-]+`, Operator, nil}, {`\d+[eE][+-]?\d+`, LiteralNumberFloat, nil}, {`\d+\.\d+([eE][+-]?\d+)?`, LiteralNumberFloat, nil}, {`0[oO][0-7]+`, LiteralNumberOct, nil}, {`0[xX][\da-fA-F]+`, LiteralNumberHex, nil}, {`\d+`, LiteralNumberInteger, nil}, {`'`, LiteralStringChar, Push("character")}, {`"`, LiteralString, Push("string")}, {`\[\]`, KeywordType, nil}, {`\(\)`, NameBuiltin, nil}, {"[][(),;`{}]", Punctuation, nil}, }, "import": { {`\s+`, Text, nil}, {`"`, LiteralString, Push("string")}, {`\)`, Punctuation, Pop(1)}, {`qualified\b`, Keyword, nil}, {`([\p{Lu}][\w.]*)(\s+)(as)(\s+)([\p{Lu}][\w.]*)`, ByGroups(NameNamespace, Text, Keyword, Text, Name), Pop(1)}, {`([\p{Lu}][\w.]*)(\s+)(hiding)(\s+)(\()`, ByGroups(NameNamespace, Text, Keyword, Text, Punctuation), Push("funclist")}, {`([\p{Lu}][\w.]*)(\s+)(\()`, ByGroups(NameNamespace, Text, Punctuation), Push("funclist")}, {`[\w.]+`, NameNamespace, Pop(1)}, }, "module": { {`\s+`, Text, nil}, {`([\p{Lu}][\w.]*)(\s+)(\()`, ByGroups(NameNamespace, Text, Punctuation), Push("funclist")}, {`[\p{Lu}][\w.]*`, NameNamespace, Pop(1)}, }, "funclist": { {`\s+`, Text, nil}, {`[\p{Lu}]\w*`, KeywordType, nil}, {`(_[\w\']+|[\p{Ll}][\w\']*)`, NameFunction, nil}, {`--(?![!#$%&*+./<=>?@^|_~:\\]).*?$`, CommentSingle, nil}, {`\{-`, CommentMultiline, Push("comment")}, {`,`, Punctuation, nil}, {`[:!#$%&*+.\\/<=>?@^|~-]+`, Operator, nil}, {`\(`, Punctuation, Push("funclist", "funclist")}, {`\)`, Punctuation, Pop(2)}, }, "comment": { {`[^-{}]+`, CommentMultiline, nil}, {`\{-`, CommentMultiline, Push()}, {`-\}`, CommentMultiline, Pop(1)}, {`[-{}]`, CommentMultiline, nil}, }, "character": { {`[^\\']'`, LiteralStringChar, Pop(1)}, {`\\`, LiteralStringEscape, Push("escape")}, {`'`, LiteralStringChar, Pop(1)}, }, "string": { {`[^\\"]+`, LiteralString, nil}, {`\\`, LiteralStringEscape, Push("escape")}, {`"`, LiteralString, Pop(1)}, }, "escape": { {`[abfnrtv"\'&\\]`, LiteralStringEscape, Pop(1)}, {`\^[][\p{Lu}@^_]`, LiteralStringEscape, Pop(1)}, {`NUL|SOH|[SE]TX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|S[OI]|DLE|DC[1-4]|NAK|SYN|ETB|CAN|EM|SUB|ESC|[FGRU]S|SP|DEL`, LiteralStringEscape, Pop(1)}, {`o[0-7]+`, LiteralStringEscape, Pop(1)}, {`x[\da-fA-F]+`, LiteralStringEscape, Pop(1)}, {`\d+`, LiteralStringEscape, Pop(1)}, {`\s+\\`, LiteralStringEscape, Pop(1)}, }, } }