You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1668 lines
35 KiB

new events package query parser use parser compiler to generate query parser I used https://github.com/pointlander/peg which has a nice API and seems to be the most popular Golang compiler parser using PEG on Github. More about PEG: - https://en.wikipedia.org/wiki/Parsing_expression_grammar - https://github.com/PhilippeSigaud/Pegged/wiki/PEG-Basics - https://github.com/PhilippeSigaud/Pegged/wiki/Grammar-Examples rename implement query match function match function uncomment test lines add more test cases for query#Matches fix int case rename events to pubsub add comment about cache assertReceive helper to not block on receive in tests fix bug with multiple conditions uncomment benchmark first results: ``` Benchmark10Clients-2 1000 1305493 ns/op 3957519 B/op 355 allocs/op Benchmark100Clients-2 100 12278304 ns/op 39571751 B/op 3505 allocs/op Benchmark1000Clients-2 10 124120909 ns/op 395714004 B/op 35005 allocs/op ``` 124ms to publish message to 1000 clients. A lot. use AST from query.peg.go separate pubsub and query packages by using Query interface in pubsub wrote docs and refactor code updates from Frey's review refactor type assertion to use type switch cleanup during shutdown subscriber should create output channel, not the server overflow strategies, server buffer capacity context as the first argument for Publish log error introduce Option type update NewServer comment move helpers into pubsub_test increase assertReceive timeout add query.MustParse add more false tests for parser add more false tests for query.Matches parse numbers as int64 / float64 try our best to convert from other types add number to panic output add more comments save commit introduce client argument as first argument to Subscribe > Why we do not specify buffer size on the output channel in Subscribe? The choice of buffer size of N here depends on knowing the number of messages server will receive and the number of messages downstream subscribers will consume. This is fragile: if we publish an additional message, or if one of the downstream subscribers reads any fewer messages, we will again have blocked goroutines. save commit remove reference counting fix test test client resubscribe test UnsubscribeAll client options [pubsub/query] fuzzy testing do not print msg as it creates data race!
7 years ago
  1. package query
  2. import (
  3. "fmt"
  4. "math"
  5. "sort"
  6. "strconv"
  7. )
  8. const endSymbol rune = 1114112
  9. /* The rule types inferred from the grammar are below. */
  10. type pegRule uint8
  11. const (
  12. ruleUnknown pegRule = iota
  13. rulee
  14. rulecondition
  15. ruletag
  16. rulevalue
  17. rulenumber
  18. ruledigit
  19. ruletime
  20. ruledate
  21. ruleyear
  22. rulemonth
  23. ruleday
  24. ruleand
  25. ruleequal
  26. rulecontains
  27. rulele
  28. rulege
  29. rulel
  30. ruleg
  31. rulePegText
  32. )
  33. var rul3s = [...]string{
  34. "Unknown",
  35. "e",
  36. "condition",
  37. "tag",
  38. "value",
  39. "number",
  40. "digit",
  41. "time",
  42. "date",
  43. "year",
  44. "month",
  45. "day",
  46. "and",
  47. "equal",
  48. "contains",
  49. "le",
  50. "ge",
  51. "l",
  52. "g",
  53. "PegText",
  54. }
  55. type token32 struct {
  56. pegRule
  57. begin, end uint32
  58. }
  59. func (t *token32) String() string {
  60. return fmt.Sprintf("\x1B[34m%v\x1B[m %v %v", rul3s[t.pegRule], t.begin, t.end)
  61. }
  62. type node32 struct {
  63. token32
  64. up, next *node32
  65. }
  66. func (node *node32) print(pretty bool, buffer string) {
  67. var print func(node *node32, depth int)
  68. print = func(node *node32, depth int) {
  69. for node != nil {
  70. for c := 0; c < depth; c++ {
  71. fmt.Printf(" ")
  72. }
  73. rule := rul3s[node.pegRule]
  74. quote := strconv.Quote(string(([]rune(buffer)[node.begin:node.end])))
  75. if !pretty {
  76. fmt.Printf("%v %v\n", rule, quote)
  77. } else {
  78. fmt.Printf("\x1B[34m%v\x1B[m %v\n", rule, quote)
  79. }
  80. if node.up != nil {
  81. print(node.up, depth+1)
  82. }
  83. node = node.next
  84. }
  85. }
  86. print(node, 0)
  87. }
  88. func (node *node32) Print(buffer string) {
  89. node.print(false, buffer)
  90. }
  91. func (node *node32) PrettyPrint(buffer string) {
  92. node.print(true, buffer)
  93. }
  94. type tokens32 struct {
  95. tree []token32
  96. }
  97. func (t *tokens32) Trim(length uint32) {
  98. t.tree = t.tree[:length]
  99. }
  100. func (t *tokens32) Print() {
  101. for _, token := range t.tree {
  102. fmt.Println(token.String())
  103. }
  104. }
  105. func (t *tokens32) AST() *node32 {
  106. type element struct {
  107. node *node32
  108. down *element
  109. }
  110. tokens := t.Tokens()
  111. var stack *element
  112. for _, token := range tokens {
  113. if token.begin == token.end {
  114. continue
  115. }
  116. node := &node32{token32: token}
  117. for stack != nil && stack.node.begin >= token.begin && stack.node.end <= token.end {
  118. stack.node.next = node.up
  119. node.up = stack.node
  120. stack = stack.down
  121. }
  122. stack = &element{node: node, down: stack}
  123. }
  124. if stack != nil {
  125. return stack.node
  126. }
  127. return nil
  128. }
  129. func (t *tokens32) PrintSyntaxTree(buffer string) {
  130. t.AST().Print(buffer)
  131. }
  132. func (t *tokens32) PrettyPrintSyntaxTree(buffer string) {
  133. t.AST().PrettyPrint(buffer)
  134. }
  135. func (t *tokens32) Add(rule pegRule, begin, end, index uint32) {
  136. if tree := t.tree; int(index) >= len(tree) {
  137. expanded := make([]token32, 2*len(tree))
  138. copy(expanded, tree)
  139. t.tree = expanded
  140. }
  141. t.tree[index] = token32{
  142. pegRule: rule,
  143. begin: begin,
  144. end: end,
  145. }
  146. }
  147. func (t *tokens32) Tokens() []token32 {
  148. return t.tree
  149. }
  150. type QueryParser struct {
  151. Buffer string
  152. buffer []rune
  153. rules [20]func() bool
  154. parse func(rule ...int) error
  155. reset func()
  156. Pretty bool
  157. tokens32
  158. }
  159. func (p *QueryParser) Parse(rule ...int) error {
  160. return p.parse(rule...)
  161. }
  162. func (p *QueryParser) Reset() {
  163. p.reset()
  164. }
  165. type textPosition struct {
  166. line, symbol int
  167. }
  168. type textPositionMap map[int]textPosition
  169. func translatePositions(buffer []rune, positions []int) textPositionMap {
  170. length, translations, j, line, symbol := len(positions), make(textPositionMap, len(positions)), 0, 1, 0
  171. sort.Ints(positions)
  172. search:
  173. for i, c := range buffer {
  174. if c == '\n' {
  175. line, symbol = line+1, 0
  176. } else {
  177. symbol++
  178. }
  179. if i == positions[j] {
  180. translations[positions[j]] = textPosition{line, symbol}
  181. for j++; j < length; j++ {
  182. if i != positions[j] {
  183. continue search
  184. }
  185. }
  186. break search
  187. }
  188. }
  189. return translations
  190. }
  191. type parseError struct {
  192. p *QueryParser
  193. max token32
  194. }
  195. func (e *parseError) Error() string {
  196. tokens, error := []token32{e.max}, "\n"
  197. positions, p := make([]int, 2*len(tokens)), 0
  198. for _, token := range tokens {
  199. positions[p], p = int(token.begin), p+1
  200. positions[p], p = int(token.end), p+1
  201. }
  202. translations := translatePositions(e.p.buffer, positions)
  203. format := "parse error near %v (line %v symbol %v - line %v symbol %v):\n%v\n"
  204. if e.p.Pretty {
  205. format = "parse error near \x1B[34m%v\x1B[m (line %v symbol %v - line %v symbol %v):\n%v\n"
  206. }
  207. for _, token := range tokens {
  208. begin, end := int(token.begin), int(token.end)
  209. error += fmt.Sprintf(format,
  210. rul3s[token.pegRule],
  211. translations[begin].line, translations[begin].symbol,
  212. translations[end].line, translations[end].symbol,
  213. strconv.Quote(string(e.p.buffer[begin:end])))
  214. }
  215. return error
  216. }
  217. func (p *QueryParser) PrintSyntaxTree() {
  218. if p.Pretty {
  219. p.tokens32.PrettyPrintSyntaxTree(p.Buffer)
  220. } else {
  221. p.tokens32.PrintSyntaxTree(p.Buffer)
  222. }
  223. }
  224. func (p *QueryParser) Init() {
  225. var (
  226. max token32
  227. position, tokenIndex uint32
  228. buffer []rune
  229. )
  230. p.reset = func() {
  231. max = token32{}
  232. position, tokenIndex = 0, 0
  233. p.buffer = []rune(p.Buffer)
  234. if len(p.buffer) == 0 || p.buffer[len(p.buffer)-1] != endSymbol {
  235. p.buffer = append(p.buffer, endSymbol)
  236. }
  237. buffer = p.buffer
  238. }
  239. p.reset()
  240. _rules := p.rules
  241. tree := tokens32{tree: make([]token32, math.MaxInt16)}
  242. p.parse = func(rule ...int) error {
  243. r := 1
  244. if len(rule) > 0 {
  245. r = rule[0]
  246. }
  247. matches := p.rules[r]()
  248. p.tokens32 = tree
  249. if matches {
  250. p.Trim(tokenIndex)
  251. return nil
  252. }
  253. return &parseError{p, max}
  254. }
  255. add := func(rule pegRule, begin uint32) {
  256. tree.Add(rule, begin, position, tokenIndex)
  257. tokenIndex++
  258. if begin != position && position > max.end {
  259. max = token32{rule, begin, position}
  260. }
  261. }
  262. matchDot := func() bool {
  263. if buffer[position] != endSymbol {
  264. position++
  265. return true
  266. }
  267. return false
  268. }
  269. /*matchChar := func(c byte) bool {
  270. if buffer[position] == c {
  271. position++
  272. return true
  273. }
  274. return false
  275. }*/
  276. /*matchRange := func(lower byte, upper byte) bool {
  277. if c := buffer[position]; c >= lower && c <= upper {
  278. position++
  279. return true
  280. }
  281. return false
  282. }*/
  283. _rules = [...]func() bool{
  284. nil,
  285. /* 0 e <- <('"' condition (' '+ and ' '+ condition)* '"' !.)> */
  286. func() bool {
  287. position0, tokenIndex0 := position, tokenIndex
  288. {
  289. position1 := position
  290. if buffer[position] != rune('"') {
  291. goto l0
  292. }
  293. position++
  294. if !_rules[rulecondition]() {
  295. goto l0
  296. }
  297. l2:
  298. {
  299. position3, tokenIndex3 := position, tokenIndex
  300. if buffer[position] != rune(' ') {
  301. goto l3
  302. }
  303. position++
  304. l4:
  305. {
  306. position5, tokenIndex5 := position, tokenIndex
  307. if buffer[position] != rune(' ') {
  308. goto l5
  309. }
  310. position++
  311. goto l4
  312. l5:
  313. position, tokenIndex = position5, tokenIndex5
  314. }
  315. {
  316. position6 := position
  317. {
  318. position7, tokenIndex7 := position, tokenIndex
  319. if buffer[position] != rune('a') {
  320. goto l8
  321. }
  322. position++
  323. goto l7
  324. l8:
  325. position, tokenIndex = position7, tokenIndex7
  326. if buffer[position] != rune('A') {
  327. goto l3
  328. }
  329. position++
  330. }
  331. l7:
  332. {
  333. position9, tokenIndex9 := position, tokenIndex
  334. if buffer[position] != rune('n') {
  335. goto l10
  336. }
  337. position++
  338. goto l9
  339. l10:
  340. position, tokenIndex = position9, tokenIndex9
  341. if buffer[position] != rune('N') {
  342. goto l3
  343. }
  344. position++
  345. }
  346. l9:
  347. {
  348. position11, tokenIndex11 := position, tokenIndex
  349. if buffer[position] != rune('d') {
  350. goto l12
  351. }
  352. position++
  353. goto l11
  354. l12:
  355. position, tokenIndex = position11, tokenIndex11
  356. if buffer[position] != rune('D') {
  357. goto l3
  358. }
  359. position++
  360. }
  361. l11:
  362. add(ruleand, position6)
  363. }
  364. if buffer[position] != rune(' ') {
  365. goto l3
  366. }
  367. position++
  368. l13:
  369. {
  370. position14, tokenIndex14 := position, tokenIndex
  371. if buffer[position] != rune(' ') {
  372. goto l14
  373. }
  374. position++
  375. goto l13
  376. l14:
  377. position, tokenIndex = position14, tokenIndex14
  378. }
  379. if !_rules[rulecondition]() {
  380. goto l3
  381. }
  382. goto l2
  383. l3:
  384. position, tokenIndex = position3, tokenIndex3
  385. }
  386. if buffer[position] != rune('"') {
  387. goto l0
  388. }
  389. position++
  390. {
  391. position15, tokenIndex15 := position, tokenIndex
  392. if !matchDot() {
  393. goto l15
  394. }
  395. goto l0
  396. l15:
  397. position, tokenIndex = position15, tokenIndex15
  398. }
  399. add(rulee, position1)
  400. }
  401. return true
  402. l0:
  403. position, tokenIndex = position0, tokenIndex0
  404. return false
  405. },
  406. /* 1 condition <- <(tag ' '* ((le ' '* ((&('D' | 'd') date) | (&('T' | 't') time) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') number))) / (ge ' '* ((&('D' | 'd') date) | (&('T' | 't') time) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') number))) / ((&('=') (equal ' '* (number / time / date / value))) | (&('>') (g ' '* ((&('D' | 'd') date) | (&('T' | 't') time) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') number)))) | (&('<') (l ' '* ((&('D' | 'd') date) | (&('T' | 't') time) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') number)))) | (&('C' | 'c') (contains ' '* value)))))> */
  407. func() bool {
  408. position16, tokenIndex16 := position, tokenIndex
  409. {
  410. position17 := position
  411. {
  412. position18 := position
  413. {
  414. position19 := position
  415. {
  416. position22, tokenIndex22 := position, tokenIndex
  417. {
  418. switch buffer[position] {
  419. case '<':
  420. if buffer[position] != rune('<') {
  421. goto l22
  422. }
  423. position++
  424. break
  425. case '>':
  426. if buffer[position] != rune('>') {
  427. goto l22
  428. }
  429. position++
  430. break
  431. case '=':
  432. if buffer[position] != rune('=') {
  433. goto l22
  434. }
  435. position++
  436. break
  437. case '"':
  438. if buffer[position] != rune('"') {
  439. goto l22
  440. }
  441. position++
  442. break
  443. case ')':
  444. if buffer[position] != rune(')') {
  445. goto l22
  446. }
  447. position++
  448. break
  449. case '(':
  450. if buffer[position] != rune('(') {
  451. goto l22
  452. }
  453. position++
  454. break
  455. case '\\':
  456. if buffer[position] != rune('\\') {
  457. goto l22
  458. }
  459. position++
  460. break
  461. case '\r':
  462. if buffer[position] != rune('\r') {
  463. goto l22
  464. }
  465. position++
  466. break
  467. case '\n':
  468. if buffer[position] != rune('\n') {
  469. goto l22
  470. }
  471. position++
  472. break
  473. case '\t':
  474. if buffer[position] != rune('\t') {
  475. goto l22
  476. }
  477. position++
  478. break
  479. default:
  480. if buffer[position] != rune(' ') {
  481. goto l22
  482. }
  483. position++
  484. break
  485. }
  486. }
  487. goto l16
  488. l22:
  489. position, tokenIndex = position22, tokenIndex22
  490. }
  491. if !matchDot() {
  492. goto l16
  493. }
  494. l20:
  495. {
  496. position21, tokenIndex21 := position, tokenIndex
  497. {
  498. position24, tokenIndex24 := position, tokenIndex
  499. {
  500. switch buffer[position] {
  501. case '<':
  502. if buffer[position] != rune('<') {
  503. goto l24
  504. }
  505. position++
  506. break
  507. case '>':
  508. if buffer[position] != rune('>') {
  509. goto l24
  510. }
  511. position++
  512. break
  513. case '=':
  514. if buffer[position] != rune('=') {
  515. goto l24
  516. }
  517. position++
  518. break
  519. case '"':
  520. if buffer[position] != rune('"') {
  521. goto l24
  522. }
  523. position++
  524. break
  525. case ')':
  526. if buffer[position] != rune(')') {
  527. goto l24
  528. }
  529. position++
  530. break
  531. case '(':
  532. if buffer[position] != rune('(') {
  533. goto l24
  534. }
  535. position++
  536. break
  537. case '\\':
  538. if buffer[position] != rune('\\') {
  539. goto l24
  540. }
  541. position++
  542. break
  543. case '\r':
  544. if buffer[position] != rune('\r') {
  545. goto l24
  546. }
  547. position++
  548. break
  549. case '\n':
  550. if buffer[position] != rune('\n') {
  551. goto l24
  552. }
  553. position++
  554. break
  555. case '\t':
  556. if buffer[position] != rune('\t') {
  557. goto l24
  558. }
  559. position++
  560. break
  561. default:
  562. if buffer[position] != rune(' ') {
  563. goto l24
  564. }
  565. position++
  566. break
  567. }
  568. }
  569. goto l21
  570. l24:
  571. position, tokenIndex = position24, tokenIndex24
  572. }
  573. if !matchDot() {
  574. goto l21
  575. }
  576. goto l20
  577. l21:
  578. position, tokenIndex = position21, tokenIndex21
  579. }
  580. add(rulePegText, position19)
  581. }
  582. add(ruletag, position18)
  583. }
  584. l26:
  585. {
  586. position27, tokenIndex27 := position, tokenIndex
  587. if buffer[position] != rune(' ') {
  588. goto l27
  589. }
  590. position++
  591. goto l26
  592. l27:
  593. position, tokenIndex = position27, tokenIndex27
  594. }
  595. {
  596. position28, tokenIndex28 := position, tokenIndex
  597. {
  598. position30 := position
  599. if buffer[position] != rune('<') {
  600. goto l29
  601. }
  602. position++
  603. if buffer[position] != rune('=') {
  604. goto l29
  605. }
  606. position++
  607. add(rulele, position30)
  608. }
  609. l31:
  610. {
  611. position32, tokenIndex32 := position, tokenIndex
  612. if buffer[position] != rune(' ') {
  613. goto l32
  614. }
  615. position++
  616. goto l31
  617. l32:
  618. position, tokenIndex = position32, tokenIndex32
  619. }
  620. {
  621. switch buffer[position] {
  622. case 'D', 'd':
  623. if !_rules[ruledate]() {
  624. goto l29
  625. }
  626. break
  627. case 'T', 't':
  628. if !_rules[ruletime]() {
  629. goto l29
  630. }
  631. break
  632. default:
  633. if !_rules[rulenumber]() {
  634. goto l29
  635. }
  636. break
  637. }
  638. }
  639. goto l28
  640. l29:
  641. position, tokenIndex = position28, tokenIndex28
  642. {
  643. position35 := position
  644. if buffer[position] != rune('>') {
  645. goto l34
  646. }
  647. position++
  648. if buffer[position] != rune('=') {
  649. goto l34
  650. }
  651. position++
  652. add(rulege, position35)
  653. }
  654. l36:
  655. {
  656. position37, tokenIndex37 := position, tokenIndex
  657. if buffer[position] != rune(' ') {
  658. goto l37
  659. }
  660. position++
  661. goto l36
  662. l37:
  663. position, tokenIndex = position37, tokenIndex37
  664. }
  665. {
  666. switch buffer[position] {
  667. case 'D', 'd':
  668. if !_rules[ruledate]() {
  669. goto l34
  670. }
  671. break
  672. case 'T', 't':
  673. if !_rules[ruletime]() {
  674. goto l34
  675. }
  676. break
  677. default:
  678. if !_rules[rulenumber]() {
  679. goto l34
  680. }
  681. break
  682. }
  683. }
  684. goto l28
  685. l34:
  686. position, tokenIndex = position28, tokenIndex28
  687. {
  688. switch buffer[position] {
  689. case '=':
  690. {
  691. position40 := position
  692. if buffer[position] != rune('=') {
  693. goto l16
  694. }
  695. position++
  696. add(ruleequal, position40)
  697. }
  698. l41:
  699. {
  700. position42, tokenIndex42 := position, tokenIndex
  701. if buffer[position] != rune(' ') {
  702. goto l42
  703. }
  704. position++
  705. goto l41
  706. l42:
  707. position, tokenIndex = position42, tokenIndex42
  708. }
  709. {
  710. position43, tokenIndex43 := position, tokenIndex
  711. if !_rules[rulenumber]() {
  712. goto l44
  713. }
  714. goto l43
  715. l44:
  716. position, tokenIndex = position43, tokenIndex43
  717. if !_rules[ruletime]() {
  718. goto l45
  719. }
  720. goto l43
  721. l45:
  722. position, tokenIndex = position43, tokenIndex43
  723. if !_rules[ruledate]() {
  724. goto l46
  725. }
  726. goto l43
  727. l46:
  728. position, tokenIndex = position43, tokenIndex43
  729. if !_rules[rulevalue]() {
  730. goto l16
  731. }
  732. }
  733. l43:
  734. break
  735. case '>':
  736. {
  737. position47 := position
  738. if buffer[position] != rune('>') {
  739. goto l16
  740. }
  741. position++
  742. add(ruleg, position47)
  743. }
  744. l48:
  745. {
  746. position49, tokenIndex49 := position, tokenIndex
  747. if buffer[position] != rune(' ') {
  748. goto l49
  749. }
  750. position++
  751. goto l48
  752. l49:
  753. position, tokenIndex = position49, tokenIndex49
  754. }
  755. {
  756. switch buffer[position] {
  757. case 'D', 'd':
  758. if !_rules[ruledate]() {
  759. goto l16
  760. }
  761. break
  762. case 'T', 't':
  763. if !_rules[ruletime]() {
  764. goto l16
  765. }
  766. break
  767. default:
  768. if !_rules[rulenumber]() {
  769. goto l16
  770. }
  771. break
  772. }
  773. }
  774. break
  775. case '<':
  776. {
  777. position51 := position
  778. if buffer[position] != rune('<') {
  779. goto l16
  780. }
  781. position++
  782. add(rulel, position51)
  783. }
  784. l52:
  785. {
  786. position53, tokenIndex53 := position, tokenIndex
  787. if buffer[position] != rune(' ') {
  788. goto l53
  789. }
  790. position++
  791. goto l52
  792. l53:
  793. position, tokenIndex = position53, tokenIndex53
  794. }
  795. {
  796. switch buffer[position] {
  797. case 'D', 'd':
  798. if !_rules[ruledate]() {
  799. goto l16
  800. }
  801. break
  802. case 'T', 't':
  803. if !_rules[ruletime]() {
  804. goto l16
  805. }
  806. break
  807. default:
  808. if !_rules[rulenumber]() {
  809. goto l16
  810. }
  811. break
  812. }
  813. }
  814. break
  815. default:
  816. {
  817. position55 := position
  818. {
  819. position56, tokenIndex56 := position, tokenIndex
  820. if buffer[position] != rune('c') {
  821. goto l57
  822. }
  823. position++
  824. goto l56
  825. l57:
  826. position, tokenIndex = position56, tokenIndex56
  827. if buffer[position] != rune('C') {
  828. goto l16
  829. }
  830. position++
  831. }
  832. l56:
  833. {
  834. position58, tokenIndex58 := position, tokenIndex
  835. if buffer[position] != rune('o') {
  836. goto l59
  837. }
  838. position++
  839. goto l58
  840. l59:
  841. position, tokenIndex = position58, tokenIndex58
  842. if buffer[position] != rune('O') {
  843. goto l16
  844. }
  845. position++
  846. }
  847. l58:
  848. {
  849. position60, tokenIndex60 := position, tokenIndex
  850. if buffer[position] != rune('n') {
  851. goto l61
  852. }
  853. position++
  854. goto l60
  855. l61:
  856. position, tokenIndex = position60, tokenIndex60
  857. if buffer[position] != rune('N') {
  858. goto l16
  859. }
  860. position++
  861. }
  862. l60:
  863. {
  864. position62, tokenIndex62 := position, tokenIndex
  865. if buffer[position] != rune('t') {
  866. goto l63
  867. }
  868. position++
  869. goto l62
  870. l63:
  871. position, tokenIndex = position62, tokenIndex62
  872. if buffer[position] != rune('T') {
  873. goto l16
  874. }
  875. position++
  876. }
  877. l62:
  878. {
  879. position64, tokenIndex64 := position, tokenIndex
  880. if buffer[position] != rune('a') {
  881. goto l65
  882. }
  883. position++
  884. goto l64
  885. l65:
  886. position, tokenIndex = position64, tokenIndex64
  887. if buffer[position] != rune('A') {
  888. goto l16
  889. }
  890. position++
  891. }
  892. l64:
  893. {
  894. position66, tokenIndex66 := position, tokenIndex
  895. if buffer[position] != rune('i') {
  896. goto l67
  897. }
  898. position++
  899. goto l66
  900. l67:
  901. position, tokenIndex = position66, tokenIndex66
  902. if buffer[position] != rune('I') {
  903. goto l16
  904. }
  905. position++
  906. }
  907. l66:
  908. {
  909. position68, tokenIndex68 := position, tokenIndex
  910. if buffer[position] != rune('n') {
  911. goto l69
  912. }
  913. position++
  914. goto l68
  915. l69:
  916. position, tokenIndex = position68, tokenIndex68
  917. if buffer[position] != rune('N') {
  918. goto l16
  919. }
  920. position++
  921. }
  922. l68:
  923. {
  924. position70, tokenIndex70 := position, tokenIndex
  925. if buffer[position] != rune('s') {
  926. goto l71
  927. }
  928. position++
  929. goto l70
  930. l71:
  931. position, tokenIndex = position70, tokenIndex70
  932. if buffer[position] != rune('S') {
  933. goto l16
  934. }
  935. position++
  936. }
  937. l70:
  938. add(rulecontains, position55)
  939. }
  940. l72:
  941. {
  942. position73, tokenIndex73 := position, tokenIndex
  943. if buffer[position] != rune(' ') {
  944. goto l73
  945. }
  946. position++
  947. goto l72
  948. l73:
  949. position, tokenIndex = position73, tokenIndex73
  950. }
  951. if !_rules[rulevalue]() {
  952. goto l16
  953. }
  954. break
  955. }
  956. }
  957. }
  958. l28:
  959. add(rulecondition, position17)
  960. }
  961. return true
  962. l16:
  963. position, tokenIndex = position16, tokenIndex16
  964. return false
  965. },
  966. /* 2 tag <- <<(!((&('<') '<') | (&('>') '>') | (&('=') '=') | (&('"') '"') | (&(')') ')') | (&('(') '(') | (&('\\') '\\') | (&('\r') '\r') | (&('\n') '\n') | (&('\t') '\t') | (&(' ') ' ')) .)+>> */
  967. nil,
  968. /* 3 value <- <<(!((&('<') '<') | (&('>') '>') | (&('=') '=') | (&('"') '"') | (&(')') ')') | (&('(') '(') | (&('\\') '\\') | (&('\r') '\r') | (&('\n') '\n') | (&('\t') '\t') | (&(' ') ' ')) .)+>> */
  969. func() bool {
  970. position75, tokenIndex75 := position, tokenIndex
  971. {
  972. position76 := position
  973. {
  974. position77 := position
  975. {
  976. position80, tokenIndex80 := position, tokenIndex
  977. {
  978. switch buffer[position] {
  979. case '<':
  980. if buffer[position] != rune('<') {
  981. goto l80
  982. }
  983. position++
  984. break
  985. case '>':
  986. if buffer[position] != rune('>') {
  987. goto l80
  988. }
  989. position++
  990. break
  991. case '=':
  992. if buffer[position] != rune('=') {
  993. goto l80
  994. }
  995. position++
  996. break
  997. case '"':
  998. if buffer[position] != rune('"') {
  999. goto l80
  1000. }
  1001. position++
  1002. break
  1003. case ')':
  1004. if buffer[position] != rune(')') {
  1005. goto l80
  1006. }
  1007. position++
  1008. break
  1009. case '(':
  1010. if buffer[position] != rune('(') {
  1011. goto l80
  1012. }
  1013. position++
  1014. break
  1015. case '\\':
  1016. if buffer[position] != rune('\\') {
  1017. goto l80
  1018. }
  1019. position++
  1020. break
  1021. case '\r':
  1022. if buffer[position] != rune('\r') {
  1023. goto l80
  1024. }
  1025. position++
  1026. break
  1027. case '\n':
  1028. if buffer[position] != rune('\n') {
  1029. goto l80
  1030. }
  1031. position++
  1032. break
  1033. case '\t':
  1034. if buffer[position] != rune('\t') {
  1035. goto l80
  1036. }
  1037. position++
  1038. break
  1039. default:
  1040. if buffer[position] != rune(' ') {
  1041. goto l80
  1042. }
  1043. position++
  1044. break
  1045. }
  1046. }
  1047. goto l75
  1048. l80:
  1049. position, tokenIndex = position80, tokenIndex80
  1050. }
  1051. if !matchDot() {
  1052. goto l75
  1053. }
  1054. l78:
  1055. {
  1056. position79, tokenIndex79 := position, tokenIndex
  1057. {
  1058. position82, tokenIndex82 := position, tokenIndex
  1059. {
  1060. switch buffer[position] {
  1061. case '<':
  1062. if buffer[position] != rune('<') {
  1063. goto l82
  1064. }
  1065. position++
  1066. break
  1067. case '>':
  1068. if buffer[position] != rune('>') {
  1069. goto l82
  1070. }
  1071. position++
  1072. break
  1073. case '=':
  1074. if buffer[position] != rune('=') {
  1075. goto l82
  1076. }
  1077. position++
  1078. break
  1079. case '"':
  1080. if buffer[position] != rune('"') {
  1081. goto l82
  1082. }
  1083. position++
  1084. break
  1085. case ')':
  1086. if buffer[position] != rune(')') {
  1087. goto l82
  1088. }
  1089. position++
  1090. break
  1091. case '(':
  1092. if buffer[position] != rune('(') {
  1093. goto l82
  1094. }
  1095. position++
  1096. break
  1097. case '\\':
  1098. if buffer[position] != rune('\\') {
  1099. goto l82
  1100. }
  1101. position++
  1102. break
  1103. case '\r':
  1104. if buffer[position] != rune('\r') {
  1105. goto l82
  1106. }
  1107. position++
  1108. break
  1109. case '\n':
  1110. if buffer[position] != rune('\n') {
  1111. goto l82
  1112. }
  1113. position++
  1114. break
  1115. case '\t':
  1116. if buffer[position] != rune('\t') {
  1117. goto l82
  1118. }
  1119. position++
  1120. break
  1121. default:
  1122. if buffer[position] != rune(' ') {
  1123. goto l82
  1124. }
  1125. position++
  1126. break
  1127. }
  1128. }
  1129. goto l79
  1130. l82:
  1131. position, tokenIndex = position82, tokenIndex82
  1132. }
  1133. if !matchDot() {
  1134. goto l79
  1135. }
  1136. goto l78
  1137. l79:
  1138. position, tokenIndex = position79, tokenIndex79
  1139. }
  1140. add(rulePegText, position77)
  1141. }
  1142. add(rulevalue, position76)
  1143. }
  1144. return true
  1145. l75:
  1146. position, tokenIndex = position75, tokenIndex75
  1147. return false
  1148. },
  1149. /* 4 number <- <<('0' / ([1-9] digit* ('.' digit*)?))>> */
  1150. func() bool {
  1151. position84, tokenIndex84 := position, tokenIndex
  1152. {
  1153. position85 := position
  1154. {
  1155. position86 := position
  1156. {
  1157. position87, tokenIndex87 := position, tokenIndex
  1158. if buffer[position] != rune('0') {
  1159. goto l88
  1160. }
  1161. position++
  1162. goto l87
  1163. l88:
  1164. position, tokenIndex = position87, tokenIndex87
  1165. if c := buffer[position]; c < rune('1') || c > rune('9') {
  1166. goto l84
  1167. }
  1168. position++
  1169. l89:
  1170. {
  1171. position90, tokenIndex90 := position, tokenIndex
  1172. if !_rules[ruledigit]() {
  1173. goto l90
  1174. }
  1175. goto l89
  1176. l90:
  1177. position, tokenIndex = position90, tokenIndex90
  1178. }
  1179. {
  1180. position91, tokenIndex91 := position, tokenIndex
  1181. if buffer[position] != rune('.') {
  1182. goto l91
  1183. }
  1184. position++
  1185. l93:
  1186. {
  1187. position94, tokenIndex94 := position, tokenIndex
  1188. if !_rules[ruledigit]() {
  1189. goto l94
  1190. }
  1191. goto l93
  1192. l94:
  1193. position, tokenIndex = position94, tokenIndex94
  1194. }
  1195. goto l92
  1196. l91:
  1197. position, tokenIndex = position91, tokenIndex91
  1198. }
  1199. l92:
  1200. }
  1201. l87:
  1202. add(rulePegText, position86)
  1203. }
  1204. add(rulenumber, position85)
  1205. }
  1206. return true
  1207. l84:
  1208. position, tokenIndex = position84, tokenIndex84
  1209. return false
  1210. },
  1211. /* 5 digit <- <[0-9]> */
  1212. func() bool {
  1213. position95, tokenIndex95 := position, tokenIndex
  1214. {
  1215. position96 := position
  1216. if c := buffer[position]; c < rune('0') || c > rune('9') {
  1217. goto l95
  1218. }
  1219. position++
  1220. add(ruledigit, position96)
  1221. }
  1222. return true
  1223. l95:
  1224. position, tokenIndex = position95, tokenIndex95
  1225. return false
  1226. },
  1227. /* 6 time <- <(('t' / 'T') ('i' / 'I') ('m' / 'M') ('e' / 'E') ' ' <(year '-' month '-' day 'T' digit digit ':' digit digit ':' digit digit ((('-' / '+') digit digit ':' digit digit) / 'Z'))>)> */
  1228. func() bool {
  1229. position97, tokenIndex97 := position, tokenIndex
  1230. {
  1231. position98 := position
  1232. {
  1233. position99, tokenIndex99 := position, tokenIndex
  1234. if buffer[position] != rune('t') {
  1235. goto l100
  1236. }
  1237. position++
  1238. goto l99
  1239. l100:
  1240. position, tokenIndex = position99, tokenIndex99
  1241. if buffer[position] != rune('T') {
  1242. goto l97
  1243. }
  1244. position++
  1245. }
  1246. l99:
  1247. {
  1248. position101, tokenIndex101 := position, tokenIndex
  1249. if buffer[position] != rune('i') {
  1250. goto l102
  1251. }
  1252. position++
  1253. goto l101
  1254. l102:
  1255. position, tokenIndex = position101, tokenIndex101
  1256. if buffer[position] != rune('I') {
  1257. goto l97
  1258. }
  1259. position++
  1260. }
  1261. l101:
  1262. {
  1263. position103, tokenIndex103 := position, tokenIndex
  1264. if buffer[position] != rune('m') {
  1265. goto l104
  1266. }
  1267. position++
  1268. goto l103
  1269. l104:
  1270. position, tokenIndex = position103, tokenIndex103
  1271. if buffer[position] != rune('M') {
  1272. goto l97
  1273. }
  1274. position++
  1275. }
  1276. l103:
  1277. {
  1278. position105, tokenIndex105 := position, tokenIndex
  1279. if buffer[position] != rune('e') {
  1280. goto l106
  1281. }
  1282. position++
  1283. goto l105
  1284. l106:
  1285. position, tokenIndex = position105, tokenIndex105
  1286. if buffer[position] != rune('E') {
  1287. goto l97
  1288. }
  1289. position++
  1290. }
  1291. l105:
  1292. if buffer[position] != rune(' ') {
  1293. goto l97
  1294. }
  1295. position++
  1296. {
  1297. position107 := position
  1298. if !_rules[ruleyear]() {
  1299. goto l97
  1300. }
  1301. if buffer[position] != rune('-') {
  1302. goto l97
  1303. }
  1304. position++
  1305. if !_rules[rulemonth]() {
  1306. goto l97
  1307. }
  1308. if buffer[position] != rune('-') {
  1309. goto l97
  1310. }
  1311. position++
  1312. if !_rules[ruleday]() {
  1313. goto l97
  1314. }
  1315. if buffer[position] != rune('T') {
  1316. goto l97
  1317. }
  1318. position++
  1319. if !_rules[ruledigit]() {
  1320. goto l97
  1321. }
  1322. if !_rules[ruledigit]() {
  1323. goto l97
  1324. }
  1325. if buffer[position] != rune(':') {
  1326. goto l97
  1327. }
  1328. position++
  1329. if !_rules[ruledigit]() {
  1330. goto l97
  1331. }
  1332. if !_rules[ruledigit]() {
  1333. goto l97
  1334. }
  1335. if buffer[position] != rune(':') {
  1336. goto l97
  1337. }
  1338. position++
  1339. if !_rules[ruledigit]() {
  1340. goto l97
  1341. }
  1342. if !_rules[ruledigit]() {
  1343. goto l97
  1344. }
  1345. {
  1346. position108, tokenIndex108 := position, tokenIndex
  1347. {
  1348. position110, tokenIndex110 := position, tokenIndex
  1349. if buffer[position] != rune('-') {
  1350. goto l111
  1351. }
  1352. position++
  1353. goto l110
  1354. l111:
  1355. position, tokenIndex = position110, tokenIndex110
  1356. if buffer[position] != rune('+') {
  1357. goto l109
  1358. }
  1359. position++
  1360. }
  1361. l110:
  1362. if !_rules[ruledigit]() {
  1363. goto l109
  1364. }
  1365. if !_rules[ruledigit]() {
  1366. goto l109
  1367. }
  1368. if buffer[position] != rune(':') {
  1369. goto l109
  1370. }
  1371. position++
  1372. if !_rules[ruledigit]() {
  1373. goto l109
  1374. }
  1375. if !_rules[ruledigit]() {
  1376. goto l109
  1377. }
  1378. goto l108
  1379. l109:
  1380. position, tokenIndex = position108, tokenIndex108
  1381. if buffer[position] != rune('Z') {
  1382. goto l97
  1383. }
  1384. position++
  1385. }
  1386. l108:
  1387. add(rulePegText, position107)
  1388. }
  1389. add(ruletime, position98)
  1390. }
  1391. return true
  1392. l97:
  1393. position, tokenIndex = position97, tokenIndex97
  1394. return false
  1395. },
  1396. /* 7 date <- <(('d' / 'D') ('a' / 'A') ('t' / 'T') ('e' / 'E') ' ' <(year '-' month '-' day)>)> */
  1397. func() bool {
  1398. position112, tokenIndex112 := position, tokenIndex
  1399. {
  1400. position113 := position
  1401. {
  1402. position114, tokenIndex114 := position, tokenIndex
  1403. if buffer[position] != rune('d') {
  1404. goto l115
  1405. }
  1406. position++
  1407. goto l114
  1408. l115:
  1409. position, tokenIndex = position114, tokenIndex114
  1410. if buffer[position] != rune('D') {
  1411. goto l112
  1412. }
  1413. position++
  1414. }
  1415. l114:
  1416. {
  1417. position116, tokenIndex116 := position, tokenIndex
  1418. if buffer[position] != rune('a') {
  1419. goto l117
  1420. }
  1421. position++
  1422. goto l116
  1423. l117:
  1424. position, tokenIndex = position116, tokenIndex116
  1425. if buffer[position] != rune('A') {
  1426. goto l112
  1427. }
  1428. position++
  1429. }
  1430. l116:
  1431. {
  1432. position118, tokenIndex118 := position, tokenIndex
  1433. if buffer[position] != rune('t') {
  1434. goto l119
  1435. }
  1436. position++
  1437. goto l118
  1438. l119:
  1439. position, tokenIndex = position118, tokenIndex118
  1440. if buffer[position] != rune('T') {
  1441. goto l112
  1442. }
  1443. position++
  1444. }
  1445. l118:
  1446. {
  1447. position120, tokenIndex120 := position, tokenIndex
  1448. if buffer[position] != rune('e') {
  1449. goto l121
  1450. }
  1451. position++
  1452. goto l120
  1453. l121:
  1454. position, tokenIndex = position120, tokenIndex120
  1455. if buffer[position] != rune('E') {
  1456. goto l112
  1457. }
  1458. position++
  1459. }
  1460. l120:
  1461. if buffer[position] != rune(' ') {
  1462. goto l112
  1463. }
  1464. position++
  1465. {
  1466. position122 := position
  1467. if !_rules[ruleyear]() {
  1468. goto l112
  1469. }
  1470. if buffer[position] != rune('-') {
  1471. goto l112
  1472. }
  1473. position++
  1474. if !_rules[rulemonth]() {
  1475. goto l112
  1476. }
  1477. if buffer[position] != rune('-') {
  1478. goto l112
  1479. }
  1480. position++
  1481. if !_rules[ruleday]() {
  1482. goto l112
  1483. }
  1484. add(rulePegText, position122)
  1485. }
  1486. add(ruledate, position113)
  1487. }
  1488. return true
  1489. l112:
  1490. position, tokenIndex = position112, tokenIndex112
  1491. return false
  1492. },
  1493. /* 8 year <- <(('1' / '2') digit digit digit)> */
  1494. func() bool {
  1495. position123, tokenIndex123 := position, tokenIndex
  1496. {
  1497. position124 := position
  1498. {
  1499. position125, tokenIndex125 := position, tokenIndex
  1500. if buffer[position] != rune('1') {
  1501. goto l126
  1502. }
  1503. position++
  1504. goto l125
  1505. l126:
  1506. position, tokenIndex = position125, tokenIndex125
  1507. if buffer[position] != rune('2') {
  1508. goto l123
  1509. }
  1510. position++
  1511. }
  1512. l125:
  1513. if !_rules[ruledigit]() {
  1514. goto l123
  1515. }
  1516. if !_rules[ruledigit]() {
  1517. goto l123
  1518. }
  1519. if !_rules[ruledigit]() {
  1520. goto l123
  1521. }
  1522. add(ruleyear, position124)
  1523. }
  1524. return true
  1525. l123:
  1526. position, tokenIndex = position123, tokenIndex123
  1527. return false
  1528. },
  1529. /* 9 month <- <(('0' / '1') digit)> */
  1530. func() bool {
  1531. position127, tokenIndex127 := position, tokenIndex
  1532. {
  1533. position128 := position
  1534. {
  1535. position129, tokenIndex129 := position, tokenIndex
  1536. if buffer[position] != rune('0') {
  1537. goto l130
  1538. }
  1539. position++
  1540. goto l129
  1541. l130:
  1542. position, tokenIndex = position129, tokenIndex129
  1543. if buffer[position] != rune('1') {
  1544. goto l127
  1545. }
  1546. position++
  1547. }
  1548. l129:
  1549. if !_rules[ruledigit]() {
  1550. goto l127
  1551. }
  1552. add(rulemonth, position128)
  1553. }
  1554. return true
  1555. l127:
  1556. position, tokenIndex = position127, tokenIndex127
  1557. return false
  1558. },
  1559. /* 10 day <- <(((&('3') '3') | (&('2') '2') | (&('1') '1') | (&('0') '0')) digit)> */
  1560. func() bool {
  1561. position131, tokenIndex131 := position, tokenIndex
  1562. {
  1563. position132 := position
  1564. {
  1565. switch buffer[position] {
  1566. case '3':
  1567. if buffer[position] != rune('3') {
  1568. goto l131
  1569. }
  1570. position++
  1571. break
  1572. case '2':
  1573. if buffer[position] != rune('2') {
  1574. goto l131
  1575. }
  1576. position++
  1577. break
  1578. case '1':
  1579. if buffer[position] != rune('1') {
  1580. goto l131
  1581. }
  1582. position++
  1583. break
  1584. default:
  1585. if buffer[position] != rune('0') {
  1586. goto l131
  1587. }
  1588. position++
  1589. break
  1590. }
  1591. }
  1592. if !_rules[ruledigit]() {
  1593. goto l131
  1594. }
  1595. add(ruleday, position132)
  1596. }
  1597. return true
  1598. l131:
  1599. position, tokenIndex = position131, tokenIndex131
  1600. return false
  1601. },
  1602. /* 11 and <- <(('a' / 'A') ('n' / 'N') ('d' / 'D'))> */
  1603. nil,
  1604. /* 12 equal <- <'='> */
  1605. nil,
  1606. /* 13 contains <- <(('c' / 'C') ('o' / 'O') ('n' / 'N') ('t' / 'T') ('a' / 'A') ('i' / 'I') ('n' / 'N') ('s' / 'S'))> */
  1607. nil,
  1608. /* 14 le <- <('<' '=')> */
  1609. nil,
  1610. /* 15 ge <- <('>' '=')> */
  1611. nil,
  1612. /* 16 l <- <'<'> */
  1613. nil,
  1614. /* 17 g <- <'>'> */
  1615. nil,
  1616. nil,
  1617. }
  1618. p.rules = _rules
  1619. }