Lex y Yacc en PHP [cerrado]


¿Hay una implementación de Lex y Yacc en PHP?

Si no, puede alguien sugerir un analizador léxico y generador de analizador (es decir, algo como Lex y Yacc) que creará código PHP. No estoy demasiado preocupado por el rendimiento del analizador resultante.

Estoy harto de usar expresiones regulares para analizar cosas que realmente no deberían analizarse con expresiones regulares...

Author: John Carter, 2010-01-19

4 answers

Hay JLexPHP: https://github.com/wez/JLexPHP/blob/master/jlex.php

No lo he usado, pero hay esto: http://pear.php.net/package/PHP_ParserGenerator , que crea un analizador PHP a partir de una gramática Lemon. Sin embargo, el proyecto parece estar inactivo.

También encontré este proyecto: http://code.google.com/p/antlrphpruntime/, que utiliza Antlr. De nuevo inactivo sin embargo.

 8
Author: John Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-13 21:28:10

He estado buscando este tipo de cosas por un tiempo. Después de encontrar este post, he probado el tiempo de ejecución de PHP ANTLR. Puedo informar que está lejos de estar terminado. Hay varios errores en el código generado, donde las clases java runtime originales no se han traducido correctamente a PHP (declaraciones de clase anidadas, usando '.'en lugar de '.'cuando se intenta acceder a los métodos de clase operador).

El marco ANTLR en sí mismo es bastante poderoso (no puede atestiguar la eficiencia del código generado). Especialmente la herramienta gráfica ANTLRWorks facilita la creación y depuración de grammas. Lástima lo de la versión PHP. Sin embargo, es posible rodar el suyo propio. La mejor solución puede ser analizar la clase de tiempo de ejecución ANTLR generada, averiguar cómo funciona y crear una versión ligera y menos emprendedora de la misma.

 1
Author: jens_profile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-02 16:46:09

Truco barato: codifica un analizador de descenso recursivo. Esto cubrirá muchos casos. Ver ¿Existe una alternativa para flex/bison que sea utilizable en sistemas embebidos de 8 bits?

 1
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:01:39

Otra sugerencia: evite el enfoque Lex / Yacc, use PHP como un buen analizador string,

  • Para tareas simples y traductores simples: use perl-regular expressions (PCRE), con PHP preg_* functions. El callback tiene el mismo poder de las reglas Awk o Yacc, pero con código PHP (!).

  • Para tareas complejas : traduzca (con un traductor de cadena PHP o PCRE u otro traductor) su idioma a un dialecto XML, procese con DOM y/o XSLT. XSLT está "orientado a reglas" (se xsl:template) como Yacc. Con XSLT también tienes acceso a funciones PHP con registerphpfunctions(). Si es necesario volver a un lenguaje no XML o a un formato complejo de E/S, procese de output (un XML guardado o una salida XSLT) de nuevo con las funciones PCRE y string.

    • PD: para lenguajes más ricos y complejos, la tarea de "traducción a XML" es posible (ver teoría xSugar), pero no siempre es fácil. Usted puede utilizar PHP-PEG para traducir con PHP, o puede traducir con una herramienta externa, para almacenar en caché el XML, o para usar una versión traducida permanentemente xml de sus scripts de lenguaje específicos.

Estas dos opciones tienen el mismo poder (Lex y Yacc), y solo usan clases y funciones PHP integradas.

Para los casos complejos, recuerde que XML, XSLT, etc. son estándares W3C, entonces, los dialectos XML son "formatos estándar", las herramientas XML están optimizadas y aún en evolución, y los datos XML son intercambiables.

 0
Author: Peter Krauss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 12:33:38