next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Práctica: El Análisis de Sup: Análisis LR Ant: El Analizador Ascendente Parse::Yapp Err: Si hallas una errata ...

Práctica: YappParse.yp

Repase los fuentes de Yapp. Puede obtenerlos en

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:


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Práctica: El Análisis de Sup: Análisis LR Ant: El Analizador Ascendente Parse::Yapp Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21