OptimizeOrder optimizes the order of processing rule elements, including: * A block of reversed elements that match from next
(ps *State)
| 373 | // OptimizeOrder optimizes the order of processing rule elements, including: |
| 374 | // * A block of reversed elements that match from next |
| 375 | func (pr *Rule) OptimizeOrder(ps *State) { |
| 376 | osz := len(pr.Order) |
| 377 | if osz == 0 { |
| 378 | return |
| 379 | } |
| 380 | nfmnxt := 0 |
| 381 | fmnSt := -1 |
| 382 | fmnEd := -1 |
| 383 | lastwas := false |
| 384 | for oi := 0; oi < osz; oi++ { |
| 385 | ri := pr.Order[oi] |
| 386 | rr := &pr.Rules[ri] |
| 387 | if rr.FromNext { |
| 388 | nfmnxt++ |
| 389 | if fmnSt < 0 { |
| 390 | fmnSt = oi |
| 391 | } |
| 392 | if lastwas { |
| 393 | fmnEd = oi // end of block |
| 394 | } |
| 395 | lastwas = true |
| 396 | } else { |
| 397 | lastwas = false |
| 398 | } |
| 399 | } |
| 400 | if nfmnxt > 1 && fmnEd > 0 { |
| 401 | nword := make([]int, osz) |
| 402 | for oi := 0; oi < fmnSt; oi++ { |
| 403 | nword[oi] = pr.Order[oi] |
| 404 | } |
| 405 | idx := fmnSt |
| 406 | for oi := fmnEd - 1; oi >= fmnSt; oi-- { |
| 407 | nword[idx] = pr.Order[oi] |
| 408 | idx++ |
| 409 | } |
| 410 | for oi := fmnEd; oi < osz; oi++ { |
| 411 | nword[oi] = pr.Order[oi] |
| 412 | } |
| 413 | pr.Order = nword |
| 414 | } |
| 415 | } |
| 416 | |
| 417 | // CompileTokMap compiles first token map |
| 418 | func (pr *Rule) CompileTokMap(ps *State) bool { |