how descargar parsing bison flex-lexer lexical-analysis

parsing - descargar - ¿Cómo implemento un escáner de dos pasos usando Flex?



how to use flex lexical analyzer (2)

PHP no diferencia entre el escaneo y el marcado. Simplemente se envía al búfer cuando está en el modo de marca, y luego cambia a análisis cuando está en modo de código. No necesita un escáner de dos pasos, y puede hacerlo con solo un flex lexer.

Si está interesado en cómo funciona PHP, descargue la fuente (pruebe la fuente PHP4, es mucho más fácil de entender). Lo que desea ver es Zend Directory, zend_language_scanner.l .

Después de haber escrito algo similar, realmente recomendaría replantearme la ruta Flex y Bison, e irme con algo moderno como Antlr . Es mucho más fácil, más fácil de entender (las macros empleadas en una gramática Lex son muy confusas y difíciles de leer) y tiene un depurador integrado ( AntlrWorks ) para que no tenga que pasar horas mirando archivos de depuración de 3 Megas . También es compatible con muchos idiomas (Java, c #, C, Python, Actionscript) y tiene un excelente libro y un sitio web muy bueno que debería poder ponerlo en funcionamiento en muy poco tiempo.

Como proyecto mascota, me gustaría intentar implementar un lenguaje básico de mi propio diseño que pueda usarse como lenguaje de scripting web. Es trivial ejecutar un programa C ++ como Apache CGI, por lo que el trabajo real radica en cómo analizar un archivo de entrada que contenga código (código HTML / CSS) y código del lado del servidor.

En mi curso de compilación de licenciatura, utilizamos Flex y Bison para generar un escáner y un analizador para un lenguaje sencillo. Nos dieron una copia de la gramática y escribimos un analizador que traducía el lenguaje simple a un simple ensamblaje para una máquina virtual. El escáner flexible tokeniza la entrada y pasa los tokens al analizador de Bison.

La diferencia entre eso y lo que me gustaría hacer es que, al igual que PHP, este lenguaje podría tener marcado HTML simple y el lenguaje de scripting intercalado como el siguiente:

<p>Hello, <? echo "World ?> </p>

¿Soy incorrecto al asumir que sería eficiente analizar el archivo de entrada de la siguiente manera:

  1. Escanee la entrada hasta que encuentre una etiqueta de inicio de secuencia de comandos (''
  2. El segundo escáner ficha la sección del script del lado del servidor del archivo de entrada (desde la etiqueta abierta: '''') y pasa el token al analizador, que no necesita conocer el marcado en el archivo.
  3. El control se devuelve al primer escáner que continúa con este patrón general.

Básicamente, el primer escáner solo diferencia entre Markup (que se devuelve directamente al navegador sin modificar) y el código, que se pasa al segundo escáner, que a su vez convierte el código en token y pasa los tokens al analizador.

Si este no es un patrón de diseño sólido, ¿cómo manejan los lenguajes como PHP la entrada de escaneo y el código de análisis de manera eficiente?


Quieres ver las condiciones de inicio. Por ejemplo:

"<?" { BEGIN (PHP); } <PHP>[a-zA-Z]* { return PHP_TOKEN; } <PHP>">?" { BEGIN (0); } [a-zA-Z]* { return HTML_TOKEN; }

Comience en el estado 0, use la macro BEGIN para cambiar los estados. Para hacer coincidir un RE solo en un estado particular, prefija el RE con el nombre de estado rodeado por corchetes angulares.

En el ejemplo anterior, "PHP" es estado. "PHP_TOKEN" y "HTML_TOKEN" son _% token_s definidos por su archivo yacc.