Конфликт парсеров пакета - PullRequest
       28

Конфликт парсеров пакета

2 голосов
/ 12 февраля 2011

Предположим, я пытаюсь разобрать строку 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"

1 Ответ

1 голос
/ 28 марта 2011

Парсер Packrat поддерживает левую рекурсию, но поддерживает циклы между правилами (без прогресса).

Вот что у вас здесь: abc вызывает ab, который может вызывать abc.

Может быть, выследует попробовать положить |в правиле abc, чтобы избежать цикла.

...