mirror of https://github.com/cheat/cheat.git
104 lines
3.7 KiB
Go
104 lines
3.7 KiB
Go
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)},
|
|
},
|
|
}
|
|
}
|