php yacc lex parser-generator

Lex y Yacc en PHP



parser-generator (4)

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 desde una gramática Lemon . El proyecto parece estar inactivo sin embargo.

También encontré este proyecto: http://code.google.com/p/antlrphpruntime/ , que usa Antlr . Nuevamente inactivo.

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

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

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


He estado buscando este tipo de cosas por un tiempo. Después de encontrar esta publicación, probé el tiempo de ejecución ANTLR PHP. Puedo informar que está lejos de ser terminado. Hay varios errores en el código generado, donde las clases de tiempo de ejecución de Java originales no se han traducido correctamente a PHP (declaraciones de clase anidadas, usando ''.'' En lugar de ''.'' Cuando se intenta acceder al operador de métodos de clase).

El marco ANTLR en sí mismo es bastante poderoso (no puede dar fe de la eficiencia del código generado). Especialmente la herramienta gráfica ANTLRWorks facilita la creación y depuración de los gramas. Lástima de la versión de PHP. Aunque es posible rodar el tuyo. La mejor solución puede ser analizar la clase de tiempo de ejecución ANTLR generada, averiguar cómo funciona y obtener una versión liviana menos empresarial de la misma.


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

  • para tareas simples y traductores simples: use expresiones regulares de perl (PCRE), con funciones preg_* PHP . La devolución de llamada tiene el mismo poder de las reglas Awk o Yacc, pero con el código PHP (!).

  • para tareas complejas : traduzca (con una cadena de PHP o un traductor 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 tiene acceso a las funciones de PHP con registerphpfunctions () . Si necesita volver a un lenguaje no XML o un formato complejo de E / S, vuelva a procesar la salida ( un XML guardado o una salida XSLT) con PCRE y las funciones de cadena.

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

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

Para los casos complejos, recuerde que XML, XSLT, etc. son estándares de W3C, luego, los dialectos de XML son "formatos estándar", las herramientas de XML están optimizadas y siguen evolucionando, y los datos de XML son intercambiables.