TComp/src/TComp.jl

76 lines
1.9 KiB
Julia
Raw Normal View History

2025-07-28 22:40:06 +08:00
module TComp
include("./parser.jl")
using .Parser
using Match
inp = ARGS
f = open(ARGS[1], "r")
prog = read(f, String)
print(prog)
parsed = Parser.totalParse(prog)
print(parsed)
tmp_var_no = 0
# Pass 1 duplicated varname unified
function unifyVar(parsed, env)
@match parsed begin
# letrec is not considered
#[("%let", "id"), [ty, var], val, [("%lambda", "id"), args, body]] => nothing
[("%let", "id"), [ty, var], val, body] =>
begin
envNew = env
push!(envNew, var[1]) # push x of var = ("x", "id") in newEnv
res = [("%let", "id"),
[ty, unifyVar(var, envNew)],
unifyVar(val, env),
unifyVar(body, envNew)]
return res
end
(var, "id") =>
begin
reversedEnv = reverse(env)
index = length(env) - findfirst(e -> e == var, reversedEnv) + 1
return (index, "id")
end
[(plus, "plus"), lhs, rhs] =>
begin
lhs_new = unifyVar(lhs, env)
rhs_new = unifyVar(rhs, env)
return [(plus, "plus"), lhs_new, rhs_new]
end
[(minus, "minus"), lhs, rhs] =>
begin
lhs_new = unifyVar(lhs, env)
rhs_new = unifyVar(rhs, env)
return [(minus, "minus"), lhs_new, rhs_new]
end
[("%call", "id"), callee, args...] =>
begin
unifiedCallee = unifyVar(callee, env)
unifiedArgs = map(x ->unifyVar(x, env), args[1])
return vcat([("%call", "id"), unifiedCallee], [unifiedArgs])
end
(c, "int") => return parsed
_ => "Error"
end
end
emptyEnv = []
res = unifyVar(parsed, emptyEnv)
print(res)
close(f)
2025-07-28 22:40:06 +08:00
end # module