Связь грамматик и автоматов

Существует полное соответствие между регулярными выражениями (а поэтому и грамматиками типа 3) и конечными автоматами, которые определяются следующим образом: Конечный автомат – это устройство для распознавания строк какого- либо языка. У него есть конечное множество состояний, отдельные из которых называются последними. По мере считывания каждой литеры строки контроль передается от состояния к состоянию в соответствии с заданным множеством переходов. Если после считывания последней литеры строки автомат будет находиться в одном из последних состояний, о строке говорят, что она принадлежит языку, принимаемому автоматом. В ином случае строка не принадлежит языку, принимаемому автоматом.

Грамматики типа 3 (регулярные) удобны для генерирования символов, которые создаются во время лексического анализа, но они не очень подходят для описания способов объединения этих символов в предложения типичных языков высокого уровня.

 

Например, как уже отмечалось выше, согласование скобок нельзя специфицировать с помощью грамматики типа 3. КС- грамматики (типа 2), хотя и не могут специфицировать все свойства типичных языков программирования, являются более универсальными и поэтому более пригодными в качестве основы для фазы синтаксического анализа (разбора) компиляции. КС-грамматики традиционно служат основой для фазы синтаксического анализа компиляции.

 

Если какой-либо язык программирования нельзя генерировать с помощью КС-грамматики, всегда можно найти такую КС-грамматику, которая генерирует надмножество языка, т.е. язык, включающий в себя заданный язык программирования.

 

Применение такой грамматики для синтаксического анализа означает, что ряд ограничений в реальном языке (например, обязательное объявление всех идентификаторов в программе) не будет проверяться анализатором.

 

Однако в компиляторе нетрудно предусмотреть другие действия по выполнению необходимых проверок в исходной программе (например, за счет применения таблицы символов).

 

Из определения КС-грамматики ясно, что класс КС-грамматик более мощный (т.е. может генерировать больше языков), чем класс регулярных грамматик, но менее мощный, чем класс контекстно-зависимых (КЗ- грамматик). Язык

 

{ an bn | n 0 }

 

является контекстно-свободным, но не регулярным. Он генерируется

грамматикой с порождающими правилами

S aSb |

 

С другой стороны, язык

 

{ an bn cn | n 0 }

является контекстно-зависимым, а не контекстно-свободным. Контекстно-свободные грамматики имеют ряд характеристик, для которых справедливы следующие положения.

 

1) Каноническая форма

а) Каждая КС-грамматика эквивалентна (т.е. генерирует тот же язык) грамматике в нормальной форме Хомского, т.е. со всеми порождающими правилами вида

A BC | a

при обычных условиях, касающихся терминалов и нетерминалов.

 

б) Каждая КС-грамматика эквивалентна грамматике в нормальной форме Грейбаха, т.е. со всеми порождающими правилами вида

A b

где – строка нетерминалов (возможно, пустая).

 

2) Самовложение

Если в грамматике G есть нетерминал A, для которого

A 1 A 2

(здесь 1 и 2 являются непустыми строками терминалов и/или нетерминалов), то о такой грамматике говорят, что она содержит самовложение. Например, две приведенные ниже грамматики содержат самовложение:

 

1) G1 = ({S}, {a, b}, P, S), где элементы P:

S aSb

S

2) G2 = ({S, A}, {begin, end,[,]}, P, S), где элементы P:

S begin A end

S

A [S]

В последнем случае об A и S говорят, что они проявляют свойство самовложения. Теоретически любая КС-грамматика, не содержащая самовложения, эквивалентна регулярной грамматике и генерирует регулярный язык. С другой стороны, регулярная грамматика не может содержать самовложения. Именно самовложение позволяет эффективно различать КС (нерегулярные) и регулярные языки. Как видно из второго примера, согласование скобок и т.п. требует самовложения, поэтому его нельзя специфицировать посредством регулярной грамматики. С точки зрения разбора важно, что КС язык в состоянии распознавать автомат магазинного типа, эквивалентный конечному автомату, к которому добавлена память магазинного типа (стек).