**************************************************
tcLex : un générateur d'analyseur lexical pour Tcl
**************************************************
INTRODUCTION
tcLex est une extension Tcl servant à générer des lexeurs (analyseur lexical).
Elle est inspirée des commandes Unix et GNU lex et flex, qui sont des "outils
pour générer des programmes effectuant des 'pattern-matching' sur du texte".
tcLex est très similaire à ces programmes, à part qu'elle utilise la philosophie
et la syntaxe de Tcl, tandis que les autres utilisent leur propre syntaxe et
sont utilisés en conjonction avec le langage C. Les personnes habituées à lex ou
flex devraient donc se sentir familier avec tcLex. tcLex est une petite
extension (la version compilée pour Windows fait environ 20ko, et le source
environ 150ko), parce qu'il utilise au maximum la bibliothèque Tcl. Cependant,
la présente n'utilise plus le code de regexp de Tcl, mais une version modifiée
est maintenant incluse dans tcLex, ce qui la rend légèrement plus grosse (de
quelques ko). tcLex devrait fonctionner avec Tcl 8.0 et ultérieurs. tcLex ne
marchera JAMAIS avec des versions plus anciennes, parce qu'elle utilise le
nouveau système d'"objets" de Tcl 8.0 pour des raisons de performance. Les
caractéristiques les plus intéressantes sont :
* support multi-plateforme, grâce à Tcl. Bien qu'elle ait été développée sur
Windows et testée sur Windows et Unix, elle devrait fonctionner sur d'autres
plateformes si une version de Tcl existe sur celles-ci. Les plateformes
supportées par Tcl sont Windows 95/NT, Unix (Linux, Solaris...) et Macintosh.
D'autres plateformes sont VMS, OS/2, NeXTStep, Amiga...
* contrairement à lex et flex, qui génèrent uniquement des lexeurs statiques
écrits en C et destinés à être compilés, tcLex génère dynamiquement des
commandes Tcl qui peuvent être utilisées comme d'autes commandes C ou des
procédures Tcl à partir de scripts Tcl ou de programmes C.
* elle utilise les expressions régulières de Tcl. Ce qui signifie que vous
n'avez pas à apprendre un nouveau langage de regexp.
* elle fonctionne avec les "namespaces" de Tcl
* les commandes générées peuvent être utilisées en une passe ou
incrémentallement, car elles maintiennent des informations d'état. Ainsi,
plusieurs instances du même lexeur (par exemple un parseur HTML) peuvent
tourner simultanément dans des contextes distincts et maintenir des états
également distincts (variables locales...). Les lexeurs n'ont pas besoin
d'être spécialement conçus pour être utilisés incrémentallement, le même
lexeur peut être utilisé en une passe ou incrémentallement de façon
transparente. Cette caractéristique est particulièrement utile lors du
traitement de texte issu d'un fichier ou d'une socket Internet (pages Web par
exemple), quand les données ne sont pas nécessairement disponibles au début
du traitement.
VERSION
La version actuelle de tcLex est 1.2a1. Le suffixe "a1" signifie "alpha 1", ce
qui veut dire que cette version est une version incomplète par rapport aux
fonctions de la future 1.2, qui étend et corrige la précédente. Le fichier
changements.txt décrit les changements effectués entre la première version de
tcLex et la version actuelle. Bien que ce soit une version alpha, elle apporte
plus de corrections de bugs que de nouveaux ;-). Dans ce cas, alpha signifie que
de nombreuses fonctions prévues ne sont pas encore implémentées, et la
documentation peut être incomplête. La plupart des informations utiles sont dans
le fichier changements.txt. Le fichier AFAIRE.txt contiens les fonctions prévues
qui ne sont pas encore implémentées.
POURQUOI TCLEX ?
Quand j'ai décidé d'écrire tcLex, j'avais besoin d'une façon efficace de parser
des fichiers HTML et CSS, dans le but de construire un navigateur Web (un de mes
projets à long terme). J'essayais dans ce but d'utiliser les commandes intégrées
de Tcl (regexp, regsub...). Bien qu'un parseur HTML basique fut assez simple à
écrire, les limites de l'approche classique commencèrent à apparaitre avec CSS.
J'avais besoin de limiter le champ d'action des commandes regexp/regsub à des
zones spécifiques du texte parsé, selon certaines règles lexicales.
Par exemple, la manière classique de transformer un fichier HTML en liste Tcl
(pour un traitement plus aisé) est de remplacer (avec "regsub") les séparateurs
de balises HTML (<>) avec des délimiteurs de liste Tcl (méthode inaugurée par
Stephen Uhler dans sa html_lib), ou par des crochets pour une évaluation
ultérieure avec "subst" ou "eval". Les problèmes commencent à apparaitre quand
les séparateurs HTML sont utilisés dans les chaines de caractères pour les
valeurs d'attributs (par exemple, "
"), dans ce cas cette
méthode ne marche pas et la liste générée est invalide. De plus, parser des
fichiers malformés échouera certainement et génèrera une erreur. A part cela,
les performances ne sont pas garanties, et perticulièrement si vous voulez
respecter les standards et gérer tous les cas d'erreurs, et aussi parce que
plusieurs passes sont nécessaires.
J'ai ensuite envisagé d'écrire des extension spécifiques en C pour parser ces
fichiers, en utilisant des lexeurs écrits avec lex ou flex, mais le problème est
qu'on a besoin d'une extension par type de fichier. De plus, ces parseurs sont
statiques et non extensibles, même si leur base est la même.
J'ai enfin décidé d'écrire une extension Tcl permettant d'écrire des lexeurs.
Elle essaye d'abord de suivre la philosophie et la syntaxe de (f)lex tout en les
adaptant à Tcl. Elle utilise ensuite la syntaxe de ligne de commande et les
expressions régulières de Tcl, et des scripts Tcl à la place de code C. Elle
crée également des commandes Tcl dynamiques au lieu de fichiers C destinés à
être compilés. L'idée derrière cela est d'écrire un "lexeur générique" qui
serait scriptable et extensible avec Tcl. Ainsi, seule une extension est requise
quelle que soit le type de données texte.
OU OBTENIR TCLEX
Page d'accueil :
http://www.multimania.com/fbonnet/Tcl/tcLex/index.htm
Fichiers de distribution :
- http://www.multimania.com/fbonnet/pub/tcLex12a1.zip
(binaires Windows pour Tcl8.0.5, Tcl8.1.1 et Tcl8.2)
- http://www.multimania.com/fbonnet/pub/tcLex1.2a1.tar.gz
(sources Windows/Unix pour Tcl8.0.5, Tcl8.1.1 et Tcl8.2)
- http://www.multimania.com/fbonnet/pub/tcLex1.2a1.patch
(fichier correctif pour la version 1.1.4)
SUPPORT
Depuis le 17/11/1998, tcLex dispose d'une liste de diffusion dédiée. Le site Web
de cette liste est : http://www.eGroups.com/list/tclex .
Pour souscrire a cette liste, envoyez un e-mail à l'adresse suivante :
tclex-subscribe@egroups.com .
J'essaie également de répondre à tous les messages que les utilisateurs
m'envoient concernant tcLex.
COMPILER L'EXTENSION
Si vous voulez compiler tcLex vous-même, vous devez savoir qu'elle a besoin des
sources Tcl pour compiler car elle utilise quelques structures internes. Elle
peut être compilée avec Tcl 8.0, 8.1 ou 8.2.
* Windows:
Des bibliothèques précompilées sont disponibles dans une distribution binaire
distincte. Cependant, vous pouvez compiler l'extension vous-même. Allez dans le
répertoire "src", éditez le fichier "makefile.vc" pour Microsoft Visual C++ (pas
de Borland pour l'instant, des volontaires :-) et éditez les différentes
variables pour refléter votre propre installation (compilateur, Tcl...).
Ensuite, tapez sur la ligne de commande :
nmake -f makefile.vc
Une fois la compilation réussie, tapez :
nmake -f makefile.vc install
Et il copiera les fichiers requis dans un sous-répertoire du répertoire "lib" de
Tcl, afin qu'elle puisse être utilisée avec "package require tcLex".
* Unix:
(Merci à John Ellson pour ces fichiers et instructions)
Pour compiler tcLex sur des systèmes Unix, tapez:
cd src
chmod u+x configure
chmod u+x install-sh
./configure
make
make install
Le script de configuration tentera de déduire une variable $PREFIX d'une
installation existante de Tcl. Vous pouvez toujours utiliser l'option
--prefix=... si tclsh n'est pas dans votre $PATH, ou si différents tclsh sont
installés.
Le Makefile généré utilise le fichier $PREFIX/lib/tclConfig.sh laissé par la
compilation de Tcl pour la plupart de ses paramètres de configuration.
Le Makefile généré crée un fichier a pkgIndex.tcl compatible avec Tcl7.6 et
ultérieurs.
* MacOS:
Il n'y a pas de makefile pour cette plateforme pour l'instant, cependant la
compilation devrait être facile, il n'y a que deux fichiers C. Les seules choses
dont le source a besoin sont les variables TCLEX_VERSION, BUILD_tcLex et
USE_TCL_STUBS (si applicable) définies à la compilation. Vous pouvez jeter un
oeil au makefile pour Windows.
INSTALLATION DES BINAIRES
Windows:
Trois bibliothèques précompilées sont fournies avec la distribution binaire,
nommés tcLex80.dll, tcLex81.dll et tcLex82.dll, respectivement pour Tcl 8.0, 8.1
et 8.2. Copiez-les simplement avec le fichier pkgIndex.tcl dans un
sous-répertoire de votre choix dans le répertoire "lib" de Tcl.
MacOS, Unix:
Pas de distribution binaire pour l'instant.
DOCUMENTATION
Le répertoire doc contient la documentation de tcLex dans des fichiers HTML. La
documentation est disponible en anglais (sous-rép en) et français (sous-rép fr).
Lisez-la attentivement.
CONTACT, COMMENTAIRES, BUGS, etc.
* Veuillez s'il vous plait lire la license (fichier license.txt, en anglais
uniquement), et spécialement la "beerware clause" ;-) traduite ici :
" Ce logiciel est freeware. Cependant, il fait également partie de la catégorie
spéciale "beerware". C'est-à-dire que si vous trouvez ce logiciel utile, ou que
vous l'utilisez tous les jours, ou voulez me remercier pour ma modeste condition
à la communauté Tcl, vous pouvez m'envoyer une bière d'une vos brasseries
locales. Ma préférence va aux bières d'abbaye de Belgique, à la cerveza
mexicaine Corona, et à la stout irlandaise (Guiness for strength!), mais
j'apprécie aussi les bières exotiques, rares ou originales d'un peu partout
(note : je vis en France), et particulièrement celles avec un emballage ou un
goût originaux. "
* Veuillez envoyer les bugs ou vos commentaires à .
Les rapports de bugs et le retour utilisateur sont les seules façons que
j'envisage pour améliorer et corriger tcLex. Si personne n'utilise tcLex je ne
vois aucune raison pourquoi je devrais améliorer cette extension sauf pour mon
usage personnel (pour lequel tcLex est plus qu'adéquat pour le moment)
* Même si vous n'avez aucun commentaire, j'apprécierais que chaque utilisateur
de tcLex m'envoie un mail à l'adresse mentionnée ci-dessus. Cela me donne des
informations sur le nombre d'utilisateurs qui est une part importante de ma
motivation. Je n'utiliserai pas votre adresse pour vous envoyer des messages
non sollicités, du spam, ou la vendre à des "télémarquetteurs", mais
uniquement pour garder une trace des utilisateurs.
* Si vous trouvez un bug, un court script Tcl qui le met en évidence serait très
utile, ou encore mieux, compilez avec debugging et spécifiez où il a planté
dans ce script Tcl.
POUR CONTRIBUER
Comme j'utilise uniquement MS Visual C++ sous Windows, j'apprécierai des
contributions de gens fournissant des makefiles pour d'autres compilateurs, des
fichiers GNU autoconf, ou mieux, des extensions compilée pour des distributions
binaires sur Macintosh et Unix (particulièrement Linux et Solaris).
J'aimerai aussi réunir tous les lexeurs faits avec tcLex en un seul endroit (une
page Web par exemple) comme une ressource de valeur pour la communauté Tcl. Des
contributions intéressantes seraient par exemple des parseurs pour HTML, XML,
CSS, JavaScript et d'autres langages du Web.