
- •1.2.1. Первичные понятия
- •1.2.2. Примеры, иллюстрирующие первичные понятия
- •1.2.3. Пустой язык
- •1.3.1. Грамматики типа 0
- •1.3.2. Грамматики типа 1
- •1.3.3. Грамматики типа 2
- •1.3.4. Грамматики типа 3
- •1.3.5. Вывод в кс-грамматиках и правила построения дерева вывода
- •1.3.7. Левый и правый выводы
- •1.5.1. Рекомендации по построению грамматик
- •Лексический анализатор должен читать символы из входного файла, строить записи, называемые токенами, и передавать их синтаксическому анализатору, как это показано на рисунке 6.1.
- •3.5. Функции перв, след и выбор.
- •5.4. Атрибутные преобразователи ( ап )
- •5.4.1. Представление правил lat-грамматики в магазине.
- •5.4.2. Построение инструкций ап.
1.3.3. Грамматики типа 2
Грамматики типа 2 называют контектно-свободными и бесконтекстными грамматиками ( КС-грамматики или Б-грамматики). Правила вывода таких грамматик имеют вид: <A>, где <A> Va и (Vт Va)*. Очевидно, что эти правила получаются из правил грамматики типа 1 при условии 1 = 2 = $. Поскольку контекстные условия отсутствуют, то правила КС-грамматик получаются проще, чем правила грамматик типа 1. Именно такие грамматики используются для описания языков программирования. Примером КС-грамматики может служить следующая: Г1. 5:
Vт = {a, b}, Va = {<I>},
R = { <I> a<I>a,
<I>b<I>b, <I>aa, <I>bb}.
Эта грамматика порождает язык, который состоит из цепочек, каждая из которых в свою очередь состоит из двух частей, цепочки Vт* и зеркального отображения этой цепочки '.
L( Г5 ) = { ' | Vт+},
где Vт+ - это множество Vт* без пустой цепочки. С помощью правил этой грамматики может быть построена, например, следующая цепочка: <I>a<I>aab<I>baaba<I>abaababbaba.
1.3.4. Грамматики типа 3
Грамматики типа 3 называют автоматными грамматиками (А - грамматиками). Правила вывода в таких грамматиках имеют вид: <A>a или <A>a<B> или <A><B> a, где a Vт, <A>, <B>Va, причем грамматика может иметь только правила вида <A> a<B> - правосторонние правила, либо только вида <A><B>a - левосторонние правила. Примерами автоматных грамматик могут служить правосторонняя грамматика Г1. 6 и левосторонняя грамматика Г1. 7.
Г1. 6:
Vт = {a, b}, Va = {<I>, <A>},
R = { <I> a<I>,
<I>a<A>, <A>b<A>, <A>b<Z>, <Z> $ }.
Г1. 7:
Vт = {a, b}, Va = {<I>, <A>},
R = { <I><A>b,
<A><A>b, <A><Z>a, <Z><Z>a, <Z> $ }.
Эти грамматики являются эквивалентными и порождают язык
L(Г7) = {a...ab...b | n,m > 0}.
Между множествами языков различных типов существует отношение включения:
{ L типа 3 } { L типа 2 }{ L типа 1 }{ L типа 0}.
Доказано, что существуют языки типа 0, не являющиеся языками типа 1, языки типа 2, не являющиеся языками типа 1, и языки типа 3, не являющиея языками типа 2.
наибольшее практическое применение находят грамматики типа 2 и типа 3.
4. Понятие вывода. Дерево вывода. Виды вывода.
1.3.5. Вывод в кс-грамматиках и правила построения дерева вывода
Формальные грамматики позволяют задавать языки, представляющие множества цепочек, построенных по определенным правилам. Используемый способ задания позволяет построить любую цепочку, принадлежащую языку. Чтобы сделать процесс построения, называемый выводом, наглядным, его изображают в виде графа, точнее, в виде дерева, которое называют синтаксическим деревом или деревом вывода. Учитывая, что вывод любой цепочки языка, принадлежащей языку, порождаемому заданной грамматикой, должен начинаться с начального символа, правила построения дерева можно сформулировать так:
1) В качестве начальной вершины или корня дерева возьмем вершину, которую обозначим начальным символом грамматики <I>; эта вершина образует нулевой ярус дерева,
2) Если при выводе цепочки на очередном шаге используется правило грамматики <A> и вершина, помеченная нетерминалом <A>, расположена на ярусе с номером k-1, то к построенному дереву нужно добавить столько вершин, сколько содержится символов в цепочке , расположить эти вершины на ярусе k , обозначить их символами цепочки и соединить эти вершины дугами с вершиной <A>. Результатом вывода является множество конечных узлов - листьев, которые выписываются при обходе дерева слева - вниз - направо - вверх . Рассмотрим, например, грамматикy Г1. 8:
Г1. 8:
Vт = {a, b}, Va = {<I>},
R = {<I> a<I>b, <I>ab },
которая порождает язык L(Г8) = {aa...abb...b}, где а и b повторяются по n раз, n=1,2,...
Вывод цепочки с
помощью правил этой грамматики имеет
вид:
1
.3.6.
Синтаксический разбор
Вывод цепочки с помощью правил грамматики может быть задан не только в виде синтаксического дерева. Если пронумеровать правила грамматики, то последовательность номеров используемых правил также задает вывод.
Определение. Последовательность номеров правил грамматики Г, применение которых позволяет построить вывод рассматриваемой цепочки из начального символа грамматики, называется синтаксическим разбором . |
Например, в следующей грамматике
Г1. 9:
Vт = { i, +, * , (, ) }, Va = {<E>, <T>, <P>}
R ={ (1) <E> <E> +<T>,
(2) <E> <T>, (3) <T> <T> *<P>, (4) <T> <P>, (5) <P> (E), (6) <P> i },
правила которой пронумерованы, вывод <E> <E> +<T> <T> +<T> <T> *<P> +<T>
<P> *<P> +<T> i * <P> +<T> i * i +<T> i * i +<P> i * i + i
имеет синтаксический разбор [1,2,3,4,6,6,4,6].