package e import ( . "github.com/alecthomas/chroma" // nolint "github.com/alecthomas/chroma/lexers/internal" ) // Elixir lexer. var Elixir = internal.Register(MustNewLazyLexer( &Config{ Name: "Elixir", Aliases: []string{"elixir", "ex", "exs"}, Filenames: []string{"*.ex", "*.exs"}, MimeTypes: []string{"text/x-elixir"}, }, elixirRules, )) func elixirRules() Rules { return Rules{ "root": { {`\s+`, Text, nil}, {`#.*$`, CommentSingle, nil}, {`(\?)(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringChar, LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil}, {`(\?)(\\x[\da-fA-F]{1,2})`, ByGroups(LiteralStringChar, LiteralStringEscape), nil}, {`(\?)(\\[abdefnrstv])`, ByGroups(LiteralStringChar, LiteralStringEscape), nil}, {`\?\\?.`, LiteralStringChar, nil}, {`:::`, LiteralStringSymbol, nil}, {`::`, Operator, nil}, {`:(?:\.\.\.|<<>>|%\{\}|%|\{\})`, LiteralStringSymbol, nil}, {`:(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&))`, LiteralStringSymbol, nil}, {`:"`, LiteralStringSymbol, Push("string_double_atom")}, {`:'`, LiteralStringSymbol, Push("string_single_atom")}, {`((?:\.\.\.|<<>>|%\{\}|%|\{\})|(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&)))(:)(?=\s|\n)`, ByGroups(LiteralStringSymbol, Punctuation), nil}, {`(fn|do|end|after|else|rescue|catch)\b`, Keyword, nil}, {`(not|and|or|when|in)\b`, OperatorWord, nil}, {`(case|cond|for|if|unless|try|receive|raise|quote|unquote|unquote_splicing|throw|super|while)\b`, Keyword, nil}, {`(def|defp|defmodule|defprotocol|defmacro|defmacrop|defdelegate|defexception|defstruct|defimpl|defcallback)\b`, KeywordDeclaration, nil}, {`(import|require|use|alias)\b`, KeywordNamespace, nil}, {`(nil|true|false)\b`, NameConstant, nil}, {`(_|__MODULE__|__DIR__|__ENV__|__CALLER__)\b`, NamePseudo, nil}, {`@(?:\.\.\.|[a-z_]\w*[!?]?)`, NameAttribute, nil}, {`(?:\.\.\.|[a-z_]\w*[!?]?)`, Name, nil}, {`(%?)([A-Z]\w*(?:\.[A-Z]\w*)*)`, ByGroups(Punctuation, NameClass), nil}, {`\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>`, Operator, nil}, {`\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~`, Operator, nil}, {`\\\\|\<\<|\>\>|\=\>|\(|\)|\:|\;|\,|\[|\]`, Punctuation, nil}, {`&\d`, NameEntity, nil}, {`\<|\>|\+|\-|\*|\/|\!|\^|\&`, Operator, nil}, {`0b[01](_?[01])*`, LiteralNumberBin, nil}, {`0o[0-7](_?[0-7])*`, LiteralNumberOct, nil}, {`0x[\da-fA-F](_?[\dA-Fa-f])*`, LiteralNumberHex, nil}, {`\d(_?\d)*\.\d(_?\d)*([eE][-+]?\d(_?\d)*)?`, LiteralNumberFloat, nil}, {`\d(_?\d)*`, LiteralNumberInteger, nil}, {`"""\s*`, LiteralStringHeredoc, Push("heredoc_double")}, {`'''\s*$`, LiteralStringHeredoc, Push("heredoc_single")}, {`"`, LiteralStringDouble, Push("string_double")}, {`'`, LiteralStringSingle, Push("string_single")}, Include("sigils"), {`%\{`, Punctuation, Push("map_key")}, {`\{`, Punctuation, Push("tuple")}, }, "heredoc_double": { {`^\s*"""`, LiteralStringHeredoc, Pop(1)}, Include("heredoc_interpol"), }, "heredoc_single": { {`^\s*'''`, LiteralStringHeredoc, Pop(1)}, Include("heredoc_interpol"), }, "heredoc_interpol": { {`[^#\\\n]+`, LiteralStringHeredoc, nil}, Include("escapes"), {`\\.`, LiteralStringHeredoc, nil}, {`\n+`, LiteralStringHeredoc, nil}, Include("interpol"), }, "heredoc_no_interpol": { {`[^\\\n]+`, LiteralStringHeredoc, nil}, {`\\.`, LiteralStringHeredoc, nil}, {`\n+`, LiteralStringHeredoc, nil}, }, "escapes": { {`(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil}, {`(\\x[\da-fA-F]{1,2})`, LiteralStringEscape, nil}, {`(\\[abdefnrstv])`, LiteralStringEscape, nil}, }, "interpol": { {`#\{`, LiteralStringInterpol, Push("interpol_string")}, }, "interpol_string": { {`\}`, LiteralStringInterpol, Pop(1)}, Include("root"), }, "map_key": { Include("root"), {`:`, Punctuation, Push("map_val")}, {`=>`, Punctuation, Push("map_val")}, {`\}`, Punctuation, Pop(1)}, }, "map_val": { Include("root"), {`,`, Punctuation, Pop(1)}, {`(?=\})`, Punctuation, Pop(1)}, }, "tuple": { Include("root"), {`\}`, Punctuation, Pop(1)}, }, "string_double": { {`[^#"\\]+`, LiteralStringDouble, nil}, Include("escapes"), {`\\.`, LiteralStringDouble, nil}, {`(")`, ByGroups(LiteralStringDouble), Pop(1)}, Include("interpol"), }, "string_single": { {`[^#'\\]+`, LiteralStringSingle, nil}, Include("escapes"), {`\\.`, LiteralStringSingle, nil}, {`(')`, ByGroups(LiteralStringSingle), Pop(1)}, Include("interpol"), }, "string_double_atom": { {`[^#"\\]+`, LiteralStringSymbol, nil}, Include("escapes"), {`\\.`, LiteralStringSymbol, nil}, {`(")`, ByGroups(LiteralStringSymbol), Pop(1)}, Include("interpol"), }, "string_single_atom": { {`[^#'\\]+`, LiteralStringSymbol, nil}, Include("escapes"), {`\\.`, LiteralStringSymbol, nil}, {`(')`, ByGroups(LiteralStringSymbol), Pop(1)}, Include("interpol"), }, "sigils": { {`(~[a-z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-intp")}, {`(~[A-Z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-no-intp")}, {`(~[a-z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-intp")}, {`(~[A-Z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-no-intp")}, {`~[a-z]\{`, LiteralStringOther, Push("cb-intp")}, {`~[A-Z]\{`, LiteralStringOther, Push("cb-no-intp")}, {`~[a-z]\[`, LiteralStringOther, Push("sb-intp")}, {`~[A-Z]\[`, LiteralStringOther, Push("sb-no-intp")}, {`~[a-z]\(`, LiteralStringOther, Push("pa-intp")}, {`~[A-Z]\(`, LiteralStringOther, Push("pa-no-intp")}, {`~[a-z]<`, LiteralStringOther, Push("ab-intp")}, {`~[A-Z]<`, LiteralStringOther, Push("ab-no-intp")}, {`~[a-z]/`, LiteralStringOther, Push("slas-intp")}, {`~[A-Z]/`, LiteralStringOther, Push("slas-no-intp")}, {`~[a-z]\|`, LiteralStringOther, Push("pipe-intp")}, {`~[A-Z]\|`, LiteralStringOther, Push("pipe-no-intp")}, {`~[a-z]"`, LiteralStringOther, Push("quot-intp")}, {`~[A-Z]"`, LiteralStringOther, Push("quot-no-intp")}, {`~[a-z]'`, LiteralStringOther, Push("apos-intp")}, {`~[A-Z]'`, LiteralStringOther, Push("apos-no-intp")}, }, "triquot-end": { {`[a-zA-Z]+`, LiteralStringOther, Pop(1)}, Default(Pop(1)), }, "triquot-intp": { {`^\s*"""`, LiteralStringHeredoc, Pop(1)}, Include("heredoc_interpol"), }, "triquot-no-intp": { {`^\s*"""`, LiteralStringHeredoc, Pop(1)}, Include("heredoc_no_interpol"), }, "triapos-end": { {`[a-zA-Z]+`, LiteralStringOther, Pop(1)}, Default(Pop(1)), }, "triapos-intp": { {`^\s*'''`, LiteralStringHeredoc, Pop(1)}, Include("heredoc_interpol"), }, "triapos-no-intp": { {`^\s*'''`, LiteralStringHeredoc, Pop(1)}, Include("heredoc_no_interpol"), }, "cb-intp": { {`[^#\}\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "cb-no-intp": { {`[^\}\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, "sb-intp": { {`[^#\]\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "sb-no-intp": { {`[^\]\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, "pa-intp": { {`[^#\)\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "pa-no-intp": { {`[^\)\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, "ab-intp": { {`[^#>\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "ab-no-intp": { {`[^>\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, "slas-intp": { {`[^#/\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "slas-no-intp": { {`[^/\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, "pipe-intp": { {`[^#\|\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "pipe-no-intp": { {`[^\|\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, "quot-intp": { {`[^#"\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "quot-no-intp": { {`[^"\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, "apos-intp": { {`[^#'\\]+`, LiteralStringOther, nil}, Include("escapes"), {`\\.`, LiteralStringOther, nil}, {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)}, Include("interpol"), }, "apos-no-intp": { {`[^'\\]+`, LiteralStringOther, nil}, {`\\.`, LiteralStringOther, nil}, {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)}, }, } }