Подтвердить что ты не робот

Scala Parsers: доступность, различия и объединение?

Мой вопрос об Scala Parsers:

  • Какие из них доступны (в стандартной библиотеке и за ее пределами),
  • какая разница между ними,
  • они имеют общий API и
  • Можно ли комбинировать разные Parsers для синтаксического анализа одной входной строки?

Я нашел, по крайней мере, следующие:

  • Scala "стандартный" синтаксический анализатор (кажется, является парсером LL)
  • Scala парсер Packrat (начиная с 2.8, является парсером LALR)
  • Parboiled parser (PEG parser?)
  • Spiewak Компилятор GLL Комбинатор
4b9b3361

Ответ 1

Просто я хотел обновить этот ответ указателем на последнюю итерацию проекта, который был пропущен, называется parboiled2:

https://github.com/sirthias/parboiled2

parboiled2 цели только Scala (в отличие от Scala + Java), использует макросы Scala и очень активно поддерживается.

Ответ 3

Стоит отметить, что Scala стандартные компиляторы парсеров не LL, а также комбинаторы Packrat LALR. Комбинаторы Parser - это форма рекурсивного спуска с бесконечным обратным отсчетом. Вы можете думать о них немного как "LL (*)". Класс языков, поддерживаемый этим методом, - это именно класс однозначных контекстно-свободных языков или тот же класс, что и LALR (1) и Packrat. Тем не менее, класс грамматики довольно немного отличается, причем наиболее заметной слабостью является не поддержка левого рекурсии.

Компиляторы Packrat поддерживают левую рекурсию, но они все еще не поддерживают многие другие, более тонкие функции LALR. Эта слабость обычно проистекает из упорядоченного оператора выбора, что может привести к некоторым дьявольски сложным ошибкам грамматики, а также предотвращает некоторые хорошие грамматические формулировки. Наиболее часто встречающийся пример этих ошибок возникает, когда вы случайно заказываете двусмысленные выборы как самые короткие сначала, что приводит к жадному совпадению, которое предотвращает попытку правильной ветки. LALR не имеет этой проблемы, поскольку он просто пытается сразу все возможные ветки, откладывая точку принятия решения до конца производства.

Ответ 4

Существует также новый подход, известный как "синтаксический анализ с производными". Этот подход описан здесь. Существует поддержка в Scala Даниэля Спивака.