NAME

Parse::Token - Package compagnon de Lex.pm (Alpha 1.12).

SYNOPSIS

require 5.000;

BEGIN {		
  push(@INC,  ("$ENV{'HOME'}/lib/perl5")); # or PERL5LIB
}

use Parse::Lex;
@token = qw(
    ADDOP    [-+]
    INTEGER  [1-9][0-9]*
   );

$Token::debug = 0;
$lexer = Parse::Lex->new(@token);
$lexer->from(\*DATA);

$content = $INTEGER->next;
if ($INTEGER->status) {
  print "$content\n";
}
$content = $ADDOP->next;
if ($ADDOP->status) {
  print "$content\n";
}
if ($INTEGER->met(\$content)) {
  print "$content\n";
}
__END__
1+2

DESCRIPTION

Le package Token permet de définir les lexèmes utilisés par Parse::Lex. La méthode Lex::new() du package Parse::Lex crée indirectement un objet de type Token par lexème à reconnaître. Les méthodes next ou met du package Token permettent d'interfacer aisément l'analyseur lexical avec un analyseur syntaxique.

Le package Parse::Token n'est pas destiné à être directement utilisé. L'inclusion de ce package doit se faire par le biais d'un use Parse::Lex.

Méthodes

getstring

Retourne la chaîne de caractères reconnue au moyen du lexème.

mean

Retourne la fonction anonyme définie dans l'objet Token.

name

Retourne le nom symbolique de l'objet Token.

next

Active la recherche du lexème défini par l'expression régulière contenue dans l'objet. Si ce lexème est reconnu sur le flot de caractère à analyser alors next() retourne la chaîne trouvée et met le statut de l'objet à vrai.

new(SYMBOL_NAME, REGEXP, ANONYNOUS SUB)

Crée un objet de type Token. Les arguments de la méthode new() sont dans l'ordre : un nom symbolique, une expression régulière et une fonction anonyme.

REGEXP est soit une expression régulière simple, soit une référence à un tableau contenant : une ou plusieurs expressions régulières. Ce dernier cas permet de reconnaître un lexème dont le contenu peut être réparti sur plusieurs enregistrements, comme une chaîne de caractères délimitée par des guillemets, les commentaires du langage C, etc. Une telle spécification est surtout si les données à analyser proviennent d'un flot de caractères.

Les expressions régulières sont utilisées pour reconnaître :

1. le début du lexème,
2. le "corps" du lexème, si cette seconde expression est absente Parse::Lex utilise "(?:.*?)",
3. la fin du lexème, si cette dernière expression est absente on utilise la première.

La fin du lexème ne peut être à cheval sur plusieurs enregistrements.

La fonction anonyme est exécutée au moment ou le lexème est reconnu par l'analyseur lexical. Cette fonction possède deux arguments : $_[0] contient l'objet Token, $_[1] la chaîne reconnue par l'expression régulière. Le scalaire retourné par la fonction anonyme définit la chaîne de caractères mémorisée dans l'objet Token.

Dans la fonction anonyme vous pouvez utiliser les variables positionnelles $1, $2,... sachant que $1 contient la chaîne reconnue par l'expression régulière de l'objet Token.

newset

Peut être utilisé pour créer un ensemble de lexèmes qui ne sont pas dans l'automate d'analyse. On pourra pas exemple écrire :

%keywords = 
  qw (
      PROC  undef
      FUNC  undef
      RETURN undef
      IF    undef
      ELSE  undef
      WHILE undef
      PRINT undef
      READ  undef
     );
$lexer->newset(%keywords);

et installer ces tokens dans une table des symboles de la manière suivante :

foreach $name (keys %keywords) {
  $symbol{"\L$name"} = [${$name}, ''];
}

<${$name}> est l'objet Token.

Lors de la phase d'analyse lexicale on pourra utiliser les tokens de la manière suivante :

qw(IDENT [a-zA-Z][a-zA-Z0-9]*),  sub {		      
   $symbol{$_[1]} = [] unless defined $symbol{$_[1]};
   my $type = $symbol{$_[1]}[0];
   $lexer->tokenis((not defined $type) ? $VAR : $type);
   $_[1];
 }

Ce qui premet de requalifier IDENT.

met(EXPR)
met

Retourne le status du token. La chaîne consommée est disponible dans EXPR s'il s'agit d'une référence à un scalaire.

regexp

Retourne l'expression régulière définie dans l'objet Token.

set(EXPR)

La valeur de EXPR définit la chaîne de caractères associée au lexème.

status(EXPR)
status

Indique si la dernière recherche du lexème a réussie ou échouée. status(EXPR) permet de forcer le statut à la valeur retournée par l'évaluation d'EXPR.

trace()

Active/désactive une trace de l'analyse lexicale. Peut être utilisée comme une méthode de classe.

GESTION DES ERREURS

Pour traiter les cas de non reconnaissance de lexème vous pouvez définir un objet Token spécifique. Si la recherche de ce token réussie il est alors possible d'appeler une fonction dévolue au traitement des erreurs.

AUTEUR

Philippe Verdret.

AVERTISSEMENT

Je considère que la présente version de Token.pm/Lex.pm est expérimentale. Ce module peut notablement évoluer. J'aimerais recevoir vos remarques et vos suggestions.

REFERENCES

Friedl, J.E.F. Mastering Regular Expressions. O'Reilly & Associates 1996.

Groc, B., & Bouhier, M. - Programmation par la syntaxe. Dunod 1990.

Mason, T & Brown, D. - Lex & Yacc. O'Reilly & Associates, Inc. 1990.

COPYRIGHT

Copyright (c) 1995-1997 Philippe Verdret. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

3 POD Errors

The following errors were encountered while parsing the POD:

Around line 39:

Non-ASCII character seen before =encoding in 'définir'. Assuming CP1252

Around line 51:

'=item' outside of any '=over'

Around line 174:

You forgot a '=back' before '=head1'