lexer.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.lexer = exports.states = void 0;
  7. const moo_1 = __importDefault(require("moo"));
  8. exports.states = {
  9. body: {
  10. doubleapos: { match: "''", value: () => "'" },
  11. quoted: {
  12. lineBreaks: true,
  13. match: /'[{}#](?:[^]*?[^'])?'(?!')/u,
  14. value: src => src.slice(1, -1).replace(/''/g, "'")
  15. },
  16. argument: {
  17. lineBreaks: true,
  18. match: /\{\s*[^\p{Pat_Syn}\p{Pat_WS}]+\s*/u,
  19. push: 'arg',
  20. value: src => src.substring(1).trim()
  21. },
  22. octothorpe: '#',
  23. end: { match: '}', pop: 1 },
  24. content: { lineBreaks: true, match: /[^][^{}#']*/u }
  25. },
  26. arg: {
  27. select: {
  28. lineBreaks: true,
  29. match: /,\s*(?:plural|select|selectordinal)\s*,\s*/u,
  30. next: 'select',
  31. value: src => src.split(',')[1].trim()
  32. },
  33. 'func-args': {
  34. lineBreaks: true,
  35. match: /,\s*[^\p{Pat_Syn}\p{Pat_WS}]+\s*,/u,
  36. next: 'body',
  37. value: src => src.split(',')[1].trim()
  38. },
  39. 'func-simple': {
  40. lineBreaks: true,
  41. match: /,\s*[^\p{Pat_Syn}\p{Pat_WS}]+\s*/u,
  42. value: src => src.substring(1).trim()
  43. },
  44. end: { match: '}', pop: 1 }
  45. },
  46. select: {
  47. offset: {
  48. lineBreaks: true,
  49. match: /\s*offset\s*:\s*\d+\s*/u,
  50. value: src => src.split(':')[1].trim()
  51. },
  52. case: {
  53. lineBreaks: true,
  54. match: /\s*(?:=\d+|[^\p{Pat_Syn}\p{Pat_WS}]+)\s*\{/u,
  55. push: 'body',
  56. value: src => src.substring(0, src.indexOf('{')).trim()
  57. },
  58. end: { match: /\s*\}/u, pop: 1 }
  59. }
  60. };
  61. exports.lexer = moo_1.default.states(exports.states);