Rozważmy przykład parsera jak ten:Kombinatory parsera: czy repsep umożliwia śledzenie wstecz?
object TestParser extends RegexParsers {
override protected val whiteSpace = """[ \t]*""".r
def eol = """(\r?\n)+""".r
def item = "[a-zA-Z][a-zA-Z0-9-]*".r
def list = "items:" ~> rep1sep(item,",")
def constraints = "exclude:" ~> item
def itemsDefinition = (rep1sep(list, eol) ~ repsep(constraints,eol))
}
Gdy próbuję analizować to wejście (bez dwóch wierszy zawiera wykluczyć działa OK):
items: item1, item2, item3, item3, item4
items: item2, item3, item3, item5, item4
items: item4, item5, item6, item10
items: item1, item2, item3
exclude: item1
exclude: item2
mi się następujący błąd:
[5.5] failure: `items:' expected but `e' found
exclude: item1
^
Problem jest oczywisty w tej linii:
def itemsDefinition = (rep1sep(list, eol) ~ repsep(constraints,eol))
Co jest powodem, dlaczego to nie działa. Czy ma to coś wspólnego z cofaniem? Jakie mam alternatywy, aby to działało?
Jeśli ktoś ma propozycję lepszego tytułu pytania, proszę dać mi znać. Nie jestem pewien, czy to ma sens ... – PrimosK