erlang.js 3.7 KB

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