Analizador de descenso recursivo – Part 1

Requisito previo: construcción de la tabla de análisis LL(1) , clasificación de analizadores de arriba hacia abajo 
El análisis es el proceso para determinar si el símbolo de inicio puede derivar el programa o no. Si el análisis tiene éxito, entonces el programa es un programa válido; de lo contrario, el programa no es válido. 
En general, hay dos tipos de analizadores: 
 

  1. Analizadores de arriba hacia abajo: 
    • En esta técnica de análisis, expandimos el símbolo de inicio a todo el programa.
    • Los analizadores de descenso recursivo y LL son los analizadores de arriba hacia abajo.
  2. Analizadores ascendentes: 
    • En esta técnica de análisis, reducimos todo el programa al símbolo de inicio.
    • El analizador de precedencia de operadores, el analizador LR(0), el analizador SLR, el analizador LALR y el analizador CLR son los analizadores ascendentes.

Analizador de descenso recursivo: 
es una especie de analizador de arriba hacia abajo. Un analizador de arriba hacia abajo construye el árbol de análisis de arriba hacia abajo, comenzando con el inicio no terminal. Un analizador predictivo es un caso especial de analizador de descenso recursivo, en el que no se requiere seguimiento posterior. 
Escribir cuidadosamente una gramática significa eliminar la recursividad por la izquierda y la factorización por la izquierda de ella, la gramática resultante será una gramática que puede ser analizada por un analizador de descenso recursivo.
Ejemplo:

Antes de eliminar la recursividad izquierda Después de eliminar la recursividad izquierda
E –> E + T | T 
T –> T * F | F 
F –> ( mi ) | identificación
mi –> te’ 
mi’ –> + te’ | e 
T –> F T’ 
T’ –> * F T’ | mi 
F –> ( mi ) | identificación

**Aquí e es Epsilon
For Recursive Descent Parser, vamos a escribir un programa para cada variable. 
 

Example:
Grammar: E --> i E'
E' --> + i E' | e

C

int main()
{
    // E is a start symbol.
    E();
 
    // if lookahead = $, it represents the end of the string
    // Here l is lookahead.
    if (l == '$')
        printf("Parsing Successful");
}
 
// Definition of E, as per the given production
E()
{
    if (l == 'i') {
        match('i');
        E'();
    }
}
 
// Definition of E' as per the given production
E'()  
{
    if (l == '+') {
        match('+');
        match('i');
        E'();
    }//The second condition of E'
    else if ( l == 'e' )
    {
      match('e');
    }
        return ();
}
 
// Match function
match(char t)
{
    if (l == t) {
        l = getchar();
    }
    else
        printf("Error");
}

Publicación traducida automáticamente

Artículo escrito por anonymous007 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *