Висячая неопределенность

Опубликовано: 30 Сентября, 2022

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

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

Висячая неопределенность

Проблема оборванного else в синтаксической неоднозначности. Это происходит, когда мы используем вложенные if . Когда есть несколько утверждений «если» , часть «иначе» не получает четкого представления, с каким « если » она должна сочетаться.

Например:

if (condition) {
}
if (condition 1) {
}
 if (condition 2) {
}
   else
   {
       }

В приведенном выше примере есть несколько « если» с несколькими условиями, и здесь мы хотим соединить самое внешнее «если» с частью «иначе». Но часть else не получает четкого представления, с каким условием « если» она должна сочетаться. Это приводит к неадекватным результатам в программировании.

Проблема оборванного еще:

Свисание else может привести к серьезным проблемам. Это может привести к неправильной интерпретации компилятором и, в конечном счете, к неверным результатам.

Например:

Initialize k=0 and o=0
if(ch>=3) 
if(ch<=10) 
k++;
else
o++;

В этом случае мы не знаем, когда будет увеличена переменная « o ». Либо первое условие « если » может не выполняться, либо второе условие « если » может не выполняться. Даже первое условие « если » выполняется, второе условие « если» может не сработать, что может привести к выполнению части « иначе» . Таким образом, это приводит к неправильным результатам.

Чтобы решить эту проблему, такие языки программирования, как C, C++, Java, объединяют часть « else» с самым внутренним оператором « if» . Но иногда мы хотим, чтобы самый внешний оператор « if» сочетался с частью « else» .

Решение проблемы с оборванным еще

Первый способ заключается в разработке недвусмысленных языков программирования.

Во- вторых , мы можем решить проблемы висячих-иначе в языках программирования, используя фигурные скобки и отступы.

Например:

if (condition) {
     if (condition 1) {
          if (condition 2) {}
}
}
 else {
 }

В приведенном выше примере мы используем фигурные скобки и отступы, чтобы избежать путаницы.

В- третьих , мы также можем использовать формат «if – else if – else» , чтобы конкретно указать, какое « else» принадлежит какому « if» .

Например :

if(condition) {
}
else if(condition-1) {
}
else if(condition-2){
}
else{
}