Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. 'use strict'
  2.  
  3. const query = "& (= a 'test') (= b 'test')"
  4. const query2 = "and(equals(a, 'test'), equals(b, 'test'))"
  5.  
  6. function parseTokens1 (tokens) {
  7. let i = 0
  8.  
  9. let block = 'exprLeft'
  10. let stack = []
  11. let cur = {}
  12.  
  13. function unexpectedType (expected) {
  14. throw new TypeError(`Unexpected type ${tokens[i].type} at ${i}, expecetd ${expected}`)
  15. }
  16.  
  17. while (tokens[i]) {
  18. const t = tokens[i]
  19.  
  20. switch (block) {
  21. case 'exprLeft': {
  22. switch (t.type) {
  23. case 'and':
  24. case 'equal': {
  25. cur.op = t.type
  26. block = 'exprMiddle'
  27. i++
  28. break
  29. }
  30. default: {
  31. unexpectedType('and or equal')
  32. }
  33. }
  34.  
  35. break
  36. }
  37. case 'exprMiddle': {
  38. switch (t.type) {
  39. case 'parensOpen': {
  40. stack.push([cur, 'exprRight'])
  41. cur = cur.expr1 = {}
  42. block = 'exprLeft'
  43. i++
  44. break
  45. }
  46. case 'literal': {
  47. cur.expr1 = t.value
  48. i++
  49. break
  50. }
  51. default: {
  52. unexpectedType('parsensOpen or literal')
  53. }
  54. }
  55.  
  56. break
  57. }
  58. case 'exprRight': {
  59. switch (t.type) {
  60. case 'parensOpen': {
  61. stack.push([cur, 'exprEnd'])
  62. cur = cur.expr2 = {}
  63. block = 'exprLeft'
  64. i++
  65. break
  66. }
  67. case 'string': {
  68. cur.expr2 = t.value
  69. block = 'exprEnd'
  70. i++
  71. break
  72. }
  73. default: {
  74. unexpectedType('parsensOpen or string')
  75. }
  76. }
  77.  
  78. break
  79. }
  80. case 'exprEnd': {
  81. switch (t.type) {
  82. case 'parensClose': {
  83. if (stack.length) {
  84. [cur, block] = stack.pop()
  85. i++
  86. } else {
  87. unexpectedType('(nothing in stack)')
  88. }
  89. break
  90. }
  91. default: {
  92. unexpectedType('parensClose')
  93. }
  94. }
  95.  
  96. break
  97. }
  98. default: {
  99. throw new TypeError(block)
  100. }
  101. }
  102. }
  103. }
  104.  
  105. const specialNames = ['and', 'equals']
  106. function parseTokens2 (tokens) {
  107. let i = 0
  108.  
  109. let block = 'exprLeft'
  110. let stack = []
  111. let cur = {op: false, expr1: 'arql'}
  112.  
  113. function unexpectedType (expected) {
  114. throw new TypeError(`Unexpected type ${tokens[i].type} at ${i}, expecetd ${expected}`)
  115. }
  116.  
  117. while (tokens[i]) {
  118. const t = tokens[i]
  119.  
  120. switch (block) {
  121. case 'opNameOrVar': {
  122. if (t.type !== 'literal') { unexpectedType('literal') }
  123.  
  124. const name = t.value
  125. if (specialNames.indexOf(name) === -1 && !cur.op) { unexpectedType('literal with special name') }
  126.  
  127. if (specialNames.indexOf(name) === -1) {
  128. let newCur = {op: name}
  129. if (cur.expr1) {
  130. stack.push([cur, 'end'])
  131. cur = cur.expr2 = newCur
  132. } else {
  133. stack.push([cur, 'comma'])
  134. cur = cur.expr1 = newCur
  135. }
  136. } else {
  137. if (!cur.expr1) {
  138. cur.expr1 = name
  139. block = 'comma'
  140. } else {
  141. unexpectedType('non-special literal')
  142. }
  143. }
  144. i++
  145.  
  146. break
  147. }
  148. case 'comma': {
  149. if (t.type === 'comma') {
  150. block = 'value'
  151. i++
  152. } else {
  153. unexpectedType('comma')
  154. }
  155.  
  156. break
  157. }
  158. case 'value': {
  159. if (t.type === 'string') {
  160. cur.expr2 = t.value
  161. } else {
  162. unexpectedType('string')
  163. }
  164.  
  165. break
  166. }
  167.  
  168. case 'end': {
  169. if (t.type === 'parensClose') {
  170. if (stack.length) {
  171. [cur, block] = stack.pop()
  172. i++
  173. } else {
  174. unexpectedType('(nothing in stack)')
  175. }
  176. } else {
  177. unexpectedType('parensClose')
  178. }
  179.  
  180. break
  181. }
  182. default: {
  183. throw new TypeError(block)
  184. }
  185. }
  186. }
  187.  
  188. return cur.expr2
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement