public override ABT.Expr GetExpr(ABT.Env env) {
Option<ABT.Env.Entry> entry_opt = env.Find(this.Name);
if (entry_opt.IsNone) {
throw new InvalidOperationException($"Cannot find variable '{this.Name}'");
}
ABT.Env.Entry entry = entry_opt.Value;
switch (entry.Kind) {
case ABT.Env.EntryKind.TYPEDEF:
throw new InvalidOperationException($"Expected a variable '{this.Name}', not a typedef.");
case ABT.Env.EntryKind.ENUM:
return new ABT.ConstLong(entry.Offset, env);
case ABT.Env.EntryKind.FRAME:
case ABT.Env.EntryKind.GLOBAL:
case ABT.Env.EntryKind.STACK:
return new ABT.Variable(entry.Type, this.Name, env);
default:
throw new InvalidOperationException($"Cannot find variable '{this.Name}'");
}
}
}