2012-01-17 16 views
5

¿Es posible enviar entradas a un analizador FParsec en fragmentos, como desde un socket? Si no es así, ¿es posible recuperar el resultado actual y la porción no analizada de una secuencia de entrada para poder lograr esto? Estoy tratando de ejecutar los fragmentos de entrada procedentes del SocketAsyncEventArgs sin almacenar en el búfer los mensajes completos.Análisis fragmentado con FParsec

actualización

La razón para señalar el uso de SocketAsyncEventArgs era para denotar que el envío de datos a un CharStream podría resultar en el acceso asíncrono a la Stream subyacente. Específicamente, estoy buscando usar un buffer circular para enviar los datos que vienen del socket. Recuerdo que la documentación de FParsec indicaba que no se podía acceder asincrónicamente al Stream subyacente, por lo que había planeado controlar manualmente el análisis en fragmentos.

preguntas fundamentales:

  1. ¿Puedo usar un buffer circular bajo mi Stream pasado al CharStream?
  2. ¿No tengo que preocuparme por controlar manualmente la fragmentación en este escenario?
+0

FParsec funciona en CharStream, por lo que la respuesta es probablemente sí. Sin embargo, voy a diferir a mejores respuestas (con suerte). –

Respuesta

8

La versión normal de FParsec (aunque no la Low-Trust version) lee la entrada trozo-sabia, o "por bloques", como lo llamo en el CharStream documentation. Por lo tanto, si construye un CharStream desde un System.IO.Stream y el contenido es lo suficientemente grande como para abarcar varios bloques CharStream, puede comenzar a analizar antes de haber recuperado completamente la entrada.

Nota sin embargo, que la CharStream consumirá el flujo de entrada en trozos de un (pero configurable) de tamaño fijo, es decir, se llama el método de la System.IO.StreamRead tan a menudo como es necesario para llenar un bloque completo. Por lo tanto, si analiza la entrada más rápido de lo que puede recuperar una nueva entrada, el CharStream puede bloquearse aunque ya haya alguna entrada no procesada, porque aún no hay suficiente entrada para completar un bloque completo.

actualización

La respuesta (s) a sus preguntas fundamentales: 42.

  • ¿Cómo se implementa la Stream a partir del cual se construye el CharStream es totalmente de usted. La restricción que está recordando que excluye el acceso paralelo solo se aplica a la clase CharStream, que no es segura para subprocesos.

  • Implementación del Stream como un buffer circular probablemente restrict the maximum distance over which you can backtrack.

  • El tamaño del bloque de las influencias CharStream lo lejos que puede retroceder cuando el Stream no es compatible con la búsqueda.

  • La forma más sencilla de analizar la entrada de forma asincrónica es realizar el análisis sintáctico en una tarea asíncrona (es decir, en una cadena de fondo).En la tarea, simplemente podría leer el socket de forma síncrona o, si no confía en el almacenamiento en búfer del sistema operativo, podría usar una clase de flujo como el BlockingStream descrito en el artículo que ha vinculado en el segundo comentario a continuación.

  • Si la entrada se puede separar fácilmente en trozos independientes (por ejemplo, líneas para un formato de texto basado en líneas), puede ser más eficiente descomponerlo usted mismo y luego analizar el fragmento de entrada por partes.

+0

Gracias, Stephan. Revisé mi pregunta para reflejar mejor lo que intento entender mejor. Al principio estaba entusiasmado con el enfoque 'CharStream', pero la nota que encontré anteriormente sobre el acceso asincrónico al' Stream' subyacente me hizo detenerme. –

+0

¿Funcionaría algo como esto? http://msdn.microsoft.com/en-us/magazine/cc163290.aspx –

+0

He actualizado mi respuesta. ¿Responde esto a tus preguntas? No estoy seguro de qué nota con respecto al acceso asincrónico al 'Stream' subyacente al que se refiere exactamente. ¿Podría escribir dónde encontró exactamente esa nota? –

Cuestiones relacionadas