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'objetToken
.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'