Vous êtes sur la page 1sur 5

Universidad Nacional del Altiplano

FACULTAD DE MECÁNICA ELÉCTRICA, ELECTRÓNICA Y SISTEMAS


Escuela Profesional ingeniería de sistemas

INTRODUCCION A LAS CONSULTAS T-SQL

Curso: TEORIA DE LENGUAJES Y AUTOMATAS


Presentado por: KATIA MARILIA ORDOÑEZ CANDIA
Código: 161475
Docente: EDWIN MAMAN CALDERON

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 match(tokentype expected)”, esta función esta encargada de


hacer comparaciones para cada caso y luego pasar a otras funciones, en pocas
palabras esta función se encarga de dar “ERROR” o si pasa. Si el token o el
símbolo es igual a lo esperado, devuelve a la función anterior “getToken()” y si
no lo es imprime “ERROR”.
void match(TokenType expected)
{ if (token == expected)
token = getToken(); //regresarlo
else
printf("Error sintactico, se esperaba: otro token \n");
}

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 ( ");
}
}

La función “E2()” evalúa si existen signos de operaciones básicas (+ y -), también


los paréntesis “()”, el token(símbolo) es analizado por un “switch”, y al igual que
la función anterior, comparara los valores y las enlaza con otras funciones para
determinar la validez de una expresión, si no cumple la condición, imprime
“ERROR”.
void E2() // Analizador Sintáctico E2-> +T E2|epsilon
{
switch ( token ) {
case PLUS : match(PLUS); T(); E2(); break;
case MINUS : match(MINUS); T(); E2(); break;
case RPAREN : break;
case ENDFILE: break;
default : printf("Error sintactico en E2(), se esperaba:
+,),EOF \n");
}
}
La función “void T()” es la que precede a la anterior función “E()”, con la
diferencia que llama a la función F() como acompañante de la evaluación, esta
función se basara más en expresiones que carezcan de paréntesis causando
ambigüedad en la expresión, analizara la estructura y marcara error cuando
detecte la ausencia de algún número.
void T() // Analizador Sintáctico T -> F T2
{
switch (token) {
case NUM : F(); T2();break;
case LPAREN : F(); T2();break;
default : printf("Error sintactico en T(), se esperaba NUM o ( ");
}
}
La función F() y el mismo T2() causa recursividad o autollamado, esta función
analiza la ausencia de signos antes de los paréntesis, que en muchas de las
calculadoras están permitidas, al igual que las otras esta función analiza token
por token en un “switch”.
void F() // Analizador Sintáctico F -> num|(E)
{
switch ( token ) {
case NUM : match(NUM); break;
case LPAREN : match(LPAREN); E(); match(RPAREN); break;
default : printf("Error sintactico en F(), se esperaba: numero , \n");
}
}
Finalmente, la funion general que es el “main()”, es aquí donde ejecuta todos
todas la funciones . primero se declara un token llamado a la función
“getToken()”, luego llamaremos a la función E() para iniciar todas las
posibilidades de error que existe, no llamamos a todas porque ya están
relacionadas unas a otras, se condiciona la existencia de números únicamente
mediante la condicional con su respectivo “else”.
int main()
{

token = getToken();
E();
if (token!=ENDFILE)
printf("Error sintactico, se esperaba terminar en : EOF \n");
else
printf("Analisis sintactico terminado \n");
return 0;
}

Vous aimerez peut-être aussi