¿Por qué separar lexing y parsing?

15

Es posible analizar un documento con una sola pasada desde una máquina de estado. ¿Cuál es el beneficio de tener dos pases, es decir. ¿Tiene un lexer para convertir texto en tokens y un analizador para probar las reglas de producción en esos tokens? ¿Por qué no tener una sola pasada que aplique las reglas de producción directamente al texto?

Brent
fuente
2
Esto ya se ha discutido en CS, stackexchange, con muchos comentarios muy técnicos en una respuesta al poder expresivo de lexer + parser . Pero puede haber espacio allí para obtener más respuestas.
babou
Me pregunto si el paralelismo de estilo de tubería (aunque etapas altamente desequilibradas) podría ser una ventaja secundaria. Tanto la instrucción como el comportamiento del caché de datos también pueden ser interesantes. Cuánto (si lo hubiera) reduciría el tiempo de compilación dependería del hardware específico.
Paul A. Clayton
Una razón bastante obvia (al menos para mí) es que puede usar la herramienta de escáner por separado. En la práctica, con frecuencia uso flex para escanear entradas, pero rara vez necesito toda la potencia de yacc.
jamesqf

Respuestas:

13

No tienes que separarlos. La gente los combina en analizadores sin escáner .

La desventaja clave de los analizadores sin escáner parece ser que las gramáticas resultantes son bastante complicadas, más complicadas que la combinación correspondiente de una expresión regular que hace lexing y una gramática libre de contexto que analiza en el token-stream. En particular, las gramáticas para el análisis sin escáner tienden a la ambigüedad. Es más fácil eliminar la ambigüedad para las gramáticas que trabajan en un token-stream.

Un beneficio pragmático de usar una fase de lexing inicial dedicada es que no combina el analizador posterior con detalles léxicos. Esto es útil durante el desarrollo temprano del lenguaje de programación, cuando los detalles léxicos y sintácticos todavía cambian con frecuencia.

Martin Berger
fuente
1
TPAGPAGPAGT
@babou Sí, eso es correcto. No conozco ningún resultado formal de la forma en que la expresión regular compuesta con LL (k) sale de LL (k) o similar. Además, el lexing generalmente no se realiza con lenguajes regulares, sino con algo más poderoso, a saber, los lenguajes regulares extendidos con las prioridades de concordancia más larga y de palabras clave primero. No estoy seguro de qué clase de idioma es esa y cuáles son sus propiedades de cierre.
Martin Berger
2
Si su anticipación implica leer un identificador, la composición requerirá una anticipación ilimitada, ya que (en principio) no hay límite en la longitud de los identificadores.
babou
@babou, no estoy seguro. Si la palabra clave más larga tiene 17 caracteres, cualquier cadena que sea más larga debe ser un identificador, o léxico inválido.
Martin Berger
Pero su identificador, o posiblemente una cadena, número u otro literal, es una secuencia de más de 17 símbolos individuales, que pueden estar delante del token que realmente necesita. Esa es una gran anticipación, ilimitada. Puede terminar con un lenguaje no determinista.
babou