Você está na página 1de 3

HERRAMIENTA DE COMPILADOR:

YET ANOTHER COMPILER COMPILER YACC


1. FUNCIONAMIENTO DE YACC: YACC no es directamente un analizador sino un generador de analizadores. A partir de un fichero fuente en yacc, se genera un fichero fuente en C que contiene el analizador sintctico. Sin embargo, un analizador sintctico de yacc no puede funcionar por s solo, sino que necesita un analizador lxico externo para funcionar. Dicho de otra manera, el fuente en C que genera yacc contiene llamadas a una funcin yylex() que debe estar definida y debe devolver el tipo de lexema encontrado. Adems, es necesario incorporar tambin una funcin yyerror(), que ser invocada cuando el analizador sintctico encuentre un smbolo que no encaja en la gramtica.

2. EL LENGUAJE YACC: 2.1. Esquema general: Un programa fuente de Yacc se parece bastante a uno de lex. La diferencia principal est en la seccin de reglas, que en vez de expresiones regulares contiene las reglas de la gramtica:

De estas tres secciones, slo la segunda es obligatoria, y no debe estar vaca (en lex, las tres secciones pueden estar vacas). Esto quiere decir que el mnimo programa en yacc es: %% regla gramatical accin en C La seccin de declaraciones: su funcin principal no es definir expresiones regulares, sino declarar los smbolos terminales de la gramtica mediante la directriz %token. Todo lo que no sea un terminal, ser considerado un smbolo no terminal, y por tanto debe haber una regla para l: %token IF,ELSE,LLAVE_AB,LLAVE_CE,IDENT La seccin de reglas contiene la gramtica en s. Componentes es una combinacin de terminales y no terminales que describe al no terminal de la izquierda de la regla: no_terminal: componentes {acciones en C} La seccin de rutinas tiene la misma funcin que la de lex, pero yacc (dependiendo de su variante) no define por defecto las funciones main(), yylex() e yyerror(), as que hay que incluirlas aqu, o bien en otro fichero que se enlazar en la fase final de la compilacin. Yacc genera una funcin llamada yyparse() que contiene el analizador sintctico. Esta funcin se comporta como una mquina de estados cuya misin es intentar reducir todo el fichero de entrada al smbolo inicial de la gramtica (el primero que se haya definido). Si yacc lo consigue, el analizador sintctico volver sin error, y en caso contrario, se invocar a la funcin yyerror(), que debe estar definida tambin en algn sitio. 2.2. Ejemplo: Construir un analizador sintctico que reconozca la palabra Hola, en maysculas o minsculas, y con un nmero arbitrario de letras o: %token H,O,L,A %{ #define H 257 #define O 258 #define L 259 #define A 260 int yylex() { char carac=getchar();

switch(carac) { case 'H': case 'h':

return H; case 'O': case 'o': return O; case 'L': case 'l': return L; case 'A': case 'a': return A; } return -1; } int yyerror() { printf("La expresin de la entrada NO forma parte del lenguaje reconocido\n"); return 0; } %} %% hola: H letra_o L A {printf("La expresin introducida es parte del lenguaje reconocido\n");} letra_o: O | letra_o O ; %% int main() { yyparse(); return 0; } 3. Bibliografa: http://www.infor.uva.es/~mluisa/talf/docs/labo/L8.pdf http://www.lcc.uma.es/~galvez/ftp/tci/TutorialYacc.pdf http://www.medinaweb.com/programas/documents/tutoriales/lex_yacc/core/yacc.html http://pegaso.ls.fi.upm.es/compiladores/Herramientas.html http://www.youtube.com/watch?v=mmvo96SiisQ http://www.youtube.com/watch?v=ats_iumjWKo

Você também pode gostar