next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: La clase Parse::Lex Sup: Construcción de Analizadores Léxicos Ant: Encontrando los terminales mediante Err: Si hallas una errata ...

Construcción usando la opción g y el ancla G

Tomemos como ejemplo el análisis léxico de una sencilla calculadora que admite constantes numéricas enteras, los paréntesis (, ) y los operadores +, -, * y /. Se trata de producir a partir de la cadena de entrada una lista con los tokens y sus valores. Por ejemplo, la cadena 3*4-2 generará la lista: ('num', 3, 'op', '*', 'num', 4, 'op', '-', 'num', 2).

Las versiones mas recientes de Perl disponen de una opción /c que afecta a las operaciones de emparejamiento con /g en el contexto escalar. Normalmente, cuando una búsqueda global escalar tiene lugar y no ocurre casamiento, la posición \G es reestablecida al comienzo de la cadena. La opción /c hace que la posición inicial de emparejamiento permanezca donde la dejó el último emparejamiento con éxito. combinando \G y /c es posible escribir con cierta comodidad un analizador léxico:

{ # Con el redo del final hacemos un bucle "infinito"
  if (\G(\d+)/gc) {
    push @tokens, 'num', $1;
  } elsif (m|\G([-+*()/])|gc) {
    push @tokens, 'pun', $1;
  } elsif (/\G./gc) {
    die 'Caracter invalido';
  }
  else {
    last;
  }
  redo;
}


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: La clase Parse::Lex Sup: Construcción de Analizadores Léxicos Ant: Encontrando los terminales mediante Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22