package c import ( . "github.com/alecthomas/chroma" // nolint "github.com/alecthomas/chroma/lexers/internal" ) // Crystal lexer. var Crystal = internal.Register(MustNewLazyLexer( &Config{ Name: "Crystal", Aliases: []string{"cr", "crystal"}, Filenames: []string{"*.cr"}, MimeTypes: []string{"text/x-crystal"}, DotAll: true, }, crystalRules, )) func crystalRules() Rules { return Rules{ "root": { {`#.*?$`, CommentSingle, nil}, {Words(``, `\b`, `abstract`, `asm`, `as`, `begin`, `break`, `case`, `do`, `else`, `elsif`, `end`, `ensure`, `extend`, `ifdef`, `if`, `include`, `instance_sizeof`, `next`, `of`, `pointerof`, `private`, `protected`, `rescue`, `return`, `require`, `sizeof`, `super`, `then`, `typeof`, `unless`, `until`, `when`, `while`, `with`, `yield`), Keyword, nil}, {Words(``, `\b`, `true`, `false`, `nil`), KeywordConstant, nil}, {`(module|lib)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)`, ByGroups(Keyword, Text, NameNamespace), nil}, {`(def|fun|macro)(\s+)((?:[a-zA-Z_]\w*::)*)`, ByGroups(Keyword, Text, NameNamespace), Push("funcname")}, {"def(?=[*%&^`~+-/\\[<>=])", Keyword, Push("funcname")}, {`(class|struct|union|type|alias|enum)(\s+)((?:[a-zA-Z_]\w*::)*)`, ByGroups(Keyword, Text, NameNamespace), Push("classname")}, {`(self|out|uninitialized)\b|(is_a|responds_to)\?`, KeywordPseudo, nil}, {Words(``, `\b`, `debugger`, `record`, `pp`, `assert_responds_to`, `spawn`, `parallel`, `getter`, `setter`, `property`, `delegate`, `def_hash`, `def_equals`, `def_equals_and_hash`, `forward_missing_to`), NameBuiltinPseudo, nil}, {`getter[!?]|property[!?]|__(DIR|FILE|LINE)__\b`, NameBuiltinPseudo, nil}, {Words(`(?~!:])|(?<=(?:\s|;)when\s)|(?<=(?:\s|;)or\s)|(?<=(?:\s|;)and\s)|(?<=\.index\s)|(?<=\.scan\s)|(?<=\.sub\s)|(?<=\.sub!\s)|(?<=\.gsub\s)|(?<=\.gsub!\s)|(?<=\.match\s)|(?<=(?:\s|;)if\s)|(?<=(?:\s|;)elsif\s)|(?<=^when\s)|(?<=^index\s)|(?<=^scan\s)|(?<=^sub\s)|(?<=^gsub\s)|(?<=^sub!\s)|(?<=^gsub!\s)|(?<=^match\s)|(?<=^if\s)|(?<=^elsif\s))(\s*)(/)`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")}, {`(?<=\(|,|\[)/`, LiteralStringRegex, Push("multiline-regex")}, {`(\s+)(/)(?![\s=])`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")}, {`(0o[0-7]+(?:_[0-7]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberOct, Text, Operator), nil}, {`(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberHex, Text, Operator), nil}, {`(0b[01]+(?:_[01]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberBin, Text, Operator), nil}, {`((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)(?:e[+-]?[0-9]+)?(?:_?f[0-9]+)?)(\s*)([/?])?`, ByGroups(LiteralNumberFloat, Text, Operator), nil}, {`((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)(?:_?f[0-9]+)?)(\s*)([/?])?`, ByGroups(LiteralNumberFloat, Text, Operator), nil}, {`((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)?(?:_?f[0-9]+))(\s*)([/?])?`, ByGroups(LiteralNumberFloat, Text, Operator), nil}, {`(0\b|[1-9][\d]*(?:_\d+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberInteger, Text, Operator), nil}, {`@@[a-zA-Z_]\w*`, NameVariableClass, nil}, {`@[a-zA-Z_]\w*`, NameVariableInstance, nil}, {`\$\w+`, NameVariableGlobal, nil}, {"\\$[!@&`\\'+~=/\\\\,;.<>_*$?:\"^-]", NameVariableGlobal, nil}, {`\$-[0adFiIlpvw]`, NameVariableGlobal, nil}, {`::`, Operator, nil}, Include("strings"), {`\?(\\[MC]-)*(\\([\\befnrtv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)(?!\w)`, LiteralStringChar, nil}, {`[A-Z][A-Z_]+\b`, NameConstant, nil}, {`\{%`, LiteralStringInterpol, Push("in-macro-control")}, {`\{\{`, LiteralStringInterpol, Push("in-macro-expr")}, {`(@\[)(\s*)([A-Z]\w*)`, ByGroups(Operator, Text, NameDecorator), Push("in-attr")}, {Words(`(\.|::)`, ``, `!=`, `!~`, `!`, `%`, `&&`, `&`, `**`, `*`, `+`, `-`, `/`, `<=>`, `<<`, `<=`, `<`, `===`, `==`, `=~`, `=`, `>=`, `>>`, `>`, `[]=`, `[]?`, `[]`, `^`, `||`, `|`, `~`), ByGroups(Operator, NameOperator), nil}, {"(\\.|::)([a-zA-Z_]\\w*[!?]?|[*%&^`~+\\-/\\[<>=])", ByGroups(Operator, Name), nil}, {`[a-zA-Z_]\w*(?:[!?](?!=))?`, Name, nil}, {`(\[|\]\??|\*\*|<=>?|>=|<>?|=~|===|!~|&&?|\|\||\.{1,3})`, Operator, nil}, {`[-+/*%=<>&!^|~]=?`, Operator, nil}, {`[(){};,/?:\\]`, Punctuation, nil}, {`\s+`, Text, nil}, }, "funcname": { {"(?:([a-zA-Z_]\\w*)(\\.))?([a-zA-Z_]\\w*[!?]?|\\*\\*?|[-+]@?|[/%&|^`~]|\\[\\]=?|<<|>>|<=?>|>=?|===?)", ByGroups(NameClass, Operator, NameFunction), Pop(1)}, Default(Pop(1)), }, "classname": { {`[A-Z_]\w*`, NameClass, nil}, {`(\()(\s*)([A-Z_]\w*)(\s*)(\))`, ByGroups(Punctuation, Text, NameClass, Text, Punctuation), nil}, Default(Pop(1)), }, "in-intp": { {`\{`, LiteralStringInterpol, Push()}, {`\}`, LiteralStringInterpol, Pop(1)}, Include("root"), }, "string-intp": { {`#\{`, LiteralStringInterpol, Push("in-intp")}, }, "string-escaped": { {`\\([\\befnstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})`, LiteralStringEscape, nil}, }, "string-intp-escaped": { Include("string-intp"), Include("string-escaped"), }, "interpolated-regex": { Include("string-intp"), {`[\\#]`, LiteralStringRegex, nil}, {`[^\\#]+`, LiteralStringRegex, nil}, }, "interpolated-string": { Include("string-intp"), {`[\\#]`, LiteralStringOther, nil}, {`[^\\#]+`, LiteralStringOther, nil}, }, "multiline-regex": { Include("string-intp"), {`\\\\`, LiteralStringRegex, nil}, {`\\/`, LiteralStringRegex, nil}, {`[\\#]`, LiteralStringRegex, nil}, {`[^\\/#]+`, LiteralStringRegex, nil}, {`/[imsx]*`, LiteralStringRegex, Pop(1)}, }, "end-part": { {`.+`, CommentPreproc, Pop(1)}, }, "in-macro-control": { {`\{%`, LiteralStringInterpol, Push()}, {`%\}`, LiteralStringInterpol, Pop(1)}, {`for\b|in\b`, Keyword, nil}, Include("root"), }, "in-macro-expr": { {`\{\{`, LiteralStringInterpol, Push()}, {`\}\}`, LiteralStringInterpol, Pop(1)}, Include("root"), }, "in-attr": { {`\[`, Operator, Push()}, {`\]`, Operator, Pop(1)}, Include("root"), }, "strings": { {`\:@{0,2}[a-zA-Z_]\w*[!?]?`, LiteralStringSymbol, nil}, {Words(`\:@{0,2}`, ``, `!=`, `!~`, `!`, `%`, `&&`, `&`, `**`, `*`, `+`, `-`, `/`, `<=>`, `<<`, `<=`, `<`, `===`, `==`, `=~`, `=`, `>=`, `>>`, `>`, `[]=`, `[]?`, `[]`, `^`, `||`, `|`, `~`), LiteralStringSymbol, nil}, {`:'(\\\\|\\'|[^'])*'`, LiteralStringSymbol, nil}, {`'(\\\\|\\'|[^']|\\[^'\\]+)'`, LiteralStringChar, nil}, {`:"`, LiteralStringSymbol, Push("simple-sym")}, {`([a-zA-Z_]\w*)(:)(?!:)`, ByGroups(LiteralStringSymbol, Punctuation), nil}, {`"`, LiteralStringDouble, Push("simple-string")}, {"(?&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil}, {`^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil}, {`(%([\[{(<]))((?:\\\2|(?!\2).)*)(\2)`, String, nil}, }, "simple-string": { Include("string-intp-escaped"), {`[^\\"#]+`, LiteralStringDouble, nil}, {`[\\#]`, LiteralStringDouble, nil}, {`"`, LiteralStringDouble, Pop(1)}, }, "simple-sym": { Include("string-escaped"), {`[^\\"#]+`, LiteralStringSymbol, nil}, {`[\\#]`, LiteralStringSymbol, nil}, {`"`, LiteralStringSymbol, Pop(1)}, }, "simple-backtick": { Include("string-intp-escaped"), {"[^\\\\`#]+", LiteralStringBacktick, nil}, {`[\\#]`, LiteralStringBacktick, nil}, {"`", LiteralStringBacktick, Pop(1)}, }, "cb-intp-string": { {`\\[\{]`, LiteralStringOther, nil}, {`\{`, LiteralStringOther, Push()}, {`\}`, LiteralStringOther, Pop(1)}, Include("string-intp-escaped"), {`[\\#{}]`, LiteralStringOther, nil}, {`[^\\#{}]+`, LiteralStringOther, nil}, }, "cb-string": { {`\\[\\{}]`, LiteralStringOther, nil}, {`\{`, LiteralStringOther, Push()}, {`\}`, LiteralStringOther, Pop(1)}, {`[\\#{}]`, LiteralStringOther, nil}, {`[^\\#{}]+`, LiteralStringOther, nil}, }, "cb-regex": { {`\\[\\{}]`, LiteralStringRegex, nil}, {`\{`, LiteralStringRegex, Push()}, {`\}[imsx]*`, LiteralStringRegex, Pop(1)}, Include("string-intp"), {`[\\#{}]`, LiteralStringRegex, nil}, {`[^\\#{}]+`, LiteralStringRegex, nil}, }, "sb-intp-string": { {`\\[\[]`, LiteralStringOther, nil}, {`\[`, LiteralStringOther, Push()}, {`\]`, LiteralStringOther, Pop(1)}, Include("string-intp-escaped"), {`[\\#\[\]]`, LiteralStringOther, nil}, {`[^\\#\[\]]+`, LiteralStringOther, nil}, }, "sb-string": { {`\\[\\\[\]]`, LiteralStringOther, nil}, {`\[`, LiteralStringOther, Push()}, {`\]`, LiteralStringOther, Pop(1)}, {`[\\#\[\]]`, LiteralStringOther, nil}, {`[^\\#\[\]]+`, LiteralStringOther, nil}, }, "sb-regex": { {`\\[\\\[\]]`, LiteralStringRegex, nil}, {`\[`, LiteralStringRegex, Push()}, {`\][imsx]*`, LiteralStringRegex, Pop(1)}, Include("string-intp"), {`[\\#\[\]]`, LiteralStringRegex, nil}, {`[^\\#\[\]]+`, LiteralStringRegex, nil}, }, "pa-intp-string": { {`\\[\(]`, LiteralStringOther, nil}, {`\(`, LiteralStringOther, Push()}, {`\)`, LiteralStringOther, Pop(1)}, Include("string-intp-escaped"), {`[\\#()]`, LiteralStringOther, nil}, {`[^\\#()]+`, LiteralStringOther, nil}, }, "pa-string": { {`\\[\\()]`, LiteralStringOther, nil}, {`\(`, LiteralStringOther, Push()}, {`\)`, LiteralStringOther, Pop(1)}, {`[\\#()]`, LiteralStringOther, nil}, {`[^\\#()]+`, LiteralStringOther, nil}, }, "pa-regex": { {`\\[\\()]`, LiteralStringRegex, nil}, {`\(`, LiteralStringRegex, Push()}, {`\)[imsx]*`, LiteralStringRegex, Pop(1)}, Include("string-intp"), {`[\\#()]`, LiteralStringRegex, nil}, {`[^\\#()]+`, LiteralStringRegex, nil}, }, "ab-intp-string": { {`\\[<]`, LiteralStringOther, nil}, {`<`, LiteralStringOther, Push()}, {`>`, LiteralStringOther, Pop(1)}, Include("string-intp-escaped"), {`[\\#<>]`, LiteralStringOther, nil}, {`[^\\#<>]+`, LiteralStringOther, nil}, }, "ab-string": { {`\\[\\<>]`, LiteralStringOther, nil}, {`<`, LiteralStringOther, Push()}, {`>`, LiteralStringOther, Pop(1)}, {`[\\#<>]`, LiteralStringOther, nil}, {`[^\\#<>]+`, LiteralStringOther, nil}, }, "ab-regex": { {`\\[\\<>]`, LiteralStringRegex, nil}, {`<`, LiteralStringRegex, Push()}, {`>[imsx]*`, LiteralStringRegex, Pop(1)}, Include("string-intp"), {`[\\#<>]`, LiteralStringRegex, nil}, {`[^\\#<>]+`, LiteralStringRegex, nil}, }, } }