Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Puno – Perú
2017
Explicación del código fuente de un analizador sintáctico hecho en c:
1. Definimos las librerías necesarias, en este caso solo sería definir la librería
<stdio.h>, lo cual es común en c, esta librería nos da apertura a entradas(SCANF)
y salidas(PRINTF).
#include <stdio.h>
2. También veremos elementos como ERROR, PLUS, LPSRENT entre otros, esto
hace referencia a los elementos que se usaran en la entrada.
Typefd enum{
ERROR,
PLUS, MINUS,
NUM, TIMES, LPAREN, RPAREN,
ENDFILE, OVER, POT,
}
Token type;
3. El siguiente código que veremos es para enlistar todas las funciones a utilizar en
el código, esto de enlistar nos ayuda bastante en el orden del código y poder
entenderlo. Podemos apreciar que dividimos en varias funciones para realizar el
análisis sintáctico eficiente, están divididos según el problema que ingrese el
usuario, cada función las explicaremos en el presente informe.
int temp;
TokenType token; // Tokens leidos
TokenType getToken(); // Analizador Lexico void match
(TokenType expected); // Compara tokens
void E(); // Analizador Sintactico E -> T E2 $
void E2(); // Analizador Sintactico E2-> +T E2|epsilon
void T(); // Analizador Sintactico T -> F T2
void T2(); // Analizador Sintactico T2-> *F T2|epsilon
void F(); // Analizador Sintactico F -> num|(E)
4. Empezaremos por escribir todas las funciones.
La función “TokenType getToken()” que verifica los elementos de la
cadena token por token. Dichos valores son almacenados en una
variable “c“ para luego ser pasar a la función “switch”, en el que se
evaluara caso por caso hasta lograr almacenarlo como un valor, caso
contrario se imprimirá “ERROR”.
TokenType getToken() {
int c = getchar();
while (c==' ') c=getchar();
switch (c) {
case '\t': case '+' : return PLUS;
case '-' : return MINUS;
case '*' : return TIMES;
case '/' : return OVER;
case '^' : return POT;
case '(' : return LPAREN;
case ')' : return RPAREN;
case '\n':
case EOF : return ENDFILE;
default : if (isdigit(c)){
ungetc(c, stdin);
scanf("%d",&temp);
return NUM;
}
else
return ERROR;
}
}
La función “void E()”, dicha función es nos ayudara a determinar el tipo de error,
esta función esta diseñada para detectar errores en la sintaxis compuesta por
“NUM” y “(“, para lo cual estos valores, llamado a la vez a T() y E() para que la
sintaxis sea correcta, si en caso no se cumplen estos casos, el algoritmo mara
error.
void E() // Analizador Sintactico E -> T E2 $
{
switch (token) {
case NUM : T(); E2();break;
case LPAREN : T(); E2();break;
default : printf("Error sintactico en E(),se esperaba NUM o ( ");
}
}
token = getToken();
E();
if (token!=ENDFILE)
printf("Error sintactico, se esperaba terminar en : EOF \n");
else
printf("Analisis sintactico terminado \n");
return 0;
}