Так а что вас интересует? Если есть if/while то мы уже в тьюринг полноте и все выразимо. Вопрос того, что именно вы хотите выражать.
Кроме того, синтаксис всех полезных языков контекстно-зависимый, а грамматика, используемая для построения парсера (и указанные в стандартах грамматики), дают лишь контекстно-свободную аппроксимацию языка. Я подозреваю, что вас интересуют всякие ограничения на построение программ типа "в функцию by construction не передать число меньшее пяти". Но учитывая то, что кс грамматика не выражает даже свойства "переменная, которую мы используем, была объявлена", есть сомнения в том, что эта дорога нас куда-то приведет