2010-09-15 25 views

Répondre

0
+1

j'ai vu ce générateur, mais il est de 4 ans. Je pensais qu'il pourrait y avoir quelque chose de plus à jour – Toad

+11

Permet de voir du contenu au lieu de seulement un tas de liens la prochaine fois. –

+1

@ts. Je suppose que vous savez maintenant, mais c'est entièrement votre responsabilité, et le vôtre seul, en tant que post-écrivain :) –

6

J'utilisé LIME Parser generator for PHP il y a quelques années, et il était déjà mature et stable. Le générateur d'analyseur lui-même est écrit en PHP, ce qui n'a pas vraiment d'importance sur le plan technique - car nous avons seulement besoin que l'analyseur généré soit en PHP - mais j'aime quand même ce détail. Il me fait me sentir moins apologétique sur le logiciel écrit en PHP

EDIT:

Je dois ajouter:

  1. où j'ai écrit « utilisé » il serait plus exact de dire que je "joué avec". Je n'ai pas encore écrit de code de production utilisant de la chaux. Mais je ne vois aucune raison de ne pas le faire. L '"exemple de calculateur" fourni avec la chaux utilise une méthode tokenize() qui est très loin d'un réel substitut à la puissance de lex. Mais si vous avez besoin d'un vrai tokenizer, il devrait être possible d'utiliser lex sur le "front end" pour alimenter les jetons en "end back".

0

J'ai porté Jison, un clone de Bison en javascript, à PHP. Les résultats sont un analyseur de tueur, capable de gérer lexing/parsing très simple et très complexe. Il fait maintenant partie de Jison, mais il y a quelques mises à jour dans ma fourche - https://github.com/robertleeplummerjr/jison. Les fichiers sont ici - https://github.com/robertleeplummerjr/jison/tree/master/ports/php

Voir le readme dans cette page, vous créez un javascript et php parser en même temps qui sont capables de faire la même chose ou des choses différentes. COOL!

-5

Je vous conseille d'écrire votre propre analyseur, car il est assez facile aujourd'hui.

La façon la plus simple de le faire serait selon moi de créer une classe pour chaque type de syntaxe possible (expression, test, boucle, etc.).

Ensuite, dans chaque classe, le code des méthodes suivantes:

  • une méthode pour une durée déterminée à partir d'une chaîne de caractères si la chaîne est du type donné (a+b est de « expression » type, if(b) est pas)
  • une méthode pour « exécuter » ce type (a+b retournera a->run() + b->run(), et a->run() renvoie une valeur)