syndicate-js/packages/compiler/src/syntax/position.ts

42 lines
936 B
TypeScript

export interface Pos {
line: number;
column: number;
pos: number;
name: string | null;
fixed?: boolean;
}
export function startPos(name: string | null): Pos {
return { line: 1, column: 0, pos: 0, name };
}
export function fixPos(p: Pos): Pos {
return { ... p, fixed: true };
}
export function advancePos(p: Pos, ch: string): boolean {
if (p.fixed ?? false) {
return ch === '\n';
} else {
let advancedLine = false;
p.pos++;
switch (ch) {
case '\t':
p.column = (p.column + 8) & ~7;
break;
case '\n':
p.column = 0;
p.line++;
advancedLine = true;
break;
case '\r':
p.column = 0;
break;
default:
p.column++;
break;
}
return advancedLine;
}
}