Una gramática es ambigua si puede generar una secuencia de símbolos con
dos árboles sintácticos diferentes. Una gramática ambigua puede rescribirse
para eliminar la ambigüedad.
Ejemplo: <a> ::= <a> (+
| *) <a> | número
Secuencia: 1*2+3
Arboles sintácticos
generados:
Una
gramática no se puede utilizar para la realización de un compilador por que no
especifica la estructura sintáctica del lenguaje.
Aquí, “otra” representa a cualquier otra instrucción. De acuerdo con
esta gramática, la siguiente instrucción condicional compuesta:
Ejemplo: La gramática es ambigua porque aa tiene dos derivaciones por la izquierda
Esta gramática genera
el lenguaje a+ que también es el lenguaje generado por la gramática no ambigua
Proceso
- No existe un algoritmo que nos indique si una GIC es ambigua
- Existen LIC que sólo tienen GIC ambiguas: inherentemente ambiguos
- Para las construcciones de los lenguajes de programación comunes existen técnicas para la eliminación de la ambigüedad
- Ejemplo: causas de ambigüedad en la siguiente gramática
No se respeta la precedencia de operadores
Una secuencia de operadores idénticos puede agruparse desde la izquierda
y desde la derecha. Lo convencional es agrupar desde la izquierda.- No existe un algoritmo que nos indique si una GIC es ambigua
- Existen LIC que sólo tienen GIC ambiguas: inherentemente ambiguos
- Para las construcciones de los lenguajes de programación comunes existen técnicas para la eliminación de la ambigüedad
- Ejemplo: causas de ambigüedad en la siguiente gramática
No se respeta la precedencia de operadores
Ejemplo: modificamos
la gramática para forzar la precedencia