next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Usando autoscore Sup: RecDescent Ant: Las directivas rulevar y Err: Si hallas una errata ...

Utilizando score

La directiva <score: ...> toma como argumento una expresión numérica que indica la prioridad de la producción. La directiva lleva un <reject> asociado. La producción con puntuación mas alta es elegida (salvo que hubiera otra que hubiera aceptado directamente). El problema anterior puede ser resuelto como sigue:
#!/usr/local/bin/perl5.8.0 -w
use strict;
use Parse::RecDescent;
use Data::Dumper;

#$::RD_TRACE = 1;
my $grammar = q{
  line : <leftop: value ',' value> 
           <score: @{$item[1]}>
       | <leftop: datum ':' datum> 
           <score: @{$item[1]}>
       | <leftop: field ";" field> 
           <score: @{$item[1]}>
        
  value: /[^,]*/ 
  datum: /[^:]*/ 
  field: /[^;]*/ 
};

my $parse = Parse::RecDescent->new($grammar);

my $line;
while ($line = <>) {
  print "$line\n";
  my $result = $parse->line($line);
  if (defined($result)) { print Dumper($result); }
  else { print "Cadena no válida\n"; }
}
Al darle como entrada el fichero
$ cat file3.txt
1:2:3,3:4;44
1,2:2,3:3;33
1;2:2;3:3;44
Obtenemos la ejecución:
$ ./score.pl file3.txt
1:2:3,3:4;44
$VAR1 = [ '1', '2', '3,3', '4;44 ' ];
1,2:2,3:3;33
$VAR1 = [ '1', '2:2', '3:3;33 ' ];
1;2:2;3:3;44
$VAR1 = [ '1', '2:2', '3:3', '44 ' ];


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Usando autoscore Sup: RecDescent Ant: Las directivas rulevar y Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22