relationExpressionParser.pegjs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. start =
  2. expr:expression {
  3. let node = { $name: null, $relation: null, $modify: [], $recursive: false, $allRecursive: false };
  4. if (expr.$name === '*') {
  5. node.$allRecursive = true;
  6. } else {
  7. node[expr.$name] = expr;
  8. }
  9. return node;
  10. }
  11. /
  12. list:listExpression {
  13. let node = { $name: null, $relation: null, $modify: [], $recursive: false, $allRecursive: false };
  14. list.forEach(expr => {
  15. node[expr.$name] = expr;
  16. });
  17. return node;
  18. }
  19. expression =
  20. name:name args:args? alias:alias? list:subListExpression {
  21. let node = { $name: alias || name, $relation: name, $modify: args || [], $recursive: false, $allRecursive: false };
  22. list.forEach(expr => {
  23. node[expr.$name] = expr;
  24. });
  25. return node;
  26. }
  27. /
  28. name:name args:args? alias:alias? expr:subExpression? {
  29. let node = { $name: alias || name, $relation: name, $modify: args || [], $recursive: false, $allRecursive: false };
  30. if (expr) {
  31. const match = /^\^(\d*)$/.exec(expr.$name);
  32. if (match) {
  33. if (match[1]) {
  34. node.$recursive = parseInt(match[1], 10);
  35. } else {
  36. node.$recursive = true;
  37. }
  38. } else if (expr.$name === '*') {
  39. node.$allRecursive = true;
  40. } else {
  41. node[expr.$name] = expr;
  42. }
  43. }
  44. return node;
  45. }
  46. alias =
  47. ws+ "as" ws+ alias:name {
  48. return alias;
  49. }
  50. name =
  51. name:char+ {
  52. return name.join('');
  53. }
  54. char =
  55. [^\[\]\(\),\. \t\r\n]
  56. args =
  57. ws* "(" args:argListItem* ws* ")" {
  58. return args;
  59. }
  60. argListItem =
  61. ws* arg:name ws* ","? {
  62. return arg;
  63. }
  64. ws =
  65. [ \t\r\n]
  66. subListExpression =
  67. ws* "." list:listExpression {
  68. return list;
  69. }
  70. listExpression =
  71. ws* "[" items:listExpressionItem* ws* "]" ws* {
  72. return items;
  73. }
  74. listExpressionItem =
  75. ws* expr:expression ws* ","? {
  76. return expr;
  77. }
  78. subExpression =
  79. ws* "." ws* sub:expression ws* {
  80. return sub;
  81. }