Sujet : Bienvenu à Hoa_Compiler

Hey smile,

Je voulais vous signaler qu'un nouveau paquetage vient de naître : Hoa_Compiler.

Pour ceux qui me suivent sur Twitter (http://twitter.com/hoaproject) ou Identica (http://identi.ca/hoaproject), vous saviez que je le préparais.
Pourquoi avoir besoin d'un compilateur ? Car j'en ai besoin (sans déc' …) pour Hoa_Test, pour Hoa_Json, pour Hoa_Yaml etc.
Pour Hoa_Test car j'ai mon propre langage de test : Praspel (motivation principale).
Pour Hoa_Json si jamais le module JSON n'est pas activé.
Pour Hoa_Yaml car l'analyseur actuel est tout pourri …

Bref, c'est un besoin récurrent en ce moment. Et comme il n'en existe pas des masses en PHP, bah j'ai fait le mien. Vous vous en doutez, je n'ai rien fait au hasard. Il est extensible car je nourris un doux fantasme depuis pas mal de temps qui consiste à faire un compiler compiler plus tard (un compilateur de compilateur, à l'instar de JavaCC/JJTree ou Flex/Bison).

Pour l'instant, je l'ai fait pour les besoins de mon projet actuel concernant les tests. Il est donc dédié à des grammaires LL(1) uniquement (une autre classe sera dédiée aux grammaire LL(k) et encore une autre aux grammaires LALR pour des raisons évidentes de performances), mais la gestion d'erreurs est très fine (numéro de ligne et de colonne dans toutes les situations), les tampons sont automatiquement supportés, expressions régulières type PCRE supportées etc.

J'ai un exemple en ligne d'utilisation de Hoa_Compiler_Ll1 : http://dropbox.android-bay.net/LL1.phps.
Vous trouverez les sources (très rudimentaires pour l'instant) dans le tronc de Hoa à partir de la révision 662.

Voilà. Ça sert à prouver que je ne glande pas tongue. Désolé si j'ai du mal à tenir mes promesses sur l'orientation du projet mais j'ai du mal à partager mon temps entre l'université et Hoa hmm. J'arrive déjà à dormir de temps en temps, je suis content …

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

2

Re : Bienvenu à Hoa_Compiler

Parfait !

Le code c'est comme le paic citron, quand il y en a plus... il y en a encore !

3

Re : Bienvenu à Hoa_Compiler

J'avoue que ça me plaît ce compileur LL(1) ! smile

Ca serait bien de pouvoir définir les transitions avec un "graphe", plutôt que la liste exhaustive. Remarque quand on à un peu l'habitude le tableau se lit bien aussi.

J'ai juste rien capté aux actions, c'est quoi ? ^^

Très intéressant sinon. Bravo !

4

Re : Bienvenu à Hoa_Compiler

La table de transitions est une représentation du graphe. Il existe des algorithmes pour passer de l'un à l'autre. C'est un peu comme coder un graphe sous forme de listes d'adjacences, sauf qu'on y représente les transitions plutôt que les états.

La liste des actions permet d'automatiser des choses. Prenons le cas des valeurs supérieures à zéro : elle permette d'arriver à un point précis dans le switch (de la méthode consume), donc ce sont des liens vers des points du programme (le switch peut encore redirigé sur des méthodes si besoin bien sûr), des sortes de goto dynamiques tongue.
Si la valeur de l'action est inférieure à zéro, alors ce sont des actions spéciales (repérées par le paquetage et sur lesquelle l'utilisateur ne peut pas intervenir … pour l'instant). Ainsi, -1 permet de remplir le tampon 0, et -2 permet de le vider. Mais -3 remplit le tampon 1 etc. En fait : -x remplit le tampon (x - 1) / 2 et -x - 1 vide le tampon (x - 2) / 2. Un bête décalage quoi.
C'est comme ça que je remplis les tampons pour les clés et les valeurs dans mon exemple, ça se fait automatiquement.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

5

Re : Bienvenu à Hoa_Compiler

Coucou,

Ton exemple en ligne ne fonctionne plus... Je souhaiterais savoir s'il était possible de faire un parseur SASS avec (un truc ruby pour écrire des feuilles de style, dérivé du HAML). Sans l'exemple, ça me paraît difficile de vérifier.

Merci !

6

Re : Bienvenu à Hoa_Compiler

Maintenant Hoa_Compiler supporte les sous-automates. C'est beaucoup plus puissant et plus rapide. Je vais recoder un exemple demain dans la journée, c'était prévu smile.

L'idée est que tu as tes sous-automates liés par des transitions-epsilon, et qu'un état doit d'abord rentrer et sortir de son sous-automate lié avant de continuer. Ça permet d'avoir des boucles assez complexes ou de mieux gérer les parenthèses, accolades etc., bref : tout ce qui aurait besoin de piles.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

7

Re : Bienvenu à Hoa_Compiler

Je m'en vois ravi ! Je sens que ça va gérer, ça va diminuer la complexité de l'ensemble en regroupant les états et transitions indépendants en plus petits groupes.
J'ai hâte de tester ! smile

8

Re : Bienvenu à Hoa_Compiler

Surtout qu'à la déclaration, ça ne change pas grand chose. Au lieu d'avoir un tableau pour la table de transitions, on aura un tableau de tableau. Pareil pour les tokens, skip, actions etc.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

9

Re : Bienvenu à Hoa_Compiler

Hoa_Compiler est terminé je pense smile.

J'ai ajouté le support des lignes et colonnes pour chaque lexème (obligatoire pour une belle gestion d'erreur entre autre) accessibles via les attributs line et column. L'exemple est remis en ligne : http://dropbox.android-bay.net/Ll1.phps. On notera que plus aucun compteur n'est dorénavant nécessaire. En effet, Hoa_Compiler est maintenant un beau compilateur LL(1) basé sur des sous-automates à pile, c'est à dire qu'on a une « récursivité » (émulée). Plus besoin donc de trucs et astuces pour compter les parenthèses, accolades, crochets etc. (tout élémentaire formant une paire tout du moins).

Je vous laisse lire l'exemple, il est a priori parlant.

Maintenant je reprends Hoa_Test (pour mes recherches à l'Université) et j'attaque Hoa_Xml (nécessaire pour XYL wink).

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

10

Re : Bienvenu à Hoa_Compiler

Fatal error: Class Foo contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Hoa_Compiler_Ll1::pre) in C:\wamp\www\tests\hoa-sass\index.php on line 38

Je voulais m'y mettre aujourd'hui, c'est ballot que t'as changé des trucs entre-temps. En plus aucune version tagué n'existe pour ça, et j'ai pas spécialement envie de prendre tout le SVN pour récupérer une révision en particulier. ^^

Tu as déjà mon mail normalement. wink