A "high-level" language for the Gameboy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

46 lines
1.1 KiB

import type { AssignStmt, Expr, Stmt } from "./ast"
// dest <- op(x, y)
type Operand = string | number
type ASSA<Data> = { dest: string } & Data
type SSA = ASSA<{ source: Operand }>
| ASSA<{ source: Operand, op: string }>
| ASSA<{ source1: Operand, op: string, source2: Operand }>
type IRState = {
nextID: number
ssa_stmts: Array<SSA>
}
export const convertIR = (stmts: Array<Stmt>): Array<SSA> => {
const state: IRState = {
nextID: 0,
ssa_stmts: [],
}
stmts.forEach(stmt => {
const ssa_stmts = convertAssignStmt(state, stmt)
state.ssa_stmts.push(...ssa_stmts)
})
return state.ssa_stmts
}
export const convertAssignStmt = (state: IRState, stmt: AssignStmt): Array<SSA> => {
const dest = stmt.args.name
const [source, expr_stmts] = convertExpr(state, stmt.args.expr)
expr_stmts.push({
dest,
source,
})
return expr_stmts
}
export const convertExpr = (state: IRState, expr: Expr): [string, Array<SSA>] => {
const name = `temp${state.nextID++}`
return [name, [{ dest: name, source: expr }]]
}