2009-09-11 17 views

Respuesta

3

Pyparsing es una biblioteca de análisis Python puro que admite el análisis de paquetes, por lo que puede ver cómo se implementa. Pyparsing utiliza una técnica de memorización para guardar intentos de análisis previos para una expresión de gramática particular en una ubicación particular en el texto de entrada. Si la gramática implica reintentar esa misma expresión en esa ubicación, omite la costosa lógica de análisis y solo devuelve los resultados o la excepción de la memoria caché.

Hay más información aquí en el FAQ page de la wiki de pyparsing, que también incluye enlaces a la tesis original de Bryan Ford sobre el análisis de paquetes.

27

El análisis de Packrat es una manera de proporcionar mejor rendimiento asintóticamente para parsing expression grammars (PEG); específicamente para PEGs, se puede garantizar el análisis linear time.

Básicamente, el análisis de Packrat solo significa almacenar en caché si las expresiones coinciden en la posición actual de la cadena cuando se prueban - esto significa que si el intento actual de encajar la cadena en una expresión falla, intenta adaptarse a otra posible las expresiones pueden beneficiarse de la aprobación/falla conocida de las subexpresiones en los puntos de la cadena donde ya se han probado.

+3

Corrígeme si me equivoco, pero la posibilidad de intentar hacer coincidir varios símbolos diferentes no terminales en una posición dada (una característica de los PEG) implica también una búsqueda anticipada ilimitada. Esto significa que es posible que deba mantener porciones significativas de la entrada tokenizada en la memoria. ¿Derecha? – Honza

+2

@Honza: Es una clásica compensación de tiempo/espacio. ¿Preferirías potencialmente seguir N rutas una tras otra antes de encontrar la correcta, o preferirías potencialmente seguir N rutas al mismo tiempo manteniendo cada una en la memoria? De cualquier manera, si mira demasiado lejos, apesta, y si no mira hacia adelante, no hay costo. Estoy seguro de que mi 2G ram lappy no va a sudar si miro hacia delante 1 token, 2 tokens, 3 tokens ... siempre y cuando no intentes analizar los lenguajes naturales, estarás bien. – efrey

+0

Si se usa 'lazy vals' (Scala Parser Combinators), entonces ¿se ha logrado el' packrat de análisis '? En otras palabras, si estoy usando 'lazy val' para almacenar en caché los tokens ya analizados, ¿ya estoy usando' packrat parsing'? –

Cuestiones relacionadas