Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | 4x 4x 39x 39x 4x 16x 16x 16x 12x 12x 12x 12x 12x 9x 9x 3x 3x 3x 16x 4x | import { Word, SuggestedPattern } from './types' import { Node, Match } from './node' import { Suggestion } from './suggestion' export class LookupNode extends Node { constructor(alias: string, readonly contexts: Node[]) { super(alias) } /** * Given a sequence of tokens, returns a list of the greatest common nodes in a pattern * and their corresponding remainders (see [[Node.matchPattern]] and [[Match]] for details). * * However, unlike [[Node.matchPattern]], this method attempts to resolve any results with * remainders at this contextual-level. That is, if a result from a `matchPattern` call on * a sub-context has remainders, this method will attempt to extend the match by trying to * match the remainder token sequence with the subsequent words in the pattern. * * @param tokens input tokens we wish to pattern match. */ public matchPattern(tokens: Word[]): Match[] { let matches: Match[] = [] for (const context of this.contexts) { for (const match of context.matchPattern(tokens)) { // TODO PUSH THE CURRENT LOOKUP NODE TO THE END INSTEAD OF REPLACING // get top-most node in call-stack (i.e. least deep context) const node = match.nodes[match.nodes.length - 1] // was the matched node the end of a pattern? const isTerminalMatch: boolean = node.end // if the sub-context matched on a terminal node and it is a leaf node, // pop it off the call-stack. if (isTerminalMatch && node.isLeaf()) match.nodes.pop() // push this lookup node as the top-most node in the stack match.nodes.push(this) // complete match in sub-context. (tokens exhuasted) if (match.remainder.length === 0) { // if the sub-context matched on a terminal node, matches.push(match) continue } // a remiander exists. // if it was not a terminal match in the sub-context, a match is impossible Iif (!isTerminalMatch) continue // the match was on a pattern terminal in the sub-context and this lookup node is // itself a terminal. the remainder may be able to be matched at a the context above. if (this.end) matches.push(match) // attempt to resolve a little more of the remainder on this contextual level. // even if this node is a terminal, it could have a continued pattern that we // could potentially match with. matches = matches.concat(super.matchPattern(match.remainder)) } } return matches } } |