Digamos que quiero analizar una cadena con varios corchetes de apertura y cierre (utilicé paréntesis en el título porque creo que es más común - la pregunta es la misma sin embargo) entonces que obtengo todos los niveles superiores separados en una lista.Paréntesis coincidentes en Scala --- enfoque funcional
dado:
[hello:=[notting],[hill]][3.4(4.56676|5.67787)][the[hill[is[high]]not]]
Quiero:
List("[hello:=[notting],[hill]]", "[3.4(4.56676|5.67787)]", "[the[hill[is[high]]not]]")
La forma en que estoy haciendo esto es contando la apertura y cierre de corchetes y añadiendo a la lista cada vez que tengo a mi contador a 0. Sin embargo, tengo un código de imperativo feo. Puede suponer que la secuencia original está bien formada.
Mi pregunta es: ¿cuál sería un buen enfoque funcional para este problema?
Notas: He pensado en usar la construcción for ... yield pero dado el uso de los contadores no puedo obtener un condicional simple (debo tener condicionales solo para actualizar los contadores también) y no sé cómo Podría usar esta construcción en este caso.
Ver "combinadores analizador": http://stackoverflow.com/search?q = scala + parser + combinators –
Un caso similar: http://blog.tmorris.net/haskell-scala-java-7-functional-java-java/. El código en los comentarios es el bit más útil. –
@AlexanderAzarov, cada vez que juego con los combinadores de analizadores, siento que necesitaré más experiencia para poder obtener una solución en un tiempo casi seguro. ¿Es excesivo aquí? – huynhjl