package s import ( . "github.com/alecthomas/chroma" // nolint "github.com/alecthomas/chroma/lexers/internal" ) // Standard ML lexer. var StandardML = internal.Register(MustNewLazyLexer( &Config{ Name: "Standard ML", Aliases: []string{"sml"}, Filenames: []string{"*.sml", "*.sig", "*.fun"}, MimeTypes: []string{"text/x-standardml", "application/x-standardml"}, }, standardMLRules, )) func standardMLRules() Rules { return Rules{ "whitespace": { {`\s+`, Text, nil}, {`\(\*`, CommentMultiline, Push("comment")}, }, "delimiters": { {`\(|\[|\{`, Punctuation, Push("main")}, {`\)|\]|\}`, Punctuation, Pop(1)}, {`\b(let|if|local)\b(?!\')`, KeywordReserved, Push("main", "main")}, {`\b(struct|sig|while)\b(?!\')`, KeywordReserved, Push("main")}, {`\b(do|else|end|in|then)\b(?!\')`, KeywordReserved, Pop(1)}, }, "core": { {`(_|\}|\{|\)|;|,|\[|\(|\]|\.\.\.)`, Punctuation, nil}, {`#"`, LiteralStringChar, Push("char")}, {`"`, LiteralStringDouble, Push("string")}, {`~?0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, {`0wx[0-9a-fA-F]+`, LiteralNumberHex, nil}, {`0w\d+`, LiteralNumberInteger, nil}, {`~?\d+\.\d+[eE]~?\d+`, LiteralNumberFloat, nil}, {`~?\d+\.\d+`, LiteralNumberFloat, nil}, {`~?\d+[eE]~?\d+`, LiteralNumberFloat, nil}, {`~?\d+`, LiteralNumberInteger, nil}, {`#\s*[1-9][0-9]*`, NameLabel, nil}, {`#\s*([a-zA-Z][\w']*)`, NameLabel, nil}, {"#\\s+([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameLabel, nil}, {`\b(datatype|abstype)\b(?!\')`, KeywordReserved, Push("dname")}, {`(?=\b(exception)\b(?!\'))`, Text, Push("ename")}, {`\b(functor|include|open|signature|structure)\b(?!\')`, KeywordReserved, Push("sname")}, {`\b(type|eqtype)\b(?!\')`, KeywordReserved, Push("tname")}, {`\'[\w\']*`, NameDecorator, nil}, {`([a-zA-Z][\w']*)(\.)`, NameNamespace, Push("dotted")}, {`\b(abstype|and|andalso|as|case|datatype|do|else|end|exception|fn|fun|handle|if|in|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|then|type|val|with|withtype|while|eqtype|functor|include|sharing|sig|signature|struct|structure|where)\b`, KeywordReserved, nil}, {`([a-zA-Z][\w']*)`, Name, nil}, {`\b(:|\|,=|=>|->|#|:>)\b`, KeywordReserved, nil}, {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Name, nil}, }, "dotted": { {`([a-zA-Z][\w']*)(\.)`, NameNamespace, nil}, // ignoring reserved words {`([a-zA-Z][\w']*)`, Name, Pop(1)}, // ignoring reserved words {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Name, Pop(1)}, {`\s+`, Error, nil}, {`\S+`, Error, nil}, }, "root": { Default(Push("main")), }, "main": { Include("whitespace"), {`\b(val|and)\b(?!\')`, KeywordReserved, Push("vname")}, {`\b(fun)\b(?!\')`, KeywordReserved, Push("#pop", "main-fun", "fname")}, Include("delimiters"), Include("core"), {`\S+`, Error, nil}, }, "main-fun": { Include("whitespace"), {`\s`, Text, nil}, {`\(\*`, CommentMultiline, Push("comment")}, {`\b(fun|and)\b(?!\')`, KeywordReserved, Push("fname")}, {`\b(val)\b(?!\')`, KeywordReserved, Push("#pop", "main", "vname")}, {`\|`, Punctuation, Push("fname")}, {`\b(case|handle)\b(?!\')`, KeywordReserved, Push("#pop", "main")}, Include("delimiters"), Include("core"), {`\S+`, Error, nil}, }, "char": { {`[^"\\]`, LiteralStringChar, nil}, {`\\[\\"abtnvfr]`, LiteralStringEscape, nil}, {`\\\^[\x40-\x5e]`, LiteralStringEscape, nil}, {`\\[0-9]{3}`, LiteralStringEscape, nil}, {`\\u[0-9a-fA-F]{4}`, LiteralStringEscape, nil}, {`\\\s+\\`, LiteralStringInterpol, nil}, {`"`, LiteralStringChar, Pop(1)}, }, "string": { {`[^"\\]`, LiteralStringDouble, nil}, {`\\[\\"abtnvfr]`, LiteralStringEscape, nil}, {`\\\^[\x40-\x5e]`, LiteralStringEscape, nil}, {`\\[0-9]{3}`, LiteralStringEscape, nil}, {`\\u[0-9a-fA-F]{4}`, LiteralStringEscape, nil}, {`\\\s+\\`, LiteralStringInterpol, nil}, {`"`, LiteralStringDouble, Pop(1)}, }, "breakout": { {`(?=\b(where|do|handle|if|sig|op|while|case|as|else|signature|andalso|struct|infixr|functor|in|structure|then|local|rec|end|fun|of|orelse|val|include|fn|with|exception|let|and|infix|sharing|datatype|type|abstype|withtype|eqtype|nonfix|raise|open)\b(?!\'))`, Text, Pop(1)}, }, "sname": { Include("whitespace"), Include("breakout"), {`([a-zA-Z][\w']*)`, NameNamespace, nil}, Default(Pop(1)), }, "fname": { Include("whitespace"), {`\'[\w\']*`, NameDecorator, nil}, {`\(`, Punctuation, Push("tyvarseq")}, {`([a-zA-Z][\w']*)`, NameFunction, Pop(1)}, {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameFunction, Pop(1)}, Default(Pop(1)), }, "vname": { Include("whitespace"), {`\'[\w\']*`, NameDecorator, nil}, {`\(`, Punctuation, Push("tyvarseq")}, {"([a-zA-Z][\\w']*)(\\s*)(=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+))", ByGroups(NameVariable, Text, Punctuation), Pop(1)}, {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)(\\s*)(=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+))", ByGroups(NameVariable, Text, Punctuation), Pop(1)}, {`([a-zA-Z][\w']*)`, NameVariable, Pop(1)}, {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameVariable, Pop(1)}, Default(Pop(1)), }, "tname": { Include("whitespace"), Include("breakout"), {`\'[\w\']*`, NameDecorator, nil}, {`\(`, Punctuation, Push("tyvarseq")}, {"=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Punctuation, Push("#pop", "typbind")}, {`([a-zA-Z][\w']*)`, KeywordType, nil}, {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", KeywordType, nil}, {`\S+`, Error, Pop(1)}, }, "typbind": { Include("whitespace"), {`\b(and)\b(?!\')`, KeywordReserved, Push("#pop", "tname")}, Include("breakout"), Include("core"), {`\S+`, Error, Pop(1)}, }, "dname": { Include("whitespace"), Include("breakout"), {`\'[\w\']*`, NameDecorator, nil}, {`\(`, Punctuation, Push("tyvarseq")}, {`(=)(\s*)(datatype)`, ByGroups(Punctuation, Text, KeywordReserved), Pop(1)}, {"=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Punctuation, Push("#pop", "datbind", "datcon")}, {`([a-zA-Z][\w']*)`, KeywordType, nil}, {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", KeywordType, nil}, {`\S+`, Error, Pop(1)}, }, "datbind": { Include("whitespace"), {`\b(and)\b(?!\')`, KeywordReserved, Push("#pop", "dname")}, {`\b(withtype)\b(?!\')`, KeywordReserved, Push("#pop", "tname")}, {`\b(of)\b(?!\')`, KeywordReserved, nil}, {`(\|)(\s*)([a-zA-Z][\w']*)`, ByGroups(Punctuation, Text, NameClass), nil}, {"(\\|)(\\s+)([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", ByGroups(Punctuation, Text, NameClass), nil}, Include("breakout"), Include("core"), {`\S+`, Error, nil}, }, "ename": { Include("whitespace"), {`(exception|and)\b(\s+)([a-zA-Z][\w']*)`, ByGroups(KeywordReserved, Text, NameClass), nil}, {"(exception|and)\\b(\\s*)([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", ByGroups(KeywordReserved, Text, NameClass), nil}, {`\b(of)\b(?!\')`, KeywordReserved, nil}, Include("breakout"), Include("core"), {`\S+`, Error, nil}, }, "datcon": { Include("whitespace"), {`([a-zA-Z][\w']*)`, NameClass, Pop(1)}, {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameClass, Pop(1)}, {`\S+`, Error, Pop(1)}, }, "tyvarseq": { {`\s`, Text, nil}, {`\(\*`, CommentMultiline, Push("comment")}, {`\'[\w\']*`, NameDecorator, nil}, {`[a-zA-Z][\w']*`, Name, nil}, {`,`, Punctuation, nil}, {`\)`, Punctuation, Pop(1)}, {"[!%&$#+\\-/:<=>?@\\\\~`^|*]+", Name, nil}, }, "comment": { {`[^(*)]`, CommentMultiline, nil}, {`\(\*`, CommentMultiline, Push()}, {`\*\)`, CommentMultiline, Pop(1)}, {`[(*)]`, CommentMultiline, nil}, }, } }