CRÉER UN PARSEUR LL

cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013 - 18 avril 2011 à 09:53
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 - 18 avril 2011 à 15:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53061-creer-un-parseur-ll

Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
18 avril 2011 à 15:53
Merci ^^

Pour être honnête je suis allergique aux maths aussi mais je pense que l'on peu décrire le fonctionnement sans passer par la, j'essayerai en tout cas ;)
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
18 avril 2011 à 14:55
J'ai hâte de lire ton tuto car je suis un peu imperméable aux formules mathématiques et théoriques et le site de Levee ne m'a pas plus aidé. Je trouve que la théorie des ensembles embrouille plus que n'explique, un bon tuto et une bonne dose de vulgarisation ne ferais pas de mal :))) surtout qu'après quelques recherches acharnées sur google j'ai rien trouvé de convaincant.

Bon courage pour ton tuto et merci pour cette source :)
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
18 avril 2011 à 12:13
En fait il faudrai que j'écrive un tuto dessus pour bien expliquer le principe d'un parseur llk, il y a beaucoup de notions que je n'ai pas aborde dans cette source parce que je voulais qu'elle reste simple et accessible c'est pour ca que j'ai précisé sans lexer parce que la on tape dans l'implémentation de la grammaire et la c'est plus complexe.
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
18 avril 2011 à 12:08
Oui le NodeParser c'etait un test d'heritage pour verifier que tout marchait bien et comme ce n'etait pas reelement un parseur xml j'ai change le nom mais j'ai oublie de le faire dans les test ^^

Sinon cote buffers :

J'ai mit deux buffer mais ce n'est pas comme cela qu'il faudrait procéder, en fait le readBuffer devrai être remplace par une pile fifo, surtout si on veux pouvoir créer des règles d'assignation du genre a = b la pile deviens indispensable.

Le buffer principal qui est donc le flux a parser est automatiquement tronque dans un parseur ll enfin c'est comme ca que j'ai appris a les écrire en C++ ca a l'avantage de libérer de la mémoire (en PhP on a pas cette problématique), on consomme littéralement le flux d'entrée au fur et a mesure du parsing et on empile les éléments. Cela dit peu être effectivement que il y aurait une façon plus rapide de tronquer le flux et utiliser un index marcherai bien entendu.

Pourquoi ne pas avoir instancie le buffer et l'avoir mit en statique ?
Tout simplement par pur préférence personnelle ^^ Je me suis dit que on allait parser une chose a la fois et pas deux simultanément.

Pour revenir sur le principe d'un parseur ll, l'introduction que tu trouvera la explique plutôt bien leur principe de base :

http://levee-online.org/frll1-parser.html

Mais ici mon but etait de faire la version la plus simpliste c'est a dire sans grammaire récursive avec un lexer et des token terminaux et non terminaux. Ici les règles de parsing sont de simple fonctions c'est bien plus simple a comprendre et ca marche tellement bien ^^
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
18 avril 2011 à 11:32
Petite correction à la fin de ton code, faut utiliser NodeParser au lieu de XMLParser.

En lisant le code je me rends compte que le buffer initialement utilisé est tronqué par son début à chaque itération (unbufferize), cela ne risque pas sur des gros buffers de ralentir le parsing ? Y'à t'il une raison pour laquelle on ne pourrait pas tout simplement utiliser une boucle et itérer sur un curseur qui avance sur le texte ?

Autre point, c'est que l'accès au buffer se fait de manière statique ce qui ne devrait pas trop être dérangeant, mais je me demandais pourquoi ne pas avoir utilisé des instances d'objets, ce serait la même conso mémoire, avec la possibilité de créer plusieurs instances chacune ayant son contexte ...

Sinon j'adore le côté simple ... mais j'aurais fait une classe reader à part de la classe qui parse (cela permettrait de lire un buffer ou un fichier selon le reader utilisé).

Je viens de lire un article wiki sur le sujet, je ne suis pas pour autant plus avancé ... pourrais-tu revenir un peu sur le principe de fonctionnement des parseurs LL car à priori ils ont l'air assez puissants ...
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
18 avril 2011 à 11:32
Coucou Akhenaton ca fait un bail ;)

Ça fait longtemps que ce code trainai dans mon repository il reste quand même très basique mais il s'occupe du parsing de base et implémenter de nouvelles "règles" sous forme de fonction reste simple.

J'attends ton retour avec impatience ;)
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
18 avril 2011 à 10:55
RIEN QU'UN MOT : J'ADORE !!!

J'ai bossé sur un parseur mais j'ai fait l'implémentation de manière intuitive, et après quelques refactoring je suis tombé sur quelque chose d'assez similaire, mais un peu trop lourd à mon sens.

Je l'essaye et je reviens pour te faire un retour, en tout cas merci pour ce code.
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
18 avril 2011 à 10:10
Bonjour :)

En fait ce n'est pas un code fait pour être utilise (il n'est pas assez complet), il est purement didactique.

Ça permet de mieux comprendre comment marche un parseur LL et une manière de l'implémenter.

La fin du code comprends une partie de test pour montrer son fonctionnement après ca s'adresse quand même a des des inities c'est pas évident de tout expliquer je me suis dit que ca serait plus simple de répondre aux questions ^^
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
18 avril 2011 à 09:53
Un petit exemple d'utilisation et à quel moment l'utiliser serait un plus non négligeable pour partager avec les newbies et pas seulement avec les initiés.
Pour ma part, je trouve ce code bien fait et mérite un 9 (que je met) à cause du manque d'explications et du peu (pas) de commentaire dans le script.
Rejoignez-nous