Please enable JavaScript.
Coggle requires JavaScript to display documents.
PROGRAMACIÓN DE UN ÁRBOL SINTÁCTICO ASCENDENTE - Coggle Diagram
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}
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.
Analizador sintáctico ascendente
Para poder realizar el árbol se requirieron de tres estructuras:
La que soporta la pila del analizador sintáctico
struct nodo{
int dato;
nodo * siguiente;
};
La que soporta la pila de apuntadores para crear el árbol sintáctico
struct nodo2{
void
p;
nodo2
siguiente;
};
la estructura misma del árbol sintáctico.
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
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]).
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
Link Title
La función que controla las llamadas continuas del analizador lexicográfico
: