如何从嵌套块中的外部块访问变量?

How to get access to variables from outer Block in nested one?

我正在尝试使用 C# 扩展树编写一些简单的 brainf*ck 执行程序。 但我无法使循环工作。

我有这样的输入:++++++++++++++++++++[>>+<++<-]>.>. 在 CST 构建之后:

() => {
    int index;
    LazyDictionary<int, char> lent;
    index = 0;
    lent = #LazyDictionary<int, char>;
    lent[index] = (char)(lent[index] + 20);
    while (true) {
        if (lent[index] == '') {
            break;
        } else {
            index += (int)2;
            lent[index] = (char)(lent[index] + 1);
            index -= (int)1;
            lent[index] = (char)(lent[index] + 2);
            index -= (int)1;
            lent[index] = (char)(lent[index] - 1);
        }
    };
    index += (int)1;
    Console.Write(lent[index]);
    index += (int)1;
    Console.Write(lent[index]);
}

看起来应该可以,但问题是变量。

while 循环中的语句是嵌套的 ExpressionBlock 并且任何使用 lentindex 都会导致异常,例如:

Variable 'index' of type 'System.Int32' referenced from scope '', but it is not defined

我构建循环的代码是这样的

cstLoopNode.Inner.Visit(this);

var prebody = Buffer.Pop();
var breakLabel = Expression.Label();
var condition = Expression.Equal(CurrentLentValueExpression, Expression.Constant('[=11=]'));
var loopStopper = Expression.IfThenElse(condition, Expression.Break(breakLabel), prebody);

Buffer.Push(Expression.Loop(loopStopper, breakLabel));

变量prebody包含一个内部语句块。如果我在创建块时添加变量,它会在主体中创建具有相同名称的新变量。如果我不添加它们,我就没有这些变量,并且它无法访问外部块中的变量。

有没有办法创建一个嵌套的语句块,它可以从外部块访问变量?

当您使用 Expression.Block 创建块时,您会提供一个局部变量集合。这些应该在块和任何子块中可见。如果您在遍历之前不知道它们,则必须将所需的变量冒泡到 Block 的声明中。

BlockExpression.Variables