El analizador LR es un analizador ascendente. Siempre se utiliza para tratar la gramática libre de contexto (CFG). Por lo general, lo utilizan los compiladores de lenguajes de programación de computadoras, así como también otras herramientas asociadas. El analizador LR produce la derivación más a la izquierda mientras usa la entrada tomando de izquierda a derecha. Al construirse a partir de las hojas, ayuda a reducir las producciones de gramática de nivel superior, por eso se llama analizador de abajo hacia arriba. Los analizadores LR son los analizadores más potentes entre todos los analizadores deterministas que se utilizan ampliamente en la actualidad. Los analizadores LR son básicamente de 4 tipos :
Recuperación de errores en análisis LR:
Cuando no hay una continuación válida para la entrada escaneada hasta el momento, los analizadores LR informan un error. Antes de notificar un error, un analizador CLR nunca realiza una sola reducción y un SLR o LALR pueden realizar múltiples reducciones, pero nunca moverán un símbolo de entrada incorrecto a la pila.
Cuando el analizador comprueba la tabla y descubre que el elemento de acción relevante está vacío, se reconoce un error en el análisis de LR. Las entradas Goto nunca se pueden usar para detectar errores.
LR Parser utiliza básicamente las dos técnicas mencionadas para detectar errores:
- Recuperación de fase sintáctica
- Recuperación del modo de pánico
Recuperación de fase sintáctica:
La recuperación de fase sintáctica sigue los pasos dados:
- Los errores del programador que llaman a los procedimientos de error en la tabla del analizador se determinan según el idioma.
- Crear procedimientos de error que puedan alterar la parte superior de la pila y/o ciertos símbolos en la entrada de una manera que sea aceptable para las entradas de error de la tabla.
Estos son algunos de los errores que se detectan durante la recuperación de la fase sintáctica:
- Errores en la estructura
- Operador faltante
- Palabras clave mal escritas
- paréntesis desequilibrado
Recuperación del modo de pánico:
Este enfoque implica eliminar caracteres consecutivos de la entrada uno por uno hasta que se obtenga un conjunto de tokens sincronizados. Los delimitadores como o son tokens de sincronización. El beneficio es que es simple de implementar y asegura que no terminará en un bucle infinito. El inconveniente es que se salta una cantidad significativa de datos sin comprobar si hay problemas adicionales.
La recuperación del modo de pánico sigue los pasos dados:
- Escanee la pila hasta que encuentre un estado ‘a’ con un goto() en una determinada ‘B’ no terminal (eliminando estados de la pila).
- Hasta que se identifique un símbolo ‘b’ que pueda seguir a ‘B’, se rechazan cero o más símbolos de entrada.
Ejemplo de recuperación de errores usando LR Parser:
Considere la siguiente gramática para detectar los errores:
E → E + E E → E * E E → ( E ) E → id
Paso 1: Primero haga la tabla de análisis para la gramática dada:
Paso 2: Deje que la string dada para analizarla sea:
String: id+)$
Paso 3: Ahora, el trabajo del analizador en la string dada se describe a continuación:
PILA | APORTE |
---|---|
0 | identificación+)$ |
0id3 | +)$ |
0E1 | +)$ |
0E1 + 4 | ps |
0E1 + 4 | ps |
0E1 + 4id3 | ps |
0E1 + 4E7 | ps |
0E1 | ps |
Paso 4: La salida se da en forma de error detectado:
Action(4, )) = error i.e., “unbalanced right parenthesis” c2 removes right parenthesis “missing operand” e2 pushes id3 on stack
Por lo tanto, el error se detecta usando el analizador LR de esta manera.