NAME

Lex - Générateur d'analyseurs lexicaux (Alpha 1.07).

SYNOPSIS

        @tokens = (
                   'ADDOP' => '[-+]', 
                   'LEFTP' => '[(]',
                   'RIGHTP' => '[)]',
                   'INTEGER' => '[1-9][0-9]*',
                   'NEWLINE' => '\n',
                   'STRING' => '["]', sub {
                     my $self = shift;
                     my $string = $';
                     my $buffer = $string;
                     while($string !~ /"/) {
                           $string = $self->readline;
                           $buffer .= $string;
                     }
                     $buffer =~ s/^[^"]*"//;
                     $self->set($buffer);
                     qq!"$&!;           # token content
                   },
                   'ERROR' => '.+',
                  );

        $lexer = Lex->new(@tokens);
        $lexer->from(\*DATA);
        print "Tokenization of DATA:\n";

        TOKEN:while (1) {
          $token = $lexer->nextToken;
          if (not $lexer->eof) {
            print "Line $.\t";
            print "Type: ", $token->name, "\t";
            print "Content:->", $token->get, "<-\n";
          } else {
            last TOKEN;
          }
        }

        __END__
        1+2-5
        "multiline
        string"

PACKAGE LEX

Le package Lex permet de créer des analyseurs lexicaux. Ce package a été écrit pour être utilisé avec le package LLg qui permet de définir des analyseurs syntaxiques pour des grammaires LL.

L'analyseur lexical est chargé de la reconnaissance des lexèmes. Ces lexèmes sont définis par les expressions régulières données en paramètre à la méthode new(). L'ordre dans lequel l'analyseur lexical génèré examine les expressions régulières est déterminé par celui dans lequel ces expressions sont passées en paramètre.

L'analyseur lexical retourne des objets définis dans le package Token fournis avec Lex.

Méthodes

chomp()

Active/désactive le retrait du caractère nouvelle-ligne des lignes lues.

debug()

Active/désactive une trace.

eof()

Retourne vraie si la fin de fichier est rencontrée.

from()

from() permet d'indiquer quelle est la source des données à analyser. L'argument de cette méthode est une référence à un filehandle ou une liste de chaînes de caractères . Par exemple :

        $symbol->from(\*DATA);

ou

        $symbol->from('les données à analyser');
less(EXPR)

Cette méthode accepte en argument un expression dont la valeur est placée au début du flot de données.

new()

Crée un nouvel analyseur lexical. L'argument de la méthode est une liste de triplets comportant : le nom symbolique du lexème, l'expression régulière nécessaire à sa reconnaissance et éventuellement une fonction anonyme exécutée au moment ou le lexème est reconnu. Pour chaque triplet new() crée un objet de type Token. L'analyseur lexical construit par la méthode new() cherche tour à tour à apparier chaque expressions régulières avec le début du flot de données à analyser. L'ordre examen des expressions régulières est fixé par l'ordre dans lequel elles sont données en paramètre.

reset()

Vide le buffer interne à l'objet Lex et efface tout token déjà reconnu.

buffer()
buffer(EXPR)

Retourne le contenu du buffer interne au package Lex. Avec une expression en argument, place le résultat de l'expression dans le buffer.

singleline()

Active/désactive la lecture de nouvelles données.

skip(RE)

RE est une expression régulière définissant le séparateur de lexème (par défaut [ \t]+).

readline()

Effectue la lecture des données sur l'entrée définie pour le lecteur (voir la méthode from()). Retourne le résultat de la lecture.

token()

Retourne l'objet correspondant au dernier lexème consommé. En l'absence de token lu, retourne un token spécial dont le nom symbolique est default token.

PACKAGE TOKEN

Le package Token permet de définir les lexèmes utilisés par Lex. Les objets de ce type sont en principe créés par la méthode new() du package Lex.

Méthodes

debug()

Active/désactive une trace indiquant quels sont les lexèmes trouvés.

get()

Retourne la chaîne de caractères reconnue par le lexème.

mean()

Retourne la fonction anonyme associée à l'objet Token.

name()

Retourne le nom symbolique de l'objet.

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()

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 éventuellement une fonction anonyme. La fonction anonyme est exécutée au moment ou le lexème est consommé par l'analyseur lexical. Le scalaire retournée par la fontion définit la chaîne de caractère mémorisée dans l'objet et retournée par la méthode get().

regexp()

Retourne l'expression régulière qui a permis la reconnaissance de l'objet Token.

status()

Indique si la dernière recherche du lexème a réussie ou échouée.

GESTION DES ERREURS

Pour traiter les cas de non reconnaissance de lexèmes vous pouvez définir un objet Token spécifique, par exemple :

        $ERROR = Token->new('.+');

Si la recherche de ce token réussie il est alors possible d'appeler une fonction dévolue au traitement des erreurs.

EXEMPLES

tokenizer.pl - Illustre la lexématisation d'un flot de données au moyen du package Lex.

AUTEURS

Philippe Verdret.

EXTENSIONS

Des extensions et optimisations sont possibles.

BUGS

REFERENCES

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-1996 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.

5 POD Errors

The following errors were encountered while parsing the POD:

Around line 3:

Non-ASCII character seen before =encoding in 'Générateur'. Assuming CP1252

Around line 67:

'=item' outside of any '=over'

Around line 141:

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

Around line 149:

'=item' outside of any '=over'

Around line 190:

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