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 411971x 411971x 411971x 411971x 411971x 411971x 64418x 64418x 411971x 1x 1x 2236518x 2236518x 1x 1x 347553x 347553x 347553x 347553x 1x 1x 461752x 461752x 1x 1x 695067x 695067x 1x 1x 334579x 334579x 1x 1x 3206309x 3206309x 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; } } |