lexon.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import type { languages } from '../fillers/monaco-editor-core';
  6. export const conf: languages.LanguageConfiguration = {
  7. comments: {
  8. lineComment: 'COMMENT'
  9. // blockComment: ['COMMENT', '.'],
  10. },
  11. brackets: [['(', ')']],
  12. autoClosingPairs: [
  13. { open: '{', close: '}' },
  14. { open: '[', close: ']' },
  15. { open: '(', close: ')' },
  16. { open: '"', close: '"' },
  17. { open: ':', close: '.' }
  18. ],
  19. surroundingPairs: [
  20. { open: '{', close: '}' },
  21. { open: '[', close: ']' },
  22. { open: '(', close: ')' },
  23. { open: '`', close: '`' },
  24. { open: '"', close: '"' },
  25. { open: "'", close: "'" },
  26. { open: ':', close: '.' }
  27. ],
  28. folding: {
  29. markers: {
  30. start: new RegExp('^\\s*(::\\s*|COMMENT\\s+)#region'),
  31. end: new RegExp('^\\s*(::\\s*|COMMENT\\s+)#endregion')
  32. }
  33. }
  34. };
  35. export const language = <languages.IMonarchLanguage>{
  36. // Set defaultToken to invalid to see what you do not tokenize yet
  37. // defaultToken: 'invalid',
  38. tokenPostfix: '.lexon',
  39. ignoreCase: true,
  40. keywords: [
  41. 'lexon',
  42. 'lex',
  43. 'clause',
  44. 'terms',
  45. 'contracts',
  46. 'may',
  47. 'pay',
  48. 'pays',
  49. 'appoints',
  50. 'into',
  51. 'to'
  52. ],
  53. typeKeywords: ['amount', 'person', 'key', 'time', 'date', 'asset', 'text'],
  54. operators: [
  55. 'less',
  56. 'greater',
  57. 'equal',
  58. 'le',
  59. 'gt',
  60. 'or',
  61. 'and',
  62. 'add',
  63. 'added',
  64. 'subtract',
  65. 'subtracted',
  66. 'multiply',
  67. 'multiplied',
  68. 'times',
  69. 'divide',
  70. 'divided',
  71. 'is',
  72. 'be',
  73. 'certified'
  74. ],
  75. // we include these common regular expressions
  76. symbols: /[=><!~?:&|+\-*\/\^%]+/,
  77. // The main tokenizer for our languages
  78. tokenizer: {
  79. root: [
  80. // comment
  81. [/^(\s*)(comment:?(?:\s.*|))$/, ['', 'comment']],
  82. // special identifier cases
  83. [
  84. /"/,
  85. {
  86. token: 'identifier.quote',
  87. bracket: '@open',
  88. next: '@quoted_identifier'
  89. }
  90. ],
  91. [
  92. 'LEX$',
  93. {
  94. token: 'keyword',
  95. bracket: '@open',
  96. next: '@identifier_until_period'
  97. }
  98. ],
  99. ['LEXON', { token: 'keyword', bracket: '@open', next: '@semver' }],
  100. [
  101. ':',
  102. {
  103. token: 'delimiter',
  104. bracket: '@open',
  105. next: '@identifier_until_period'
  106. }
  107. ],
  108. // identifiers and keywords
  109. [
  110. /[a-z_$][\w$]*/,
  111. {
  112. cases: {
  113. '@operators': 'operator',
  114. '@typeKeywords': 'keyword.type',
  115. '@keywords': 'keyword',
  116. '@default': 'identifier'
  117. }
  118. }
  119. ],
  120. // whitespace
  121. { include: '@whitespace' },
  122. // delimiters and operators
  123. [/[{}()\[\]]/, '@brackets'],
  124. [/[<>](?!@symbols)/, '@brackets'],
  125. [/@symbols/, 'delimiter'],
  126. // numbers
  127. [/\d*\.\d*\.\d*/, 'number.semver'],
  128. [/\d*\.\d+([eE][\-+]?\d+)?/, 'number.float'],
  129. [/0[xX][0-9a-fA-F]+/, 'number.hex'],
  130. [/\d+/, 'number'],
  131. // delimiter: after number because of .\d floats
  132. [/[;,.]/, 'delimiter']
  133. ],
  134. quoted_identifier: [
  135. [/[^\\"]+/, 'identifier'],
  136. [/"/, { token: 'identifier.quote', bracket: '@close', next: '@pop' }]
  137. ],
  138. space_identifier_until_period: [
  139. [':', 'delimiter'],
  140. [' ', { token: 'white', next: '@identifier_rest' }]
  141. ],
  142. identifier_until_period: [
  143. { include: '@whitespace' },
  144. [':', { token: 'delimiter', next: '@identifier_rest' }],
  145. [/[^\\.]+/, 'identifier'],
  146. [/\./, { token: 'delimiter', bracket: '@close', next: '@pop' }]
  147. ],
  148. identifier_rest: [
  149. [/[^\\.]+/, 'identifier'],
  150. [/\./, { token: 'delimiter', bracket: '@close', next: '@pop' }]
  151. ],
  152. semver: [
  153. { include: '@whitespace' },
  154. [':', 'delimiter'],
  155. [/\d*\.\d*\.\d*/, { token: 'number.semver', bracket: '@close', next: '@pop' }]
  156. ],
  157. whitespace: [[/[ \t\r\n]+/, 'white']]
  158. }
  159. };