Logo

13 февраля 2015 г.

Неоднозначность разбора и возможный возврат elsif

Похоже, ключевое слово elsif придется вернуть в язык, поскольку возникает неоднозначность. На фоне предновогодней эйфории я больше думал над синтаксисом со стороны отекстовки, а посмотреть со стороны синтаксического разбора забыл.

Неоднозначность

Без elsif при синтаксическом разборе всегда возникает неоднозначность, поскольку на момент входа в оператор еще не известно, единственный он во вложенном блоке или нет. Все последующие блоки также под вопросом, поскольку теперь не понятно, какой end какой блок завершает:
if условие1 then
  операторы;
else if условие2 then
  операторы;
end;
  операторы;
end; /* это лишний end или завершение предыдущего if,
        не единственного в блоке? */
С привычными отступами выглядит понятней:
if условие1 then
  операторы;
else
  if условие2 then
    операторы;
  end;
  операторы;
end;
Проблема характерна для любого языка с блочными операторами ветвления и свободной записью: SQL, Модула-2, частично Ада.

В Канторе я вижу два выхода:
  • Вернуть elsif и получить тонны ненависти от программистов, не любящих это ключевое слово.
  • Не бояться «лишних» end при разборе. Тут нужен дополнительный анализ — что делать с возможными неоднозначностями. В любом случае это усложнит компилятор и затруднит проверку синтаксиса.
Возвращение elsif, если случится, может быть частичным, — только для алгоритмических блоков. В выражениях с if/case вполне может остаться принудительное совмещение.

Принудительное совмещение в выражениях

В выражениях с if/case внутри веток могут стоять только одиночные значения или кортежи, поэтому принудительное совмещение не приводит к неоднозначности и elsif не нужен:
a = if условие1 then
  значение1 // в выражениях точка с запятой не ставится
else if условие1 then
  значение2
  // из-за отсутствия точки с запятой никакие другие операторы
  // тут недопустимы
end;
Пример с кортежем отличается только числом значений:
a, b, c = if условие1 then
  значение1, значение2, значение3 // точка с запятой опять не ставится
else if условие2 then
  значение4, значение5, значение6
end;

2 комментария

  1. В питоне используется elif, короче и чище, чем elsif.

    ОтветитьУдалить
    Ответы
    1. Рабочая гипотеза на данный момент — не возвращать ни elsif, ни elif, а разрешить писать условие после else. Таким образом после одного if могут идти несколько else с условиями и последний else — без условия.

      Удалить

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.