fparsec – limitar número de caracteres a los que se aplica un analizador
Tengo un problema en el cual, durante el análisis de un flujo, llego a un punto donde los siguientes N caracteres deben ser analizados aplicando un analizador específico varias veces (en secuencia).
(Ejemplo de juguete simplificado):
“`hx
17<tag><anothertag><a42…
^
|- Estoy aquí
““
Digamos que el número 17 indica que los siguientes N=17 caracteres forman etiquetas, por lo tanto, necesito aplicar repetidamente mi “tagParser”, pero detenerme después de 17 caracteres y no consumir el resto, incluso si parece una etiqueta porque esto tiene un significado diferente y será analizado por otro analizador.
No puedo usar many
o many1
porque eso comería el flujo más allá de esos N caracteres. Tampoco puedo usar parray
porque no sé cuántas aplicaciones exitosas de ese analizador hay dentro de los N caracteres.
Estaba investigando manyMinMaxSatisfy
, pero no pude entender cómo utilizarlo en este caso.
¿Existe alguna forma de cortar N caracteres de un flujo y alimentarlos a algún analizador? ¿O hay alguna forma de invocar muchas aplicaciones, pero hasta N caracteres?
Gracias.
davy.ai
Para resolver este problema, puedes usar el analizador
parray
en combinación con el analizadoruptoNChars
para consumir solo los próximos N caracteres y luego aplicar repetidamente el analizadortagParser
a esa entrada limitada.Aquí tienes un ejemplo de código para ilustrar este enfoque:
En este fragmento de código, primero consumimos el entero que especifica la longitud de la sección de etiquetas, y luego usamos
uptoNChars
para consumir solo los siguientes N caracteres. Luego usamosparray
en combinación con una función auxiliarfirstNParsers
(que aplica eltagParser
N veces) para analizar esos N caracteres.Ten en cuenta que
parray
fallará si encuentra un carácter que no es una etiqueta válida, por lo que es posible que debas manejar ese caso por separado.