Lex.fr


NAME

Parse::Lex - Ginirateur d'analyseurs lexicaux (Alpha 1.18).


SYNOPSIS

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"


DESCRIPTION

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

Mithodes

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.


EXEMPLES

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 .


BUGS

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.


AUTEUR

Philippe Verdret


AVERTISSEMENT

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.


REFERENCES

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

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.