Грамматика обычно определяется как грамматика без контекста - точное определение дается на странице Википедии, но она работает так же, как и в PLY, которая основана на Bison , который, в свою очередь, основан на yacc .
Он говорит здесь , что PLY использует LALR анализатор . По сути, это синтаксический анализатор LR, в котором таблицы поиска сжаты, что, возможно, приводит к конфликтам синтаксического анализа, уменьшая некоторую выразительность грамматики LR (т. Е. Не зависящей от контекста грамматики, которую анализатор LR может анализировать). Если вы хотите знать об ограничениях этой конкретной отрасли анализаторов и тех , других парсеров, обзор всех видов разборе методов (LL, LR и др) даются здесь .
Чтобы ответить на ваш вопрос: существуют алгоритмы синтаксического анализа, способные анализировать любой язык без контекста, даже если язык неоднозначный (т. Е. Существует более одного способа интерпретации ввода):
O ( n3| G | )n|G|
Второй алгоритм - алгоритм Эрли . Этот алгоритм также способен анализировать любую грамматику без контекста. Хотя алгоритму требуется времени для разбора неоднозначного языка, ему требуется только 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. Подумайте об использовании уже существующей реализации вместо того, чтобы писать свою собственную.