Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

А-грамматик в виде графа состояний. Неоднозначность грамматик



 

Рассмотрим КС-грамматику c правилами вывода

B ® B+B½B*B½V½C

V ® a½b½c½... x½y½z (1.1.1)

C ® 0½1½2½...8½9

 

и вывод цепочки b+a*9

 

BÞB+BÞB+B*BÞV+B*BÞV+V*BÞV+V*CÞb+V*CÞb+a*CÞb+a*9 (1.1.2)

 

Такая запись не очень удобна, так как по ней трудно определить в какой части сентенциальной формы проводилась замена и какой нетерминал породил тот или иной символ. Более наглядна запись в виде дерева вывода или синтаксического дерева, представленного на рисунке 1.2 (a).

Для того чтобы понять, что выведено, применяем левый обход дерева. Идем от корня по крайней левой ветви, дойдя до терминала (конца ветви), выписываем его, возвращаемся до ближайшего разветвления и идем по самой левой из тех, которые еще не пройдены. Если все ветви данного узла уже исчерпаны, возвращаемся к предыдущему разветвлению, если оно есть. Продолжая таким образом, получим в результате b+a*9. Кроме вывода (1.1.2) по данному дереву можно получить целую серию выводов, например,

BÞB+BÞB+B*BÞB+B*CÞV+V*9ÞB+V*9ÞB+a*CÞV+a*CÞb+a*9(1.1.3)

 

Заметим, что эти выводы отличаются лишь порядком применения правил и что синтаксическое дерево и грамматика не определяют точный порядок вывода. На каждом шаге вывода имеется некоторый произвол в выборе заменяемого нетерминала. На данном этапе эти различия порядка для нас несущественны и мы считаем выводы эквивалентными, если им соответствует одно и то же дерево. Более важным здесь является то, что цепочка b+a*9 в данной грамматике имеет два дерева вывода (рисунки 1.2 (а) и (б)). Сентенциальная форма B+B*B имеет два синтаксических дерева и две основы: B+B и B*B. Грамматика неоднозначна, и при разборе сентенциальной формы можно выбрать любую из основ. Нельзя сказать, что выполняется раньше: умножение или сложение. Из рис. 1.2 (б) следует, что b+a*9 имеет два подвыражения b+a и 9, хотя по смыслу необходимо иметь подвыражения b и a*9.

Цепочка, порождаемая грамматикой, неоднозначна, если для ее вывода существует более одного синтаксического дерева. Грамматика неоднозначна, если она порождает неоднозначные цепочки, в противном случае она однозначна.

Здесь речь идет о неоднозначной грамматике, а не языке. Изменяя неоднозначную грамматику, можно получить однозначную грамматику для того же самого языка. Ниже приведена однозначная грамматика арифметических выражений

<врж> ® <терм> ç+ <терм> ç- <терм> ç<врж> + <терм> ç<врж> - <терм> <терм> ® <множ> ç<терм> * <множ> ç<терм> / <множ> (1.1.4)

<множ> ® (<врж>) ç i ç k

В этой грамматике i - любой идентификатор (имя переменной), а k - любая константа. Единственное дерево вывода для выражения i+i*k представлено на рисунке 1.3. (a). В соответствии с предложенной грамматикой, эта, да и все остальные цепочки, порождаемые грамматикой (1.1.4) однозначны.

Определим теперь, что в выражении i+i*k должно выполняться раньше: сложение или умножение. Операндами для +, согласно дереву, является <врж>, из которого выводится i, и <терм>, порождающий i*k. Это означает, что умножение должно выполняться первым и образовать <терм> для сложения; следовательно, умножение предшествует сложению. Сделать наоборот можно используя только скобки, как показано на рис. 1.3 (б). Грамматику арифметических выражений (1.1.4) следует предпочесть грамматике (1.1.1) ввиду ее однозначности и учета приоритета операций.

Наглядным способом представления А-грамматики является граф состояний (переходов). Вершины этого графа соответствуют нетерминалам, и из вершины A в вершину B проводится дуга, помеченная терминалом a, если в грамматике существует правило A ® aB.

Если в грамматике присутствует заключительное правило A ® b, а само это правило будем записывать A ® bF, получим тем самым модифицированную А-грамма­ти­ку.

 

 

Заметим, что каждому выводу в А-грамматике будет соответствовать путь по графу состояний из начальной вершины Sв вершину F. Граф А-грамматики действительного числа из примера 1.5 представлен на рисунке 1.4 (a).

А-грамматика числа, рассмотренная в примере 1.5, является недетерминированной, то есть в ней существует такой нетерминал A и терминалa, для которых существует несколько нетерминалов B, таких что выполняются правила A ® aB. Например, модифицированная А-грамматика числа, что отчетливо видно на рис. 4.1 (а), содержит правила < чбз >®.< дчп > и < чбз >®.F или < дчп > ® 0< дчп > и < дчп > ® 0F. Это нежелательно с точки зрения построения программ синтаксического анализа.

А-грамматика называется детерминированной, если для любого нетерминала A(A¹ F)и любого терминала aсуществует не более одного нетерминала B, для которого выполняется правило A® aB.

А-грамматика называется вполне детерминированной, если для любого нетерминала A (A¹ F)и любого терминала aсуществует единственный нетерминал B, для которого выполняется правило A® aB.

 

 

В следующей главе будет показано, что любую недетерминированную А-грамматику можно привести к детерминированной. Пока же, для того чтобы перейти к реализации программ синтаксического анализа А-языков, что является основной частью лабораторных работ на ЭВМ в данной части курса, отметим, что на практике всегда используется специальный символ - ограничитель цепочки. Это либо нулевой байт, либо символ конца файла.

Если, например, считать, что число из примера 1.5 завершается символом “;”, то детерминированная А-грамматика числа строится элементарно. Граф состояний для этого случая представлен на рис. 1.4 (б). Нетерминалы < чбз1 >, < дчп1 >, < пбз1 > добавлены здесь для того, чтобы исключить возможность формирования числа без целой и дробной части и без числа порядка после символа ”E”. Вполне детерминированная форма должна включать, кроме того, “ошибочный” нетерминал < Ош > и правила типа < чбз > ® +< Ош > или < дчп > ® .< Ош > и т.п. То есть для тех VN (A ¹ Fa Î VT, для которых в модифицированной детерминированной А-грамматике нет правил A ® aB, необходимо для формирования вполне детерминированной формы добавить правила A ® aE, где E º <Ош> - “ошибочная” вершина.

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.