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 502767x 502767x 502767x 502767x 502767x 502767x 67592x 67592x 502767x 1x 1x 4235102x 4235102x 1x 1x 435175x 435175x 435175x 435175x 1x 1x 583364x 583364x 1x 1x 833663x 833663x 1x 1x 403281x 403281x 1x 1x 5312847x 5312847x 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;
}
} |