export enum LocType { REGISTER = "register", TEMPORARY = "temporary", VARIABLE = "variable", } export class Loc { type: LocType name: string constructor(type: LocType, name: string) { this.type = type this.name = name } reduce( vari: (name: string) => A, temp: (name: string) => A, reg: (name: string) => A, ): A { switch (this.type) { case LocType.VARIABLE: return vari(this.name) case LocType.TEMPORARY: return temp(this.name) case LocType.REGISTER: return reg(this.name) } } ppName(): string { return this.reduce( (name: string) => name, (name: string) => '#' + name, (name: string) => '%' + name, ) } asmName(): string { return this.reduce( (name: string) => `(${name})`, (_name: string) => { throw new Error("temporaries do not exist in assembly!") }, (name: string) => name.toUpperCase(), ) } static vari(name: string): Loc { return new Loc(LocType.VARIABLE, name) } static temp(name: string): Loc { return new Loc(LocType.TEMPORARY, name) } static reg(name: string): Loc { return new Loc(LocType.REGISTER, name) } }