Lex.fr
Parse::Lex
- Ginirateur d'analyseurs lexicaux (Alpha 1.18).
require 5.004;
use Parse::Lex;
@token = (
qw(
ADDOP [-+]
LEFTP [\(]
RIGHTP [\)]
INTEGER [1-9][0-9]*
NEWLINE \n
),
qw(STRING), [qw(" (?:[^"]+|"")* ")],
qw(ERROR .*), sub {
die qq!can\'t analyze: "$_[1]"!;
}
);
Parse::Lex->trace; # Class method
$lexer = Parse::Lex->new(@token);
$lexer->from(\*DATA);
print "Tokenization of DATA:\n";
TOKEN:while (1) {
$token = $lexer->next;
if (not $lexer->eoi) {
print "Line $.\t";
print "Type: ", $token->name, "\t";
print "Content:->", $token->getstring, "<-\n";
} else {
last TOKEN;
}
}
__END__
1+2-5
"multiline
string with an embedded \" in it"
this is an invalid string with an embedded \" in it"
La classe Parse::Lex
permet de crier des analyseurs lexicaux. Un
analyseur lexical est spicifii au moyen d'un liste de lexhmes (token)
passie en argument ` la mithode
new
de la classe Parse::Lex
.
Parse::Lex
ne fonctionne qu'avec perl 5.004. Si votre version est
antirieure, utilisez la sous-classe Parse::CLex
.
Les analyseurs giniris par ces deux classes exploitent des stratigies
d'analyse diffirentes :
1. Parse::Lex
utilise
pos()
, associi ` ``\G'' pour
effectuer l'analyse,
2. Parse::CLex
effectue une analyse avec consommation des
tokens reconnus.
Attention ! Les analyseurs de la classe Parse::CLex
ne permettent
pas d'utiliser des expressions rigulihres avec ancrage.
Les lexhmes sont des objets de la classe Parse::Token
, livri avec
Parse::Lex
. La difinition d'un lexhme comporte ordinairement deux
arguments : un non symbolique (comme INTEGER
), suivi d'une
expression rigulihre. Si une fonction anonyme est donnie en troisihme
argument, elle est exicutie lorsque le lexhme est reconnu. Le retour
de cette fonction sera le contenu du token.
L'ordre dans lequel l'analyseur lexical examine les expressions
rigulihres est ditermini par l'ordre dans lequel ces expressions sont
passies en argument ` la mithode
new
. Le lexhme retourni par
l'analyseur lexical correspond ` la premihre expression qui s'apparie
avec le dibut du flot de caracthres ` analyser (la stratigie est
diffirence de celle adoptie par l'analyseur lexical ``lex'' qui retourne
la plus longue channe de toutes celles qu'il est possible de
reconnantre). Le lexhme est un objet de la classe Parse::Token
.
L'analyseur peut jtre utilisi pour analyser une channe de caracthres
isolie ou un flot de donnies provenant d'une entrie quelconque. En
fin de flot l'analyseur retourne un objet Token dont le nom est EOI
(End Of Input).
-
buffer EXPR
-
-
buffer
-
Retourne le contenu du buffer interne ` l'analyseur lexical. Avec
une expression en argument, place le risultat de l'expression dans le
buffer.
-
eoi
-
Retourne vrai lorsqu'il n'y a plus de donnies ` analyser.
-
every ANON
-
Ivite de devoir icrire une boucle de lecture pour analyser un flot de
donnies.
ANON
est une fonction anonyme executie aprhs la
reconnaissance de chaque lexhme.
Pour segmenter la channe ``1+2'' on peut par exemple icrire :
use Parse::Lex;
$lexer = Parse::Lex->new(
qw(
ADDOP [-+]
INTEGER \d+
));
$lexer->from("1+2");
$lexer->every (sub {
print $_[0]->name, "\t";
print $_[0]->getstring, "\n";
});
Le premier argument de la fonction anonyme est l'objet Token reconnu.
-
from EXPR
-
from
permet d'indiquer la source des donnies ` analyser.
L'argument de cette mithode peut jtre une rifirence ` un filehandle ou
une liste de channes de caracthres.
Exemple.
$lexer->from(\*DATA);
$lexer->from('les données à analyser');
-
flush
-
Si la conservation des channes consommies est activie,
flush
retourne et vide le buffer contenant les channes de caracthres
reconnues jusqu'ici.
-
getsub
-
getsub
retourne la fonction anonyme rialisant l'analyse lexicale.
Exemple.
my $token = '';
my $sub = $lexer->getsub;
while (($token = &$sub($lexer)) ne $Token::EOI) {
print $token->name, "\t";
print $token->getstring, "\n";
}
-
hold EXPR
-
-
hold
-
Active/desactive la conservation des channes consommies. Retourne la
valeur courante. Peut jtre utilisie comme mithode de classe.
On peut obtenir le contenu du buffer au moyen de la mithode
flush
qui a igalement pour effet de vider le buffer.
-
less EXPR
-
La valeur de EXPR est placie au dibut du flot de donnies.
-
next
-
Provoque la recherche du prochain lexhme. Retourne l'objet Token
reconnu. Retourne l'objet
Token::EOI
en fin de donnies.
Exemples.
$lexer = Parse::Lex->new(@token);
print $lexer->next->name; # print the token type
print $lexer->next->text; # print the token content
-
new
-
Crie et retourne un nouvel analyseur lexical. L'argument de la mithode
est une liste de triplets comportant : le nom symbolique du lexhme,
l'expression rigulihre nicessaire ` sa reconnaissance et
iventuellement une fonction anonyme exicutie lors de la reconnaissance
du lexhme. Pour chaque triplet, un objet de type
Parse::Token
est
crii.
L'analyseur lexical construit par
new
cherche tour ` tour ` apparier
chaque expression rigulihre avec le dibut du flot de donnies `
analyser. L'ordre examen des expressions rigulihres est donni par
l'ordre dans lequel elles sont passies en argument ` la mithode
new
.
Parse::Lex
peut reconnantre des lexhmes disposis sur plusieurs
enregistrements. Si le motif du dibut est trouvi, l'analyseur va en
chercher la fin, et si besoin est, lire de nouveaux
enregistrements. Attention, il n'y a pas de rebroussement en cas
d'ichec.
-
newset
-
Peut jtre utilisi pour crier un ensemble de lexhmes qui ne sont pas
dans l'automate d'analyse. On pourra pas exemple icrire :
%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 manihre
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 manihre suivante :
qw(IDENT [a-zA-Z][a-zA-Z0-9]*), sub {
$symbol{$_[1]} = [] unless defined $symbol{$_[1]};
my $type = $symbol{$_[1]}[0];
$lexer->settoken((not defined $type) ? $VAR : $type);
$_[1]; # THE TOKEN CONTENT
}
Ce qui permet d'indiquer que tout symbole dont le type est inconnu est
une variable.
Remarque. La fonction anonyme associie au token regoit en argument
l'objet token. Le contenu du token est le retour de la fonction anonyme.
-
offset
-
Retourne le nombre de caracthres dij` consommi depuis le dibut du flot
de donnies analysi.
-
pos EXPR
-
-
pos
-
pos EXPR
fixe la position de dibut du prochain token ` reconnantre
dans l'enregistrement courant.
pos
Retourne le nombre de caracthres
dij` consommi dans l'enregistrement courant.
-
readline
-
Effectue la lecture des donnies sur l'entrie spicifiie par la
mithode
from
. Retourne le risultat de la lecture.
-
recordno
-
Retourne le numiro de l'enregistrement courant. Retourne toujours 1 si
on analyse une channe de caracthres. La mithode readline incrimente ce
numiro.
-
reset
-
Vide le buffer interne ` l'analyseur lexical et efface tout token dij`
reconnu.
-
skip EXPR
-
-
skip
-
EXPR
est une expression rigulihre difinissant le siparateur de
lexhme (par difaut [ \t]+
). Retourne ce siparateur si EXPR
est
omis. Peut jtre utilisie comme mithode de classe.
Attention ! Le changement du motif ` ``sauter'' provoque une
recompilation de l'analyseur lexical.
-
token
-
Retourne l'objet correspondant au dernier lexhme reconnu. En l'absence
de token lu, retourne un token spicial dont le nom est C
-
settoken TOKEN
-
Force le lexhme `
TOKEN
. Utile pour requalifier un lexhme `
l'intirieur de la fonction anonyme associie ` ce lexhme.
A terme annule et remplace la mithode tokenis(TOKEN).
-
trace OUTPUT
-
-
trace
-
Mithode de classe qui active le mode trace. L'activation du mode
trace doit avoir lieu avant la criation de l'analyseur lexical. Le
mode peut jtre ensuite disactivi par un nouvel appel de la mithode.
OUTPUT
peut jtre un nom de fichier ou une rifirence ` un
filehandle vers laquelle la trace va jtre dirigie.
ctokenizer.pl - Segmentation d'un flot de donnies au moyen
de la classe Parse::CLex
.
tokenizer.pl - Segmentation d'un flot de donnies au moyen
de la classe Parse::Lex
.
every.pl - Utilisation de la mithode
every
.
Parse::Lex
ne fonctionne qu'avec perl 5.004. Si votre version de
Perl est antirieure, utilisez la classe Parse::CLex
.
Les analyseurs de la classe Parse::CLex
ne permettent pas
d'utiliser des expressions rigulihres avec ancrage.
Philippe Verdret
Je considhre que la prisente version des classes Token.pm/Lex.pm est
expirimentale. Ces classes peuvent ivoluer de fagon notable, en
particulier en fonction des remarques et des suggestions que vous
voudrez bien m'envoyer.
Friedl, J.E.F. Mastering Regular Expressions. O'Reilly & Associates
1996.
Mason, T & Brown, D. - Lex & Yacc. O'Reilly & Associates, Inc. 1990.
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.