next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: RecDescent Sup: Construcción de Analizadores Léxicos Ant: El Módulo Parse::Flex Err: Si hallas una errata ...

Usando Text::Balanced

La función extract_multiple del módulo Text::Balanced puede ser considerada un generador de analizadores léxicos. El primer argumento es la cadena a ser procesada y el segundo la lista de extractores a aplicar a dicha cadena. Un extractor puede ser una subrutina, pero también una expresión regular o una cadena.

En un contexto de lista devuelve la lista con las subcadenas de la cadena original, según han sido producidas por los extractores. En un contexto escalar devuelve la primera subcadena que pudo ser extraída de la cadena original. En cualquier caso, extract_multiple empieza en la posición actual de búsqueda indicada por pos y actualiza el valor de pos de manera adecuada.

Si el extractor es una referencia a un hash, deberá contener exactamente un elemento. La clave actúa como nombre del terminal o token y el valor es un extractor. La clave es utilizada para bendecir la cadena casada por el extractor.

Veamos un programa de ejemplo:

$ cat extract_variable.pl
#!/usr/local/bin/perl5.8.0 -w

use strict;
use Text::Balanced qw( extract_variable extract_quotelike
                       extract_codeblock extract_multiple);

my $text = <<'EOS'
#!/usr/local/bin/perl5.8.0 -w

$pattern = shift || '';
$pattern =~ s{::}{/}g;
$pattern =~ s{$}{.pm};
@dirs = qw(
/usr/local/lib/perl5/5.8.0/i686-linux
/usr/local/lib/perl5/5.8.0
/usr/local/lib/perl5/site_perl/5.8.0/i686-linux
/usr/local/lib/perl5/site_perl/5.8.0
/usr/local/lib/perl5/site_perl
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.6.1
/usr/share/perl/5.6.1
);

for (@dirs) {
  my $file = $_."/".$pattern;
  print "$file\n" if (-e $file);
}

EOS
;
my @tokens = &extract_multiple(
  $text,
  [
   {variable => sub { extract_variable($_[0], '') }},
   {quote => sub { extract_quotelike($_[0],'') }},
   {code => sub { extract_codeblock($_[0],'{}','') }},
   {comment => qr/#.*/}
  ],
  undef,
  0
)
;

for (@tokens) {
  if (ref($_)) {
    print ref($_),"=> $$_\n";
  }
  else {
    print "other things: $_\n";
  }
}
La subrutina extract_variable extrae cualqueir variable Perl válida. El primer argumento es la cadena a ser procesada, el segundo es una cadena que especifica un patrón indicando el prefijo a saltarse. Si se omite como en el ejemplo, se usarán blancos. La subrutina extract_quotelike extrae cadenas Perl en cualqueira de sus múltiples formas de representación. La subrutina extract_codeblock extrae un bloque de código.

Ejecución del programa anterior:

$ ./extract_variable.pl
comment=> #!/usr/local/bin/perl5.8.0 -w
other things:


variable=> $pattern
other things:  = shift ||
quote=> ''
other things: ;

variable=> $pattern
other things:  =~
quote=> s{::}{/}g
other things: ;

variable=> $pattern
other things:  =~
quote=> s{$}{.pm}
other things: ;

variable=> @dirs
other things:  =
quote=> qw(
/usr/local/lib/perl5/5.8.0/i686-linux
/usr/local/lib/perl5/5.8.0
/usr/local/lib/perl5/site_perl/5.8.0/i686-linux
/usr/local/lib/perl5/site_perl/5.8.0
/usr/local/lib/perl5/site_perl
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.6.1
/usr/share/perl/5.6.1
)
other things: ;

for (
variable=> @dirs
other things: )
code=> {
  my $file = $_."/".$pattern;
  print "$file\n" if (-e $file);
}
other things:


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: RecDescent Sup: Construcción de Analizadores Léxicos Ant: El Módulo Parse::Flex Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22