Вы можете сделать это с двумя проходами через дерево. На первом проходе соберите список узлов, которые соответствуют метке. На втором проходе сделайте прогулку по дереву, чтобы интерпретировать утверждение. Эта идеализированная машина имеет IP-адрес, называемый «указателем инструкций» для узла в дереве оператора. Большинство операторов тривиально выполнить, изменяя состояние переменных и где следующий IP - следующий узел дерева для выполнения. Однако, когда вы посещаете оператор goto, вам необходимо настроить IP для нового узла, соответствующего метке. В дополнение к IP-регистру этой идеализированной машины вам необходимо будет представить переменные, массивы и базовые типы c. Вам нужно подумать о том, как найти узел дерева для следующего оператора. Не ясно, хотите ли вы также определить процедуры. Если это так, вам также понадобится стек вызовов. Если вы намереваетесь представить программу в виде байт-кода, а не в виде дерева разбора, вы пишете транслятор, также называемый компилятором и виртуальной машиной. Похоже, что вы новичок в этом, и это для небольшого проекта, я бы порекомендовал вам интерпретировать дерево как есть. Эта проблема будет тем, что вы увидите в первом курсе по компиляции.