viernes, 17 de junio de 2016

Eliminación de la ambigüedad.



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.

 

Ejemplo: modificamos la gramática para forzar la precedencia