2025-07-28 22:40:06 +08:00
|
|
|
module TComp
|
|
|
|
include("./parser.jl")
|
|
|
|
using .Parser
|
2025-08-19 23:57:14 +08:00
|
|
|
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
|