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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 401786x 401786x 401786x 401786x 401786x 401786x 63306x 63306x 401786x 1x 1x 2155335x 2155335x 1x 1x 338480x 338480x 338480x 338480x 1x 1x 440954x 440954x 1x 1x 677665x 677665x 1x 1x 326106x 326106x 1x 1x 3106535x 3106535x 1x 1x | import {AbstractToken} from "../1_lexer/tokens/abstract_token"; import {ExpressionNode} from "../nodes/expression_node"; import {TokenNode} from "../nodes/token_node"; export class Result { private readonly tokens: readonly AbstractToken[]; private readonly tokenIndex: number; private nodes: (ExpressionNode | TokenNode)[] | undefined; public constructor(tokens: readonly AbstractToken[], tokenIndex: number, nodes?: (ExpressionNode | TokenNode)[]) { // tokens: all tokens, from the tokenIndex = not yet matched // nodes: matched tokens this.tokens = tokens; this.tokenIndex = tokenIndex; this.nodes = nodes; if (this.nodes === undefined) { this.nodes = []; } } public peek(): AbstractToken { return this.tokens[this.tokenIndex]; } public shift(node: ExpressionNode | TokenNode): Result { const cp = this.nodes!.slice(); cp.push(node); return new Result(this.tokens, this.tokenIndex + 1, cp); } public popNode(): ExpressionNode | TokenNode | undefined { return this.nodes!.pop(); } public getNodes(): (ExpressionNode | TokenNode)[] { return this.nodes!; } public setNodes(n: (ExpressionNode | TokenNode)[]): void { this.nodes = n; } public remainingLength(): number { return this.tokens.length - this.tokenIndex; } } |