Lex et Yacc en PHP [fermé]
y a-t-il une implémentation de Lex et Yacc en PHP?
si ce n'est pas le cas, est-ce que quelqu'un peut suggérer un analyseur lexical et un générateur d'analyseur (i.e., N'importe quoi comme Lex et Yacc) qui va créer du code PHP. Je ne m'inquiète pas trop de la performance de l'analyseur.
j'en ai marre d'utiliser regex pour analyser des choses qui ne devraient vraiment pas être analysées avec regex...
4 réponses
il y a JLexPHP: https://github.com/wez/JLexPHP/blob/master/jlex.php
Je ne l'ai pas utilisé, mais il y a ceci: http://pear.php.net/package/PHP_ParserGenerator , qui crée un analyseur PHP à partir d'une grammaire Lemon . Le projet semble être inactif.
j'ai aussi trouvé ce projet: http://code.google.com/p/antlrphpruntime / , qui utilise Antlr . De nouveau inactif.
cherche ce genre de chose depuis un moment. Après avoir trouvé ce post, j'ai essayé L'exécution PHP D'ANTLR. Je peux dire que c'est loin d'être fini. Il y a plusieurs erreurs dans le code généré, où les classes d'exécution java originales n'ont pas été correctement traduites en PHP (déclarations de classe imbriquées, en utilisant '."plutôt que de".'en essayant d'accéder à l'opérateur de méthodes de classe).
le cadre ANTLR lui-même est assez puissant (ne peut pas attester de la l'efficacité du code généré). Surtout L'outil graphique ANTLRWorks rend facile à créer et déboguer des grammas. Dommage pour la version PHP. Mais il est possible de rouler les vôtres. La meilleure solution pourrait être d'analyser la classe d'exécution générée par ANTLR, de comprendre comment cela fonctionne, et de trouver une version allégée et moins entreprenante de celui-ci.
astuce bon marché: code a recursive descent parser. Cela couvrira un grand nombre de cas. Voir y a-t-il une solution de rechange pour les systèmes flex/bison qui soit utilisable sur les systèmes 8 bits intégrés?
une autre suggestion: éviter L'approche Lex/Yacc, utiliser PHP comme un bon string parser,
-
pour les tâches simples et les traducteurs simples: utiliser perl-expressions régulières (PCRE), avec PHP
preg_*
fonctions . Le callback a le même pouvoir que les règles Awk ou Yacc, mais avec du code PHP (!). -
pour les tâches complexes : traduisez (avec une chaîne PHP ou un traducteur PCRE ou un autre traducteur) votre langue vers un dialecte XML, processus avec DOM et/ou XSLT . XSLT est "rule oriented" (se xsl:template) comme Yacc. Avec XSLT vous avez aussi accès aux fonctions PHP avec registerphpfunctions () . Si vous avez besoin de revenir à un langage non-XML ou un format complexe d'E/S, process de output ( a saved XML or a XSLT-output) encore une fois avec des fonctions PCRE et string.
- PS: pour les langues plus riches et plus complexes, la tâche" traduction en XML "est possible (voir théorie de xSugar ), mais pas toujours facile. Vous pouvez utiliser PHP-PEG pour traduire avec PHP, ou vous pouvez traduire avec un outil externe , pour mettre en cache le XML, ou pour utiliser une version permanente-XML traduite de vos scripts spécifiques-langue.
ces deux options ont la même puissance (Lex et Yacc), et n'utilisent que des classes et des fonctions PHP intégrées.
pour les cas complexes, rappelez-vous que XML, XSLT, etc. sont des normes W3C, alors, XML-dialectes sont des "formats standard", XML-outils sont optimisés et en cours d'évolution, et XML-données sont interchangeables.