2010-01-19 22 views
30

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

Si no es así, ¿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 enfermo de utilizar expresiones regulares para analizar las cosas que realmente no debería pueden analizar con expresiones regulares ...

+0

@nickf ¡Bien merecido! – Christian

+0

+1 'preg_split ('# ([{}]) #', ...)' solo puede llegar tan lejos. – Dan

+0

Puede usar el tokenizador PHP incorporado si su idioma usa los mismos tokens que PHP – niahoo

Respuesta

1

Estado de la búsqueda de 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 haber terminado. Hay varios errores en el código generado, donde las clases de tiempo de ejecución 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 hace que sea fácil crear y depurar gramas. Es una lástima de la versión de PHP. Sin embargo, es posible hacer tu propio. La mejor solución puede ser analizar la clase de tiempo de ejecución ANTLR generada, descubrir cómo funciona y obtener una versión ligera menos empresarial de la misma.

0

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

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

  • para tareas complejas: traducir (con una cadena PHP o traductor PCRE u otro traductor) a la lengua un dialecto XML, process with DOM y/o XSLT. XSLT está "orientado a reglas" (se xsl: plantilla) como Yacc. Con XSLT también tiene access to PHP functions with registerphpfunctions(). Si es necesario regresar a un lenguaje que no sea XML o un formato complejo de E/S, procese de nuevo la salida (a saved XML o una salida XSLT) con PCRE y funciones de cadena.

    • PS: para los idiomas más ricos y complejos, la tarea "traducción a XML" es posible (ver xSugar theory), pero no siempre es fácil. Puede usar PHP-PEG para traducir con PHP, o puede traducir with a external tool, para almacenar en caché el XML, o para usar una versión traducida de xml permanente de sus scripts de idioma específico.

Estas dos opciones tienen la misma (Lex y Yacc) de potencia, y utilizar sólo la acumulación en las clases y funciones de PHP.

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 en evolución, y los datos XML son intercambiables.

Cuestiones relacionadas