Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Неоднозначность грамматик. Устранение неоднозначности




Пример 12

 

Обратимся вновь к грамматике арифметических выражений (5.3). Предложение
id+id*id имеет два разных левых порождения

E=>E+E E=>E*E

=>id+ E E=>E+E*E

=>id + E*E => id + E * E

=> id + id * E => id + id * E

=> id + id*id => id + id*id

 

с двумя соответствующими им деревьями разбора, показанными на рис. 24.

       
 
   
 

 

 


a) 6)

Рис. 24. Два дерева разбора для id+id*id

Дерево разбора на рис. 24(а) отражает обычные приоритеты операций + и *, в отличие от дерева на рис. 24(6). Обычно приоритет умножения выше, и выражение типа а+b*с трактуется как а+(b*с), а не как (а+b)*с.

 

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

Неоднозначная грамматика — это та, которая для одного и того же предложения дает не менее двух левых или правых по­рождений. Для большинства типов синтаксических анализаторов грамматика должна быть однозначной, поскольку, если это не так, нельзя определить дерево раз­бора для предложения единственным образом.

Для устранения неоднозначности грамматика может быть переписана. В качестве примера устраним неоднозначность из следующей грамматики:

stmt —> if expr then stmt

(5.7)

| if expr then stmt else stmt other

| other

Здесь "other" означает все прочие инструкции. Грамматика (5.7) неоднозначна, поскольку cтрока

if E1 then if E2 then S1 else S2 (5.8)

имеет два дерева разбора, показанных на рис. 25.

 

 

 


Рис. 25 Два дерева разбора для неоднозначного предложения

Во всех языках программирования с условными инструкциями такого вида предпочтительно первое дерево разбора. Общее правило гласит "сопоставить каждое else, ближайшему незанятому then". Это правило устранения неоднозначности может быть встроено непосредственно в грамматику. Например, можно переписать грамматику рассмотренную ранее как однозначную. Основная идея заключается в том, что инструкция, появляющаяся между then и else, должна быть "сбалансированная", т.е. не должна оканчиваться на then не соответствующее некоторому else. Такая "сбалансированная" инструкция может представлять собой либо полную инструкцию if-then-else, содержащую только "соответствующие" инструкции, либо любые инструкции, отличающиеся от условной, т.е. получаем грамматику.

Stmt àS1 | S2

S1à if expr then S1 else S1 | other (5.9)

S2à if expr then stmt | if expr then S1 else S2

Эта грамматика генерирует то же множество строк, что и грамматика (5.7), но для строки (5.8) дает только одно дерево разбора, а именно то, которое связывает каждое else с ближайшим незанятым then.

 




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 1427; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.027 сек.