yapp
contiene las rutinas de soporte.
tail: /*empty*/ | TAILCODEel terminal
TAILCODE
al igual que los terminales
CODE
y HEADCODE
indican que en ese punto se puede encontrar
código Perl. La detección de TAILCODE
y HEADCODE
son mas sencillas
que las de CODE
.
La cola de un programa yacc
es similar.
Para el programa yacc
cuya cabecera y cuerpo
se mostraron en la sección
7.19.2
la cola es:
1 %% 2 3 extern FILE * yyin; 4 5 main(int argc, char **argv) { 6 if (argc > 1) yyin = fopen(argv[1],"r"); 7 /* yydebug = 1; 8 */ 9 yyparse(); 10 } 11 12 yyerror(char *s) { 13 printf("%s\n",s); 14 }
La declaración del manejador de fichero yyin
en la línea 14
referencia el archivo
de entrada para el analizador. La variable (comentada, línea 7)
yydebug
controla la información para la depuración de la gramática.
Para que sea realmente efectiva, el programa deberá además compilarse
definiendo la macro YYDEBUG
. Sigue un ejemplo
de Makefile
:
1 inherited: y.tab.c lex.yy.c 2 gcc -DYYDEBUG=1 -g -o inherited1 y.tab.c lex.yy.c 3 y.tab.c y.tab.h: inherited1.y 4 yacc -d -v inherited1.y 5 lex.yy.c: inherited1.l y.tab.h 6 flex -l inherited1.l 7 clean: 8 - rm -f y.tab.c lex.yy.c *.o core inherited1
Al compilar tenemos:
pl@nereida:~/src/inherited$ make yacc -d -v inherited1.y flex -l inherited1.l gcc -DYYDEBUG=1 -g -o inherited1 y.tab.c lex.yy.c pl@nereida:~/src/inherited$ ls -ltr total 232 -rw-r----- 1 pl users 242 Dec 10 2003 Makefile -rw-r----- 1 pl users 404 Dec 10 2003 inherited1.l -rw-r----- 1 pl users 878 Dec 10 2003 inherited1.y -rw-rw---- 1 pl users 1891 Jan 26 15:41 y.tab.h -rw-rw---- 1 pl users 30930 Jan 26 15:41 y.tab.c -rw-rw---- 1 pl users 2365 Jan 26 15:41 y.output -rw-rw---- 1 pl users 44909 Jan 26 15:41 lex.yy.c -rwxrwx--x 1 pl users 56336 Jan 26 15:41 inherited1