erlang.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. Language: Erlang
  3. Description: Erlang is a general-purpose functional language, with strict evaluation, single assignment, and dynamic typing.
  4. Author: Nikolay Zakharov <nikolay.desh@gmail.com>, Dmitry Kovega <arhibot@gmail.com>
  5. Website: https://www.erlang.org
  6. Category: functional
  7. */
  8. function erlang(hljs) {
  9. var BASIC_ATOM_RE = '[a-z\'][a-zA-Z0-9_\']*';
  10. var FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';
  11. var ERLANG_RESERVED = {
  12. keyword:
  13. 'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if ' +
  14. 'let not of orelse|10 query receive rem try when xor',
  15. literal:
  16. 'false true'
  17. };
  18. var COMMENT = hljs.COMMENT('%', '$');
  19. var NUMBER = {
  20. className: 'number',
  21. begin: '\\b(\\d+(_\\d+)*#[a-fA-F0-9]+(_[a-fA-F0-9]+)*|\\d+(_\\d+)*(\\.\\d+(_\\d+)*)?([eE][-+]?\\d+)?)',
  22. relevance: 0
  23. };
  24. var NAMED_FUN = {
  25. begin: 'fun\\s+' + BASIC_ATOM_RE + '/\\d+'
  26. };
  27. var FUNCTION_CALL = {
  28. begin: FUNCTION_NAME_RE + '\\(', end: '\\)',
  29. returnBegin: true,
  30. relevance: 0,
  31. contains: [
  32. {
  33. begin: FUNCTION_NAME_RE, relevance: 0
  34. },
  35. {
  36. begin: '\\(', end: '\\)', endsWithParent: true,
  37. returnEnd: true,
  38. relevance: 0
  39. // "contains" defined later
  40. }
  41. ]
  42. };
  43. var TUPLE = {
  44. begin: '{', end: '}',
  45. relevance: 0
  46. // "contains" defined later
  47. };
  48. var VAR1 = {
  49. begin: '\\b_([A-Z][A-Za-z0-9_]*)?',
  50. relevance: 0
  51. };
  52. var VAR2 = {
  53. begin: '[A-Z][a-zA-Z0-9_]*',
  54. relevance: 0
  55. };
  56. var RECORD_ACCESS = {
  57. begin: '#' + hljs.UNDERSCORE_IDENT_RE,
  58. relevance: 0,
  59. returnBegin: true,
  60. contains: [
  61. {
  62. begin: '#' + hljs.UNDERSCORE_IDENT_RE,
  63. relevance: 0
  64. },
  65. {
  66. begin: '{', end: '}',
  67. relevance: 0
  68. // "contains" defined later
  69. }
  70. ]
  71. };
  72. var BLOCK_STATEMENTS = {
  73. beginKeywords: 'fun receive if try case', end: 'end',
  74. keywords: ERLANG_RESERVED
  75. };
  76. BLOCK_STATEMENTS.contains = [
  77. COMMENT,
  78. NAMED_FUN,
  79. hljs.inherit(hljs.APOS_STRING_MODE, {className: ''}),
  80. BLOCK_STATEMENTS,
  81. FUNCTION_CALL,
  82. hljs.QUOTE_STRING_MODE,
  83. NUMBER,
  84. TUPLE,
  85. VAR1, VAR2,
  86. RECORD_ACCESS
  87. ];
  88. var BASIC_MODES = [
  89. COMMENT,
  90. NAMED_FUN,
  91. BLOCK_STATEMENTS,
  92. FUNCTION_CALL,
  93. hljs.QUOTE_STRING_MODE,
  94. NUMBER,
  95. TUPLE,
  96. VAR1, VAR2,
  97. RECORD_ACCESS
  98. ];
  99. FUNCTION_CALL.contains[1].contains = BASIC_MODES;
  100. TUPLE.contains = BASIC_MODES;
  101. RECORD_ACCESS.contains[1].contains = BASIC_MODES;
  102. var PARAMS = {
  103. className: 'params',
  104. begin: '\\(', end: '\\)',
  105. contains: BASIC_MODES
  106. };
  107. return {
  108. name: 'Erlang',
  109. aliases: ['erl'],
  110. keywords: ERLANG_RESERVED,
  111. illegal: '(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))',
  112. contains: [
  113. {
  114. className: 'function',
  115. begin: '^' + BASIC_ATOM_RE + '\\s*\\(', end: '->',
  116. returnBegin: true,
  117. illegal: '\\(|#|//|/\\*|\\\\|:|;',
  118. contains: [
  119. PARAMS,
  120. hljs.inherit(hljs.TITLE_MODE, {begin: BASIC_ATOM_RE})
  121. ],
  122. starts: {
  123. end: ';|\\.',
  124. keywords: ERLANG_RESERVED,
  125. contains: BASIC_MODES
  126. }
  127. },
  128. COMMENT,
  129. {
  130. begin: '^-', end: '\\.',
  131. relevance: 0,
  132. excludeEnd: true,
  133. returnBegin: true,
  134. keywords: {
  135. $pattern: '-' + hljs.IDENT_RE,
  136. keyword: '-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn ' +
  137. '-import -include -include_lib -compile -define -else -endif -file -behaviour ' +
  138. '-behavior -spec'
  139. },
  140. contains: [PARAMS]
  141. },
  142. NUMBER,
  143. hljs.QUOTE_STRING_MODE,
  144. RECORD_ACCESS,
  145. VAR1, VAR2,
  146. TUPLE,
  147. {begin: /\.$/} // relevance booster
  148. ]
  149. };
  150. }
  151. module.exports = erlang;