Załóżmy, że chcę przetworzyć ciąg z różnymi nawiasami otwierającymi i zamykającymi (użyłem nawiasów w tytule, ponieważ uważam, że jest on bardziej powszechny - pytanie jest jednak takie samo), więc że rozdzielam wszystkie wyższe poziomy na liście.Nawiasy pasujące w Scali --- podejście funkcjonalne
Dane:
[hello:=[notting],[hill]][3.4(4.56676|5.67787)][the[hill[is[high]]not]]
chcę:
List("[hello:=[notting],[hill]]", "[3.4(4.56676|5.67787)]", "[the[hill[is[high]]not]]")
Droga Robię to poprzez liczenie otwieranie i zamykanie nawiasów i dodanie do listy, gdy dostanę licznik na 0. Mam jednak brzydki imperatywny kod. Możesz założyć, że oryginalny ciąg jest dobrze uformowany.
Moje pytanie brzmi: jakie byłoby miłe funkcjonalne podejście do tego problemu?
Uwagi: Zastanawiam się, czy użyć metody for ... yield, ale biorąc pod uwagę użycie liczników, nie mogę uzyskać prostego warunku (muszę mieć także warunki do aktualizacji liczników) i nie wiem jak Mógłbym użyć tej konstrukcji w tym przypadku.
patrz "kombinatorów parsera": http://stackoverflow.com/search?q = scala + parser + kombinatoryki –
Podobny przypadek: http://blog.tmorris.net/haskell-scala-java-7-functional-java-java/. Kod w komentarzach jest najbardziej użytecznym bitem. –
@AlexanderAzarov, za każdym razem gdy gram z kombinatorami parserów, czuję, że potrzebuję więcej doświadczenia z nim, aby być biegły, aby uzyskać rozwiązanie w niemal pewnym czasie. Czy tu jest przesada? – huynhjl