You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

elixir.go 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package e
  2. import (
  3. . "github.com/alecthomas/chroma" // nolint
  4. "github.com/alecthomas/chroma/lexers/internal"
  5. )
  6. // Elixir lexer.
  7. var Elixir = internal.Register(MustNewLexer(
  8. &Config{
  9. Name: "Elixir",
  10. Aliases: []string{"elixir", "ex", "exs"},
  11. Filenames: []string{"*.ex", "*.exs"},
  12. MimeTypes: []string{"text/x-elixir"},
  13. },
  14. Rules{
  15. "root": {
  16. {`\s+`, Text, nil},
  17. {`#.*$`, CommentSingle, nil},
  18. {`(\?)(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringChar, LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil},
  19. {`(\?)(\\x[\da-fA-F]{1,2})`, ByGroups(LiteralStringChar, LiteralStringEscape), nil},
  20. {`(\?)(\\[abdefnrstv])`, ByGroups(LiteralStringChar, LiteralStringEscape), nil},
  21. {`\?\\?.`, LiteralStringChar, nil},
  22. {`:::`, LiteralStringSymbol, nil},
  23. {`::`, Operator, nil},
  24. {`:(?:\.\.\.|<<>>|%\{\}|%|\{\})`, LiteralStringSymbol, nil},
  25. {`:(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&))`, LiteralStringSymbol, nil},
  26. {`:"`, LiteralStringSymbol, Push("string_double_atom")},
  27. {`:'`, LiteralStringSymbol, Push("string_single_atom")},
  28. {`((?:\.\.\.|<<>>|%\{\}|%|\{\})|(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&)))(:)(?=\s|\n)`, ByGroups(LiteralStringSymbol, Punctuation), nil},
  29. {`@(?:\.\.\.|[a-z_]\w*[!?]?)`, NameAttribute, nil},
  30. {`(?:\.\.\.|[a-z_]\w*[!?]?)`, Name, nil},
  31. {`(%?)([A-Z]\w*(?:\.[A-Z]\w*)*)`, ByGroups(Punctuation, NameClass), nil},
  32. {`\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>`, Operator, nil},
  33. {`\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~`, Operator, nil},
  34. {`\\\\|\<\<|\>\>|\=\>|\(|\)|\:|\;|\,|\[|\]`, Punctuation, nil},
  35. {`&\d`, NameEntity, nil},
  36. {`\<|\>|\+|\-|\*|\/|\!|\^|\&`, Operator, nil},
  37. {`0b[01](_?[01])*`, LiteralNumberBin, nil},
  38. {`0o[0-7](_?[0-7])*`, LiteralNumberOct, nil},
  39. {`0x[\da-fA-F](_?[\dA-Fa-f])*`, LiteralNumberHex, nil},
  40. {`\d(_?\d)*\.\d(_?\d)*([eE][-+]?\d(_?\d)*)?`, LiteralNumberFloat, nil},
  41. {`\d(_?\d)*`, LiteralNumberInteger, nil},
  42. {`"""\s*`, LiteralStringHeredoc, Push("heredoc_double")},
  43. {`'''\s*$`, LiteralStringHeredoc, Push("heredoc_single")},
  44. {`"`, LiteralStringDouble, Push("string_double")},
  45. {`'`, LiteralStringSingle, Push("string_single")},
  46. Include("sigils"),
  47. {`%\{`, Punctuation, Push("map_key")},
  48. {`\{`, Punctuation, Push("tuple")},
  49. },
  50. "heredoc_double": {
  51. {`^\s*"""`, LiteralStringHeredoc, Pop(1)},
  52. Include("heredoc_interpol"),
  53. },
  54. "heredoc_single": {
  55. {`^\s*'''`, LiteralStringHeredoc, Pop(1)},
  56. Include("heredoc_interpol"),
  57. },
  58. "heredoc_interpol": {
  59. {`[^#\\\n]+`, LiteralStringHeredoc, nil},
  60. Include("escapes"),
  61. {`\\.`, LiteralStringHeredoc, nil},
  62. {`\n+`, LiteralStringHeredoc, nil},
  63. Include("interpol"),
  64. },
  65. "heredoc_no_interpol": {
  66. {`[^\\\n]+`, LiteralStringHeredoc, nil},
  67. {`\\.`, LiteralStringHeredoc, nil},
  68. {`\n+`, LiteralStringHeredoc, nil},
  69. },
  70. "escapes": {
  71. {`(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil},
  72. {`(\\x[\da-fA-F]{1,2})`, LiteralStringEscape, nil},
  73. {`(\\[abdefnrstv])`, LiteralStringEscape, nil},
  74. },
  75. "interpol": {
  76. {`#\{`, LiteralStringInterpol, Push("interpol_string")},
  77. },
  78. "interpol_string": {
  79. {`\}`, LiteralStringInterpol, Pop(1)},
  80. Include("root"),
  81. },
  82. "map_key": {
  83. Include("root"),
  84. {`:`, Punctuation, Push("map_val")},
  85. {`=>`, Punctuation, Push("map_val")},
  86. {`\}`, Punctuation, Pop(1)},
  87. },
  88. "map_val": {
  89. Include("root"),
  90. {`,`, Punctuation, Pop(1)},
  91. {`(?=\})`, Punctuation, Pop(1)},
  92. },
  93. "tuple": {
  94. Include("root"),
  95. {`\}`, Punctuation, Pop(1)},
  96. },
  97. "string_double": {
  98. {`[^#"\\]+`, LiteralStringDouble, nil},
  99. Include("escapes"),
  100. {`\\.`, LiteralStringDouble, nil},
  101. {`(")`, ByGroups(LiteralStringDouble), Pop(1)},
  102. Include("interpol"),
  103. },
  104. "string_single": {
  105. {`[^#'\\]+`, LiteralStringSingle, nil},
  106. Include("escapes"),
  107. {`\\.`, LiteralStringSingle, nil},
  108. {`(')`, ByGroups(LiteralStringSingle), Pop(1)},
  109. Include("interpol"),
  110. },
  111. "string_double_atom": {
  112. {`[^#"\\]+`, LiteralStringSymbol, nil},
  113. Include("escapes"),
  114. {`\\.`, LiteralStringSymbol, nil},
  115. {`(")`, ByGroups(LiteralStringSymbol), Pop(1)},
  116. Include("interpol"),
  117. },
  118. "string_single_atom": {
  119. {`[^#'\\]+`, LiteralStringSymbol, nil},
  120. Include("escapes"),
  121. {`\\.`, LiteralStringSymbol, nil},
  122. {`(')`, ByGroups(LiteralStringSymbol), Pop(1)},
  123. Include("interpol"),
  124. },
  125. "sigils": {
  126. {`(~[a-z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-intp")},
  127. {`(~[A-Z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-no-intp")},
  128. {`(~[a-z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-intp")},
  129. {`(~[A-Z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-no-intp")},
  130. {`~[a-z]\{`, LiteralStringOther, Push("cb-intp")},
  131. {`~[A-Z]\{`, LiteralStringOther, Push("cb-no-intp")},
  132. {`~[a-z]\[`, LiteralStringOther, Push("sb-intp")},
  133. {`~[A-Z]\[`, LiteralStringOther, Push("sb-no-intp")},
  134. {`~[a-z]\(`, LiteralStringOther, Push("pa-intp")},
  135. {`~[A-Z]\(`, LiteralStringOther, Push("pa-no-intp")},
  136. {`~[a-z]<`, LiteralStringOther, Push("ab-intp")},
  137. {`~[A-Z]<`, LiteralStringOther, Push("ab-no-intp")},
  138. {`~[a-z]/`, LiteralStringOther, Push("slas-intp")},
  139. {`~[A-Z]/`, LiteralStringOther, Push("slas-no-intp")},
  140. {`~[a-z]\|`, LiteralStringOther, Push("pipe-intp")},
  141. {`~[A-Z]\|`, LiteralStringOther, Push("pipe-no-intp")},
  142. {`~[a-z]"`, LiteralStringOther, Push("quot-intp")},
  143. {`~[A-Z]"`, LiteralStringOther, Push("quot-no-intp")},
  144. {`~[a-z]'`, LiteralStringOther, Push("apos-intp")},
  145. {`~[A-Z]'`, LiteralStringOther, Push("apos-no-intp")},
  146. },
  147. "triquot-end": {
  148. {`[a-zA-Z]+`, LiteralStringOther, Pop(1)},
  149. Default(Pop(1)),
  150. },
  151. "triquot-intp": {
  152. {`^\s*"""`, LiteralStringHeredoc, Pop(1)},
  153. Include("heredoc_interpol"),
  154. },
  155. "triquot-no-intp": {
  156. {`^\s*"""`, LiteralStringHeredoc, Pop(1)},
  157. Include("heredoc_no_interpol"),
  158. },
  159. "triapos-end": {
  160. {`[a-zA-Z]+`, LiteralStringOther, Pop(1)},
  161. Default(Pop(1)),
  162. },
  163. "triapos-intp": {
  164. {`^\s*'''`, LiteralStringHeredoc, Pop(1)},
  165. Include("heredoc_interpol"),
  166. },
  167. "triapos-no-intp": {
  168. {`^\s*'''`, LiteralStringHeredoc, Pop(1)},
  169. Include("heredoc_no_interpol"),
  170. },
  171. "cb-intp": {
  172. {`[^#\}\\]+`, LiteralStringOther, nil},
  173. Include("escapes"),
  174. {`\\.`, LiteralStringOther, nil},
  175. {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  176. Include("interpol"),
  177. },
  178. "cb-no-intp": {
  179. {`[^\}\\]+`, LiteralStringOther, nil},
  180. {`\\.`, LiteralStringOther, nil},
  181. {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  182. },
  183. "sb-intp": {
  184. {`[^#\]\\]+`, LiteralStringOther, nil},
  185. Include("escapes"),
  186. {`\\.`, LiteralStringOther, nil},
  187. {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)},
  188. Include("interpol"),
  189. },
  190. "sb-no-intp": {
  191. {`[^\]\\]+`, LiteralStringOther, nil},
  192. {`\\.`, LiteralStringOther, nil},
  193. {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)},
  194. },
  195. "pa-intp": {
  196. {`[^#\)\\]+`, LiteralStringOther, nil},
  197. Include("escapes"),
  198. {`\\.`, LiteralStringOther, nil},
  199. {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  200. Include("interpol"),
  201. },
  202. "pa-no-intp": {
  203. {`[^\)\\]+`, LiteralStringOther, nil},
  204. {`\\.`, LiteralStringOther, nil},
  205. {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  206. },
  207. "ab-intp": {
  208. {`[^#>\\]+`, LiteralStringOther, nil},
  209. Include("escapes"),
  210. {`\\.`, LiteralStringOther, nil},
  211. {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  212. Include("interpol"),
  213. },
  214. "ab-no-intp": {
  215. {`[^>\\]+`, LiteralStringOther, nil},
  216. {`\\.`, LiteralStringOther, nil},
  217. {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  218. },
  219. "slas-intp": {
  220. {`[^#/\\]+`, LiteralStringOther, nil},
  221. Include("escapes"),
  222. {`\\.`, LiteralStringOther, nil},
  223. {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  224. Include("interpol"),
  225. },
  226. "slas-no-intp": {
  227. {`[^/\\]+`, LiteralStringOther, nil},
  228. {`\\.`, LiteralStringOther, nil},
  229. {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  230. },
  231. "pipe-intp": {
  232. {`[^#\|\\]+`, LiteralStringOther, nil},
  233. Include("escapes"),
  234. {`\\.`, LiteralStringOther, nil},
  235. {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  236. Include("interpol"),
  237. },
  238. "pipe-no-intp": {
  239. {`[^\|\\]+`, LiteralStringOther, nil},
  240. {`\\.`, LiteralStringOther, nil},
  241. {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  242. },
  243. "quot-intp": {
  244. {`[^#"\\]+`, LiteralStringOther, nil},
  245. Include("escapes"),
  246. {`\\.`, LiteralStringOther, nil},
  247. {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  248. Include("interpol"),
  249. },
  250. "quot-no-intp": {
  251. {`[^"\\]+`, LiteralStringOther, nil},
  252. {`\\.`, LiteralStringOther, nil},
  253. {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  254. },
  255. "apos-intp": {
  256. {`[^#'\\]+`, LiteralStringOther, nil},
  257. Include("escapes"),
  258. {`\\.`, LiteralStringOther, nil},
  259. {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  260. Include("interpol"),
  261. },
  262. "apos-no-intp": {
  263. {`[^'\\]+`, LiteralStringOther, nil},
  264. {`\\.`, LiteralStringOther, nil},
  265. {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)},
  266. },
  267. },
  268. ))