|
|
- 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<A>(
- 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)
- }
- }
|