http://search.cpan.org/~fdesar/Parse-Yapp-1.05/lib/Parse/Yapp.pm
o bien en nuestros servidores locales, por ejemplo en el mismo directorio en que se guarda la versión HTML de estos apuntes encontrará una copia de Parse-Yapp-1.05.tar.gz. La versión a la que se refiere este capítulo es la 1.05.
Estudie el fuente del fichero YappParse.yp
.
Este fichero contiene la gramática yapp
del lenguaje
yacc
. Además de las dos rutinas de soporte típicas,
la de tratamiento de errores _Error
y la
de análisis léxico _Lexer
, el fichero
contiene una subrutina para el manejo de las
reglas _AddRules
y otra rutina Parse
la cuál
actúa como wrapper o filtro sobre el analizador
YYParse
.
Durante el análisis sintáctico
de un programa yapp
se construye una estructura de
datos para la posterior manipulación y tratamiento de
la gramática.
Por ejemplo, para la gramática:
%% S: # empty | 'a' S 'b' { print "S -> a S b\n" } ; %%La siguiente estructura de datos es construida:
$VAR1 = { 'SYMS' => { 'S' => 2, '\'b\'' => 3, '\'a\'' => 3 }, 'NULL' => { 'S' => 1 }, 'EXPECT' => 0, 'RULES' => [ [ '$start', [ 'S', 'Special Symbol' ], undef, undef ], [ 'S', [], undef, undef ], [ 'S', [ '\'a\'', 'S', '\'b\'' ], undef, [ ' print "S -> a S b\\n" ', 3 ] ] ], 'HEAD' => undef, 'TAIL' => [ ' sub _Error { ... } sub _Lexer { ... } ... ', 5 ], 'PREC' => {}, 'START' => 'S', 'TERM' => { '\'b\'' => undef, '\'a\'' => undef }, 'NTERM' => { 'S' => [ '1', '2' ] } };
Explique el significado de los diferentes componentes de la estructura
de datos resultante. Las componentes del hash que aparece
arriba se corresponden
con diversas variables usadas por YYParse
durante el análisis. La correspondencia
se establece dentro del método Parse
cuando se hace la asignación:
@$parsed{ 'HEAD', 'TAIL', 'RULES', 'NTERM', 'TERM', 'NULL', 'PREC', 'SYMS', 'START', 'EXPECT' } = ( $head, $tail, $rules, $nterm, $term, $nullable, $precterm, $syms, $start, $expect);esta asignación es la que crea el hash. Las variables con identificadores en minúsculas son usadas en el analizador. Son visibles en todo el fichero ya que, aunque declaradas léxicas, su declaración se encuentra en la cabecera del analizador:
%{ require 5.004; use Carp; my($input,$lexlevel,@lineno,$nberr,$prec,$labelno); my($syms,$head,$tail,$token,$term,$nterm,$rules,$precterm,$start,$nullable); my($expect); %}
Responda a las siguientes preguntas:
SYMS
?
TERM
esta indefinidos. En general
contienen un array anónimo con información sobre el terminal. ¿Que información
exactamente?
PREC
? ¿tiene algo que ver con la directiva
%prec
?
TAIL
?
¿Qué contiene el array anónimo de clave HEAD
?
NULL
? ¿En que forma es
usado durante el análisis para controlar posibles errores?
YappParse.yp
en que se trata con esta situación?
EXPECT
?
S
en NTERM
?
YappParse.yp
?