PROGRAMACIÓN DE UN ÁRBOL SINTÁCTICO ASCENDENTE

Analizador Lexicográfico

Para la programación del árbol sintáctico ascendente se utilizará la siguiente gramática

Las palabras que debe reconocer el analizador lexicográfico son:
L= {+, *, (,), id}

1_compi

en este caso, muy simple y al reconocer una palabra retorna por cada palabra valida un número que representa en este caso un token para el analizador sintáctico.

compi2.5 compi2.6

Analizador sintáctico ascendente

Para poder realizar el árbol se requirieron de tres estructuras:

La que soporta la pila del analizador sintáctico

La que soporta la pila de apuntadores para crear el árbol sintáctico

la estructura misma del árbol sintáctico.

struct nodo{
int dato;
nodo * siguiente;
};

struct nodo2{
void p;
nodo2
siguiente;
};

struct nodo1{
char dato;
nodo1 izq;
nodo1
der;
};

Apuntador bidimensional tipo void:

void * p[2];

El apuntador p[0] se encarga de apuntar a la pila que producen las iteraciones

p[1] apunta a una pila de apuntadores que permite crear el árbol ascendente.

Cada elemento en la pila de apuntadores apunta a una rama que permitirá crear el árbol
sintáctico de las hojas a la raíz

la función sintáctico() invoca las siguientes funciones:

Shift(). Permite leer otro elemento del archivo y pasar al estado indicado en la tabla
sintáctica.

Reduce(). Realiza las operaciones marcadas en el algoritmo

compi5

Función es reduce()

En tal función, la variable w es el número de regla a reducir

Para la pila del analizador sintáctico se procede como sigue:

Se colocó un ciclo for para tal eliminación y se utiliza la función elimina() para
eliminar los 6 elementos de pila.

Para w=1, w=3, w=5 se invoca a la función tope() para observar lo que existe en tope
de pila y se guarda en la variable z,

posteriormente se invoca la función crea() dos veces, la primera para introducir la reducción ‘A’ de la regla A→𝛼 y la segunda para introducir a pila el elemento indicado por la tabla sintáctica (tsin[z][A]).

compi6

Para la pila del analizador sintáctico se procede como sigue

Eliminar dos elementos de la pila del analizador sintáctico, por lo que se coloca un
ciclo for para la invocación de la función elimina() dos veces

Posteriormente se toma en la variable z el elemento del tope de pila, para esto se
invoca la función tope()

Se introduce la reducción ‘A’ de la regla A→𝛼 y lo que indique la reducción ‘A’ con
la variable z del tablero sintáctico en tope de pila (tsin[A][z]).

Para la pila del árbol sintáctico se invoca la función creaA() en el cual puede realizar uno de
los dos pasos:

Si es una hoja (el elemento a analizar es una “i”), se crea un nodo para tal elemento, se crea otro nodo para el elemento ‘F’, se conectan entre sí y se guarda el apuntador de ‘F’ a pila de apuntadores.

o si la reducción se une a la rama que está apuntando en el tope de pila

La función que controla las llamadas continuas del analizador lexicográfico

compi8 :