************************************************** 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, "=> home"), 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.