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 466158x 466158x 466158x 466158x 466158x 466158x 66166x 66166x 466158x 1x 1x 3237351x 3237351x 1x 1x 399992x 399992x 399992x 399992x 1x 1x 531807x 531807x 1x 1x 775440x 775440x 1x 1x 374486x 374486x 1x 1x 4266157x 4266157x 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;
}
} |