lexon.js 4.8 KB

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