Индексированные грамматики являются обобщением контекстно-независимой грамматики, в которых нетерминалы снабжены списками флагов или индексных символов. Язык, создаваемый индексированной грамматикой, называется индексированным языком.
В современных публикациях, следующих за Хопкрофтом и Ульманом (1979), индексированная грамматика формально определяется как 5-кортеж. G = ⟨N, T, F, P, S⟩, где
В продукциях, а также в порождениях индексированных грамматик, строка («стек») σ ∈ F индексных символов присоединяется к каждому нетерминальному символу A ∈ N, обозначаемый A [σ]. За терминальными символами нельзя ставить стеки индексов. Для индексного стека σ ∈ F и строки α ∈ (N ∪ T) нетерминальных и терминальных символов α [σ] обозначает результат присоединения [σ] к каждому нетерминалу в α; например, если α равно B C d E с a, d ∈ T терминальным и нетерминальными символами B, C, E ∈ N, то α [σ] обозначает B [σ] C [σ] d E [σ]. Используя эти обозначения, каждое производство в P должно иметь вид
где A, B ∈ N - нетерминальные символы, f ∈ F - индекс, σ ∈ F - строка индексных символов, а α ∈ (N ∪ T) - строка нетерминальных и терминальных символов. Некоторые авторы пишут ".." вместо "σ" для стека индекса в производственных правилах; тогда правило типа 1, 2 и 3 читается как A [..] → α [..], A [..] → B [f..] и A [f..] → α [..] соответственно.
Производные аналогичны тем, что в контекстно-свободной грамматике, за исключением стека индекса, прикрепленного к каждому нетерминальному символу. Когда производство, например, Применяется A [σ] → B [σ] C [σ], индексный стек A копируется как в B, так и в C. Более того, правило может помещать индексный символ в стек или выталкивать его «самый верхний» (т. Е., крайний левый) индексный символ.
Формально отношение ⇒ («прямое происхождение») определяется на множестве (N [F] ∪T) «сентенциальных форм» следующим образом:
Как обычно, отношение деривации ∗ ⇒ определяется как рефлексивное транзитивное замыкание прямого вывода ⇒. Язык L (G) = {w ∈ T: S ∗ ⇒ w} - это множество всех строк терминальных символов, выводимых из начального символа.
Исторически концепция индексированных грамматик была впервые введена Альфредом Ахо (1968) с использованием другого формализма. Ахо определил индексированную грамматику как 5-кортеж (N, T, F, P, S), где
Прямые деривации были следующими:
Этот формализм, например, используется Хаяси (1973, с. 65-66).
На практике стопки индексов могут подсчитывать и запоминать, какие правила применялись и в каком порядке. Например, индексированные грамматики могут описывать контекстно-зависимый язык троек слов {www: w ∈ {a, b}}:
S [σ] | → | S [fσ] | T [fσ ] | → | a T [σ] |
S [σ] | → | S [gσ] | T [gσ] | → | b T [σ] |
S [σ] | → | T [σ] T [σ] T [σ] | T | → | ε |
Тогда вывод abbabbabb следующий:
В качестве другого примера грамматика G = ⟨{S, T, A, B, C}, {a, b, c}, {f, g}, P, S⟩ порождает язык {abc: n ≥ 1}, где производственное множество P состоит из
S [σ] → T [gσ] | A [fσ] → a A [σ] | A [gσ] → a |
T [σ] → T [fσ] | B [fσ] → b B [σ] | B [gσ] → b |
T [σ] → A [σ] B [σ] C [σ] | C [fσ] → c C [σ] | C [gσ] → c |
Пример вывода:
Оба примера языка ges не являются контекстно-свободными в силу леммы перекачки.
Хопкрофт и Ульман склонны рассматривать индексированные языки как «естественный» класс, поскольку они порождаются несколькими формализмы, отличные от индексированных грамматик, а именно:
Хаяши обобщил лемму о накачке на индексированные грамматики. Наоборот, Гилман дает «лемму о сжатии» для индексированных языков.
Джеральд Газдар определил второй класс, линейные индексированные грамматики (LIG ), требуя, чтобы не более одного нетерминального в каждом продукте должен быть указан как принимающий стек, тогда как в обычной индексированной грамматике все нетерминалы получают копии стека. Формально линейная индексированная грамматика определяется так же, как и обычная индексированная грамматика, но требования формы продукции изменяются на:
где A, B, f, σ, α используются как выше, и β ∈ (N ∪ T) - последовательность нетерминальных и терминальных символов, таких как α. Кроме того, отношение прямого вывода ⇒ определяется аналогично приведенному выше. Этот новый класс грамматик определяет строго меньший класс языков, который принадлежит к умеренно контекстно-зависимым классам.
Язык {www: w ∈ {a, b}} порождается индексированной грамматикой, но не линейной индексированной грамматикой, в то время как {ww: w ∈ {a, b}} и {abc : n ≥ 1} порождаются линейной индексированной грамматикой.
Если допускаются и исходное, и измененное производственные правила, языковой класс остается индексированными языками.
Если обозначить σ произвольный набор символов стека, мы может определить грамматику языка L = {abc | n ≥ 1} как
S [σ] | → | a S [fσ] c |
S [σ] | → | T [σ] |
T [fσ] | → | T [σ] b |
T | → | ε |
Чтобы получить строку abc, у нас есть шаги:
Аналогично:
Языки с линейной индексацией являются подмножеством индексированных языков, и, таким образом, все LIG могут перекодироваться как IG, что делает LIG строго менее мощными, чем IG. Преобразование LIG в IG относительно просто. Правила LIG в целом выглядят примерно так: , по модулю push / pop часть правила перезаписи. Символы и представляют строки терминальных и / или нетерминальных символов, а также любые -терминальный символ в любом из них должен иметь пустой стек по определению LIG. Это, конечно, противоречит тому, как определены IG: в IG нетерминалы, чьи стеки не передаются или не извлекаются, должны иметь точно такой же стек, что и перезаписанный нетерминал. Таким образом, каким-то образом нам нужно иметь нетерминалы в и , которые, несмотря на отсутствие -пустые стеки, ведут себя так, как если бы они были пустыми.
Рассмотрим правило как пример случая. При преобразовании этого в IG замена для должна быть некоторой , который ведет себя точно так же, как , независимо от того, что такое . Для этого мы можем просто иметь пару правил, которые принимают любое где не пуст и выталкивает символы из стека. Затем, когда стек пуст, его можно переписать как .
Мы можем применить это в общем к получить IG от LIG. Так, например, если LIG для языка выглядит следующим образом:
Правило предложения здесь не является правилом IG, но, используя приведенный выше алгоритм преобразования, мы можем определить новые правила для , изменив грамматику на:
Каждое правило теперь соответствует определению IG, в котором все нетерминалы в правая часть правила перезаписи получает копию стека перезаписанного символа. Таким образом, индексированные грамматики могут описывать все языки, которые могут описывать линейно индексированные грамматики.
Виджай-Шанкер и Вейр (1994) демонстрируют, что линейные индексированные грамматики, комбинаторные категориальные грамматики, древовидные грамматики и Головные грамматики определяют один и тот же класс строковых языков. Их формальное определение линейных индексированных грамматик отличается от выше.
LIG (и их слабо эквивалентов ) строго менее выразительно (то есть они генерируют правильное подмножество), чем языки, созданные другим семейством слабо эквивалентный формализм, который включает: LCFRS и минималистские грамматики (MG). Последнее семейство может (также) быть проанализировано за полиномиальное время.
Другой формой индексированных грамматик, представленной Штаудахером (1993), является класс грамматик с распределенным индексом (DIG).. Что отличает DIG от индексированных грамматик Aho, так это распространение индексов. В отличие от IG Aho, которые распределяют весь стек символов для всех нетерминалов во время операции перезаписи, DIG делят стек на подстаки и распределяют подстаки по выбранным нетерминалам.
Общая схема правила для бинарно распределяемого правила DIG - это форма
Где α, β и γ - произвольные концевые цепочки. Для строки с троичным распределением:
И так далее для большего количества нетерминалов в правой части правила перезаписи. В общем, если есть m нетерминалов в правой части правила перезаписи, стек разбивается m способами и распределяется среди новых нетерминалов. Обратите внимание, что существует особый случай, когда раздел пуст, что фактически делает правило правилом LIG. Таким образом, языки распределенного индекса являются надмножеством языков с линейным индексом.