Considere ejemplo del analizador de esta manera:Combinadores de analizadores: ¿replicar permite retroceder?
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))
}
Si trato de analizar esta entrada (sin dos líneas contiene excluir las obras 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
consigo siguiente error:
[5.5] failure: `items:' expected but `e' found
exclude: item1
^
El problema es obvio esta línea:
def itemsDefinition = (rep1sep(list, eol) ~ repsep(constraints,eol))
Cuál es la razón por la que no funciona. ¿Tiene algo que ver con retroceder? ¿Qué alternativas tengo para que funcione?
Si alguien tiene una propuesta para obtener un mejor título de la pregunta, hágamelo saber. No estoy seguro si incluso tiene sentido. – PrimosK