В вашей грамматике вам нужно выражение, похожее на следующее:
foreach := foreach ( name in name ) { statements }
Когда вы проанализируете это, вы сможете преобразовать его непосредственно в цикл while в вашем AST с дополнительным оператором, который назначает переменную в начале.
Мне кажется, это самый простой способ сделать это, но, вероятно, он будет иметь ограничения для нескольких итерируемых типов данных (например, список или массив). В этом случае вы можете рассмотреть возможность объединения всех итераций, чтобы у них был согласованный метод для получения следующего элемента.