Los compiladores e intérpretes usan la gramática para construir la estructura de datos para procesar los programas. Entonces, idealmente, un programa debería tener un árbol de derivación. Un árbol de análisis o un árbol de derivación es una representación gráfica que muestra cómo se derivan strings de la gramática utilizando reglas de producción. Pero existen algunas strings que son ambiguas.
Se dice que una gramática es ambigua si existe más de una derivación más a la izquierda o más de una derivación más a la derecha o más de un árbol de análisis sintáctico para una string de entrada. Una gramática o string ambigua puede tener múltiples significados. La ambigüedad a menudo se trata como un error gramatical, en los lenguajes de programación, esto es en su mayoría no intencionado.
Ambigüedad pendiente
El problema pendiente del else en la ambigüedad sintáctica. Ocurre cuando usamos nested if . Cuando hay varias declaraciones «if» , la parte «else» no tiene una visión clara con qué » if » debe combinarse.
Por ejemplo:
if (condition) { } if (condition 1) { } if (condition 2) { } else { }
En el ejemplo anterior, hay múltiples » si» con múltiples condiciones y aquí queremos emparejar el si más externo con la parte más. Pero la parte else no obtiene una visión clara con qué condición » si» debe emparejarse. Esto conduce a resultados inadecuados en la programación.
El problema de colgar-otra cosa:
Colgar más puede conducir a problemas serios. Puede dar lugar a interpretaciones erróneas por parte del compilador y, en última instancia, a resultados erróneos.
Por ejemplo:
Initialize k=0 and o=0 if(ch>=3) if(ch<=10) k++; else o++;
En este caso, no sabemos cuándo se incrementará la variable “ o ”. La primera condición » si » podría no cumplirse o la segunda condición » si » podría no cumplirse. Incluso la primera condición » si » se cumple, la segunda condición » si» puede fallar, lo que puede conducir a la ejecución de la parte » si no» . Por lo tanto, conduce a resultados erróneos.
Para resolver el problema, los lenguajes de programación como C, C++, Java combinan la parte «si no» con la declaración » si» más interna . Pero a veces queremos que la declaración » si» más externa se combine con la parte » si no» .
Resolviendo el problema de colgar-else
La primera forma es diseñar lenguajes de programación no ambiguos.
En segundo lugar , podemos resolver los problemas colgantes en los lenguajes de programación mediante el uso de llaves y sangría.
Por ejemplo:
if (condition) { if (condition 1) { if (condition 2) {} } } else { }
En el ejemplo anterior, usamos llaves y sangría para evitar confusiones.
En tercer lugar , también podemos utilizar el formato “si – si no si – si no” para indicar específicamente qué “ si no” pertenece a qué “ si” .
Por ejemplo :
if(condition) { } else if(condition-1) { } else if(condition-2){ } else{ }