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 460878x 460878x 460878x 460878x 460878x 460878x 65269x 65269x 460878x 1x 1x 3209248x 3209248x 1x 1x 395609x 395609x 395609x 395609x 1x 1x 526591x 526591x 1x 1x 768102x 768102x 1x 1x 370993x 370993x 1x 1x 4228757x 4228757x 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;
}
} |