Instituto Tecnológico de Tuxtla Gutiérrez
Ingeniería en Sistemas Computacionales Teoría De La Computación
Proyecto COCO-R Presenta López Maza Jessica Molina Velasco Jaime Guadalupe Morales Ocaña José Francisco Rodas Borges Mario Alberto
Tuxtla Gutiérrez, Chiapas a 23 de Mayo del 2011
INDICE Introducción
Descripción del Lenguaje Conjunto de Instrucciones Analizador léxico Introducción
Autómata Finito Determinista Tabla de AnálisisLéxico Programa Analizador Sintáctico Introducción
Gramática Libre De Contexto (Con Recursividad) Gramática Libre De Contexto (Sin Recursividad) Notación BNF Diagrama De Sintaxis Notación BNF / COCO ±R Programa Conclusión
INTRODUCCION El
presente proyecto se ha realizado en base a un analizador léxico y sintáctico
haciendo uso de COCO-R, que es un generador de compilador de lenguaje que proporciona un programa y un escáner para el lenguaje creado. Aplicando los conocimientos adquiridos previamente acerca de los autómatas y los lenguajes, hemos creado el lenguaje acerca de un control remoto de televisión indicando las seis principales funciones del antes mencionado.
DESCRIPCION DEL LENGUAJE El
lenguaje que manejamos en este proyecto es referente a las funciones básicas
de un control remoto de televisión, donde podemos mencionar que las indicaciones básicas que se necesitan son las necesarias como encender, subir y bajar volumen así mismo como el cambio de canales y la función de menú y la de enter para aceptar todos los cambios y modificaciones que se desee realizar en la configuración de una televisión.
CONJUNTO DE INSTRUCCIONES
A Power(cantidad)
B
C Aumentar Volumen (Cantidad)
D Bajar Volumen (Cantidad)
EMenú (Cantidad)
F
G Enter (Cantidad)
Chanel (Digito)
Direcciones (Arriba, Abajo, Derecha, Izquierda)
ANALIZADOR LEXICO INTRODUCCION Analizador léxico (scanner): lee la secuencia de caracteres delprograma fuente,
carácter a carácter, y los agrupa para formar unidades con significado propio, componentes léxicos (tokens).
Estos
Palabras reservadas
Identificadores
Operadores
Símbolos especiales
Constantes Numéricas
Constantes de Caracteres
componentes léxicos representan:
AFD
TABLA DE ANALISIS LEXICO
PROGRAMA #include
#include #define ESTADOS
24 #define CODIGO 12 unsignedcharCaracter_Act; int Verifica(); intAnalizador_Lexico(); void main() { int Token; printf("Cadena: "); do { Caracter_Act=getchar(); ungetc(Caracter_Act,stdin); Token=Analizador_Lexico(); printf("%d\n"); ungetc(Caracter_Act,stdin); } while(Token != 511); } intAnalizador_Lexico() { unsignedintCodigo; unsignedint Estado=0; unsignedint Salida=0; /*******Tabla de Transicion*******/ staticunsignedintMatriz_de_Transicion[ ESTADOS][CODIGO]= { /* Caracter/ L ( ) ; D + - A Ab -><- otro */ /* Estados */ /* q0 */ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 511, /* q1 */ 1, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, /* q2 */ 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, /* q3 */ 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, /* q4 */ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, /* q5 */ 504, 504, 504, 504, 5, 504, 504, 504, 504, 504, 504, 504, /* q6 */ 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, /* q7 */ 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506,
/* q8 */ /* q9 */ /* q10*/ /* q11*/ };
507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
/*********Tabla de Salida***********/ staticunsignedintMatriz_de_Salida[ ESTADOS][CODIGO]= { /* Caracter/ L ( ) ; D + - A Ab -><- otro */ /* Estado */ /* q0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* q1 */ 500, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* q2 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* q3 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* q4 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* q5 */ 5, 5, 5, 5, 504, 5, 5, 5, 5, 5, 5, 5, /* q6 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, /* q7 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, /* q8 */ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* q9 */ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* q10*/ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, /* q11*/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; while (Salida==0) { Codigo=Verifica(); Salida= Matriz_de_Salida[ Estado][Codigo]; Estado= Matriz_de_Transicion[ Estado][Codigo]; } return Estado; } intVerifica() { Caracter_Act=getchar(); if(isalpha(Caracter_Act)) return 0; else if((Caracter_Act=='(')) return 1; else if((Caracter_Act==')')) return 2; else if((Caracter_Act==';')) return 3; else if(isdigit(Caracter_Act)) return 4;
else if((Caracter_Act=='+')) return 5; else if((Caracter_Act=='-')) return 6; else if((Caracter_Act=='?')) return 7; else if((Caracter_Act=='!')) return 8; else if((Caracter_Act=='>')) return 9; else if((Caracter_Act=='<')) return 10; else return 11; }
ANALIZADOR SINTACTICO INTRODUCCION El
análisis sintáctico convierte el texto de entrada en otras estructuras
(comúnmente árboles), que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada. Un analizador léxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los que son procesados por el analizador sintáctico para construir la estructura de datos.
GRAMÁTICA LIBRE DE CONTEXTO (CON RECURSIVIDAD)
A ->Ap (b); B|B
B -> BC (e); C|C
C -> Ca (e); D|D
D ->Db (e);
E
F ->Fd (a, ab, der, izq); G|G
G -> Ge (e); H|H
H ->
E|E
->Em (b); F|F
GRAMÁTICA LIBRE DE CONTEXTO (SIN RECURSIVIDAD) A -> A|
A ->Ap (b); B|B
B ->Bc (e); C|C
C -> Ca (e); D|D
D ->Db (e)
E
F ->Fd (a, ab, der, izq) G|G
E|E
->Em (b); F|F
A -> A¶
A -> BA¶
B -> CB¶
C ->DC¶
D -> ED¶
E
F -> GF¶
->FE¶
A¶ -> A¶ |
A¶ -> p(b); B A¶|
B¶ -> c(e);C B¶|
C¶ -> a (e);D C¶|
D¶ -> b(e); E D¶|
E¶
F¶ -> d (a, ab, der, iz); GF¶|
-> m(b);F
E¶|
NOTACION BNF ::= { [| |