Из вашего комментария звучит так, как будто вы пишете интерпретатор, который выполняет код непосредственно в посетителе, не проходя через IR или что-то подобное (пожалуйста, исправьте меня, если я не понял).
Итак, ваша проблемав том, что вы не можете просто написать оператор switch
внутри своего кода, если вы даже не знаете, сколько будет case
операторов - вы все равно не можете поместить case
в цикл.И даже если бы это не было проблемой, другой проблемой было бы то, что case
операторам нужны константы времени компиляции, но вам нужно было бы использовать их со значениями, извлеченными из дерева разбора.
Есливы генерировали код, ничего из этого не было бы проблемой, потому что вы могли просто сгенерировать правильное количество случаев с заданными значениями, и все было бы хорошо.Но это не так, поэтому все динамично и вы не можете использовать switch
.
Но это не проблема, потому что никто не говорит, что вам нужно реализовать switch
, используя switch
.Как вы, вероятно, знаете, переключатель - это просто более удобный (и часто более производительный) способ написания серии операторов if
.В вашем примере (при условии, что ваш язык имеет неявные значения break
s), это будет:
if (aNumber == 1) {
print("return 1");
} else if (aNumber == 2) {
print("return 2");
}
Что это означает для вашего интерпретатора, что вы можете оценить выражение, которое вы включаете, затем выполнить циклдля всех случаев и для каждого случая сравните оцененное число со значением case
с if
.Как только одно из условий совпадает, вы выполняете соответствующий код и выходите из цикла.
Если у вас нет неявных break
s, вы должны вместо этого выходить из цикла только тогда, когдавстретить break
и в противном случае использовать флаг, чтобы запомнить, если вы уже столкнулись с истинным условием, а затем выполнять каждый последующий блок кода, пока не встретите break
или не достигнете конца switch
.