Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora1_Kalabin.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
755.2 Кб
Скачать
  1. Контекстно-свободные грамматики.

- грамматика, в которой все левые части правил грамматики состоят из одного нетерминального символа.

КС-грамматики (типа 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 говорят, что они проявляют свойство самовложения. Теоретически любая КС-грамматика, не содержащая самовложения, эквивалентна регулярной грамматике и генерирует регулярный язык. С другой стороны, регулярная грамматика не может содержать самовложения. Именно самовложение позволяет эффективно различать КС (нерегулярные) и регулярные языки. Как видно из второго примера, согласование скобок и т.п. требует самовложения, поэтому его нельзя специфицировать посредством регулярной грамматики.

С точки зрения разбора важно, что КС язык в состоянии распознавать

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

В функции автомата магазинного типа входит:

а) чтение входного символа, замещение верхнего символа стека

строкой символов (возможно, пустой) и изменение состояния или

б) все то же самое, но без чтения входного символа.), эквивалентный конечному автомату, к которому добавлена память магазинного типа (стек). В функции автомата магазинного типа входит: а) чтение входного символа, замещение верхнего символа стека строкой символов (возможно, пустой) и изменение состояния или б) все то же самое, но без чтения входного символа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]