public ISemantReturn<ImmutableList<Tuple<Env, ABT.Decln>>> GetDeclns(Env env) {
var storageClass = this.DeclnSpecs.GetStorageClass();
var baseType = Semant(this.DeclnSpecs.GetExprType, ref env);
var declns = this.InitDeclrs.ConvertAll(
initDeclr => {
var typeAndInitr = Semant(initDeclr.GetDecoratedTypeAndInitr, baseType, ref env);
var type = typeAndInitr.Item1;
var initr = typeAndInitr.Item2;
var name = initDeclr.GetName();
// Add the new symbol into the environment.
Env.EntryKind kind;
switch (storageClass) {
case StorageClass.AUTO:
if (env.IsGlobal()) {
kind = Env.EntryKind.GLOBAL;
} else {
kind = Env.EntryKind.STACK;
}
break;
case StorageClass.EXTERN:
kind = Env.EntryKind.GLOBAL;
break;
case StorageClass.STATIC:
kind = Env.EntryKind.GLOBAL;
break;
case StorageClass.TYPEDEF:
kind = Env.EntryKind.TYPEDEF;
break;
default:
throw new InvalidOperationException();
}
env = env.PushEntry(kind, name, type);
return Tuple.Create(env, new ABT.Decln(name, storageClass, type, initr));
}
);
return SemantReturn.Create(env, declns);
}