Предположим, я пытаюсь разобрать строку abc с помощью парсера Packrat:
lazy val abc: PackratParser[AnyRef] = ab ~ "c"
lazy val ab: PackratParser[AnyRef] = (ab | abc) ~ "b" | "a"
def parse(in: String) = parseAll(abc, in)
Здесь я использую левую рекурсию, поддерживаемую парсером Packrat, но я не понимаю, почему она не работает. Согласно документации Parser P | Q равно P в случае успеха P, поэтому в этом случае ab
следует заменить на «ab» вместо «a», как если бы я заменил ab
на:
lazy val ab: PackratParser[AnyRef] = ab ~ "b" | "a"