2016-07-13
Mise à jour : 2017-03-13

Le fichier pdf intitulé Parsing and Evaluating Mathematical Expression in Object Pascal contient une description du code d'un analyseur syntaxique des expressions mathématiques écrit dans le dialecte Free Pascal du Pascal object. Comme dans la version pour Delphi, l'analyseur est présenté en quatre ensembles d'unités de plus en plus complexes. Il n'y a pas de modification importante de l'analyseur initialement écrit avec le dialecte Delphi. Mais la version du code élaboré avec Free Pascal contient des ajouts et est quelques améliorations, du moins je l'espère. J'espère aussi que la documentation est meilleure. Malheureusement elle ne demeure disponible qu'en anglais. L'analyseur original ainsi que la documentation sont encore disponibles.

Les fichiers source des quatre versions de plus en plus complexes de l'analyseur sont :

  1. Parsing a Simplified Grammar
  2. More Mathematical Operations and Comments
  3. Adding Constants, Functions and Variables
  4. Extended National Language Support

Enfin, l'archive simpleparser_package.zip est un paquet contenant les unités formant l'analyseur et pouvant être intégré à l'EDI Lazarus. Notons qu'il ne contient pas de composant à être installé dans la palette de l'EDI.

Mise à jour

En exécutant le programme de démonstration tcalc, j'ai remarqué qu'il a affiché un avertissement :

michel@hp:~/Documents/Lazarus/simpleparser/tcalc$ ./tcalc (tcalc:4751): Gtk-WARNING **: Impossible de trouver le moteur de thème dans module_path : « pixmap » Utilisation : tcalc [(--LANG|-l) ln] ( -? identificateur | --Help | "expression" )"

Voilà qui était bizarre, car tcalc est une application console, qui n'utilise pas une bibliothèque graphique comme Gtk. De plus, cet avertissement ne figure pas dans la version précédente de tcalc.

Le problème a été assez facile à identifier parce que le changement le plus significatif dans la dernière version est l'ajout du support linguistique. Implicitement SetDefaultLang trouvé dans LCLTranslator (utilisé dans DefaultTranslator) sélectionne le fichier de traduction au démarrage du programme. Il s'avère que l'unité Interfaces est nécessaire et il tire le LCL paquet entier. Sans Interfaces le code ne compile pas. Et avec cette unité, il ne compile pas en utilisant le paquet LCLBase au lieu du paquet LCL. Il s'avère que SetDefaultLang veut traduire tous les fiches du projet. Il n'y en a pas dans tcalc mais l'unité ne le sait pas.

J'ai donc décidé d'éliminer le code de traduction des fiches et d'enregistrer cette version modifiée dans une unité appelée UnitTranslator. Il ne nécessite pas l'unité Interfaces et le paquet LCL peut être remplacé par le paquet LCLBase . J'ai expliqué plus en détail les changements apportés. Si vous êtes intéressé, allez ici.

Tant qu'à y être, j'ai nettoyé les archives, en supprimant certains fichiers inutiles. Mis à part les changements ci-dessus à tcalc il n'y a pas de changement substantiel dans les archives téléchargeables.