В качестве стороннего проекта я пишу язык с использованием Python. Я начал с использования клона flex / bison под названием Ply, но столкнулся с трудностями, которые я могу выразить с помощью этого стиля грамматики, и мне не интересно взламывать свой язык из-за несоответствия импеданса с инструмент. Поэтому я не против писать свои собственные.
Так какой же самый мощный тип парсера? Цитаты к статьям (а также более вводные статьи) приветствуются.
(Я знаю, что «мощный» не совсем точно определен, но давайте немного разберемся с этим и посмотрим, куда идут ответы)
Ответы:
Грамматика обычно определяется как грамматика без контекста - точное определение дается на странице Википедии, но она работает так же, как и в PLY, которая основана на Bison , который, в свою очередь, основан на yacc .
Он говорит здесь , что PLY использует LALR анализатор . По сути, это синтаксический анализатор LR, в котором таблицы поиска сжаты, что, возможно, приводит к конфликтам синтаксического анализа, уменьшая некоторую выразительность грамматики LR (т. Е. Не зависящей от контекста грамматики, которую анализатор LR может анализировать). Если вы хотите знать об ограничениях этой конкретной отрасли анализаторов и тех , других парсеров, обзор всех видов разборе методов (LL, LR и др) даются здесь .
Чтобы ответить на ваш вопрос: существуют алгоритмы синтаксического анализа, способные анализировать любой язык без контекста, даже если язык неоднозначный (т. Е. Существует более одного способа интерпретации ввода):
Второй алгоритм - алгоритм Эрли . Этот алгоритм также способен анализировать любую грамматику без контекста. Хотя алгоритму требуется времени для разбора неоднозначного языка, ему требуется только O ( n 2 ) времени для разбора однозначного языка. Кроме того, он, очевидно, работает в линейном времени для большинства грамматик LR и особенно хорошо работает с леворекурсивными грамматиками.O(n3) O(n2)
Здесь вы можете найти статью, в которой обсуждается практическая реализация (адаптация) алгоритма Эрли. Они заключают: «Учитывая универсальность анализа Эрли по сравнению с анализом LALR (1) ((что примерно так и делает PLY)), и учитывая, что даже PEP ((их реализация алгоритма Эрли)) худшее время не будет заметно со стороны пользователь, это отличный результат ".
Последний тип парсера - это парсер GLR . Это обобщенная версия синтаксического анализа LR, способная анализировать любой язык без контекста.
Зрелой реализацией GLR является ASF + SDF . Bison также может генерировать синтаксический анализатор GLR, хотя его реализация немного отличается от «стандартного» алгоритма GLR. Элкхаунд Алгоритм представляет собой гибридный алгоритм РВО / LALR. Он использует LALR, когда это возможно, и GLR, когда это необходимо, чтобы быть быстрым и способным анализировать любую грамматику.
Помимо контекстно-свободных грамматик существуют контекстно-зависимые грамматики , но их, как правило, трудно анализировать, и они не добавляют особой выразительности: вы можете делать с ними больше, но для большинства приложений дополнительное использование не имеет значения, если вы не анализируете естественный язык.
В качестве последнего шага используются неограниченные грамматики . На этом этапе грамматика является полной по Тьюрингу, так что нет никаких ограничений на то, сколько времени потребуется, чтобы проанализировать конкретный язык, что нежелательно для большинства приложений синтаксического анализа. Дополнительная мощность почти никогда не нужна. Если вы действительно хотите использовать всю эту мощь, вам доступна языковая машина .
Наконец, реализация вашего собственного генератора синтаксического анализатора не является тривиальным делом, в частности, чтобы он был быстрым. Лично я только что закончил делать свою собственную версию flex (генератор лексеров), и, хотя это выглядело как упражнение в относительно простых алгоритмических задачах, это стало довольно сложно сделать правильно, особенно когда я пытался поддерживать Unicode. Подумайте об использовании уже существующей реализации вместо того, чтобы писать свою собственную.
источник
В документе ICFP 2010 в этом году, Total Parser Combinators , описывается библиотека терминальных комбинаторов , которая может быть завершена доказуемым образом, а также устанавливается, что в этой библиотеке «комбинаторы синтаксических анализаторов настолько выразительны, насколько это возможно», учитывая, что синтаксический анализатор гарантированно прекратит работу. К сожалению, я не помню объяснения, которое автор дал для того, что означает «настолько выразительный, насколько это возможно», но оно, безусловно, имеет отношение к вашему вопросу о «власти».
источник
Если вы хотите выйти за рамки контекстно-свободных грамматик для синтаксического анализа языков программирования, но по-прежнему выполнять синтаксический анализ за полиномиальное время, вы можете прибегнуть к синтаксическому анализу грамматик выражений или логических грамматик - последние также доступны в вариантах LL и LR (см. Здесь ). В теории формального языка изучаются также мощные, но распознаваемые по линейному времени языки Черча-Россера , но я не знаю ни одного реализованного генератора синтаксических анализаторов для них.
В обработке естественного языка вкусы различны, например, они имеют дело с неоднозначностью (также: присущая неоднозначность), и свободный порядок слов играет очень важную роль. Здесь ключевые слова слегка контекстно-зависимые языки и перезапуск автоматов могут помочь вам начать чтение.
источник
Инструменты генератора парсеров:
ANTLR очень хорошо. Кроме того, вы можете взглянуть на JavaCC
источник