oberon07.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. CodeMirror.defineMode("oberon07", function() {
  2. /**
  3. * Possible styles:
  4. *
  5. * keyword * atom * number * def
  6. * variable * variable-2 * variable-3 * property
  7. * operator * comment * string * string-2
  8. * meta * error * qualifier * builtin
  9. * bracket * tag * attribute * header
  10. * quote * hr * link
  11. *
  12. * OR & ~ < logic operator
  13. * + - * / DIV MOD < arithmetic operator
  14. * = # < > IS IN < relation operator
  15. */
  16. var DEF = 'def',
  17. ATOM = 'atom',
  18. CHAR = 'string-2',
  19. META = 'meta',
  20. IDENT = 'variable',
  21. ERROR = 'error',
  22. STRING = 'string',
  23. COMMENT = 'comment',
  24. BRACKET = 'bracket',
  25. KEYWORD = 'keyword',
  26. OPERATOR = 'operator',
  27. QUALIFIER = 'qualifier',
  28. _words = {
  29. 'ABS' : DEF, 'ASR' : DEF, 'ASSERT': DEF,
  30. 'CHR' : DEF, 'COPY' : DEF, 'DEC' : DEF,
  31. 'EXCL': DEF, 'FLOOR': DEF, 'FLT' : DEF,
  32. 'INC' : DEF, 'INCL' : DEF, 'LEN' : DEF,
  33. 'LSL' : DEF, 'LONG' : DEF, 'NEW' : DEF,
  34. 'ODD' : DEF, 'ORD' : DEF, 'PACK' : DEF,
  35. 'ROR' : DEF, 'SHORT': DEF, 'UNPK' : DEF,
  36. 'BOOLEAN' : ATOM, 'CHAR': ATOM, 'INTEGER': ATOM,
  37. 'LONGREAL': ATOM, 'REAL': ATOM, 'SET' : ATOM,
  38. 'ADR': META, 'SIZE': META, 'BIT': META,
  39. 'GET': META, 'PUT' : META,
  40. 'ARRAY' : KEYWORD, 'BEGIN' : KEYWORD,
  41. 'BY' : KEYWORD, 'CASE' : KEYWORD,
  42. 'CONST' : KEYWORD, 'DO' : KEYWORD,
  43. 'ELSE' : KEYWORD, 'ELSIF' : KEYWORD,
  44. 'END' : KEYWORD, 'FALSE' : KEYWORD,
  45. 'FOR' : KEYWORD, 'IF' : KEYWORD,
  46. 'IMPORT' : KEYWORD, 'MODULE' : KEYWORD,
  47. 'NIL' : KEYWORD, 'OF' : KEYWORD,
  48. 'POINTER' : KEYWORD, 'PROCEDURE': KEYWORD,
  49. 'RECORD' : KEYWORD, 'REPEAT' : KEYWORD,
  50. 'RETURN' : KEYWORD, 'THEN' : KEYWORD,
  51. 'TO' : KEYWORD, 'TRUE' : KEYWORD,
  52. 'TYPE' : KEYWORD, 'UNTIL' : KEYWORD,
  53. 'VAR' : KEYWORD, 'WHILE' : KEYWORD,
  54. 'DIV': OPERATOR, 'IN' : OPERATOR, 'IS' : OPERATOR,
  55. 'MOD': OPERATOR, 'OR' : OPERATOR
  56. };
  57. _alphaREX = /[a-zA-Z_]/,
  58. _alphaDigitREX = /[0-9a-zA-Z_]/,
  59. _isAlpha = function (ch) {
  60. return _alphaREX.test(ch);
  61. },
  62. _isAlphaOrDigit = function (ch) {
  63. return _alphaDigitREX.test(ch);
  64. },
  65. _startState = function () {
  66. return {
  67. stack: [],
  68. state: null,
  69. ch: null,
  70. scope: 0,
  71. level: 0,
  72. error: null,
  73. name: null,
  74. };
  75. },
  76. _token = function (stream, state) {
  77. var _state = state.state;
  78. _ident = function (sym) {
  79. var _token = IDENT,
  80. _str = sym,
  81. _ch = stream.next();
  82. while (_ch && _isAlphaOrDigit(_ch) && !stream.eol()) {
  83. _str += _ch;
  84. _ch = stream.next();
  85. }
  86. state.name = _str;
  87. if (_ch === '.' || _ch === '[') {
  88. _token = QUALIFIER;
  89. }
  90. if (_words[_str]) {
  91. _token = _words[_str];
  92. }
  93. if (!stream.eol()) {
  94. stream.backUp(1);
  95. }
  96. return _token;
  97. },
  98. _number = function () {},
  99. _string = function (sym) {
  100. var _str,
  101. _ch = stream.next();
  102. while (_ch && _ch != sym && !stream.eol()) {
  103. _str += _ch;
  104. _ch = stream.next();
  105. }
  106. if (stream.eol()) {
  107. state.error = 'string.not.close';
  108. return ERROR;
  109. }
  110. state.name = _str;
  111. return STRING;
  112. },
  113. _comment = function () {
  114. var mode = '?',
  115. _ch;
  116. while (state.level > 0 && !stream.eol()) {
  117. _ch = stream.next();
  118. switch (_ch) {
  119. case '(':
  120. mode = '(';
  121. break;
  122. case '*':
  123. if (mode === '(') {
  124. state.level += 1;
  125. }
  126. mode = '*';
  127. break;
  128. case ')':
  129. if (mode === '*') {
  130. state.level -= 1;
  131. }
  132. mode = ')';
  133. break;
  134. default:
  135. mode = '?';
  136. }
  137. }
  138. return COMMENT;
  139. },
  140. _ch = stream.next();
  141. if (state.level > 0) {
  142. return _comment();
  143. }
  144. if (_isAlpha(_ch)) {
  145. return _ident(_ch);
  146. }
  147. switch (_ch) {
  148. case '"':
  149. case "'":
  150. return _string(_ch);
  151. case '[':
  152. case ']':
  153. case '{':
  154. case '}':
  155. case ')':
  156. return BRACKET;
  157. case '(':
  158. if (stream.peek() === '*') {
  159. state.level += 1;
  160. return _comment();
  161. }
  162. return BRACKET;
  163. case ':':
  164. if (stream.peek() === '=') {
  165. _ch = stream.next();
  166. return KEYWORD;
  167. }
  168. return OPERATOR;
  169. case '<':
  170. case '>':
  171. case '#':
  172. case '&':
  173. case '+':
  174. case '-':
  175. case '*':
  176. case '/':
  177. case '~':
  178. case '|':
  179. case '^':
  180. case ',':
  181. case ';':
  182. return OPERATOR;
  183. }
  184. return null;
  185. };
  186. // Interface
  187. return {
  188. startState: _startState,
  189. token: _token,
  190. electricChars: null
  191. };
  192. });
  193. CodeMirror.defineMIME("text/x-oberon07", "oberon07");