Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Пример 23




Нахождение отношений приоритетов операторов

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

1. Если оператор θ1 имеет более высокий приоритет, чем оператор θ2, определяем что θ1 > θ 2 и θ 2 < •θ1. Например, если оператор * имеет более высокий приоритет, чем оператор +, то * •> + и + <• *. Эти отношения гарантируют, что при получении выражения вида E+E*E+E основой является E*E, и именно E*E будет свернуто первым.

2. Если θ1 и θ 2 представляют собой операторы равного приоритета (это может быть один и тот же оператор), то устанавливаем, что θ1 •> θ 2 и θ 2 •> θ1, если операторы левоассоциативны, и θ1 <• θ2 и θ2 <• θ1 в случае правоассоциативности. Например для левоассоциативных + и - устанавливаем, что +•>-, -•>- и - •> +. Для правоассоциативного оператора ↑ следует принять, что ↑<• ↑. Такие отношения гарантируют, что в выражении E-E+E основой является E-E, а в eee — последнее выражение E↑E.

3. Для всех операторов θ определяем отношения θ <• id, id •> θ, θ <• (, (<•θ,) •> θ •>), θ •> $ и $ <• θ. Кроме того, считаем, что

(=) $<•($<• id

(<• ( id •> $) •> $

(<• id id •>)) •>)

Эти правила гарантируют, что и id, и (E) будут приведены к E. Кроме того, $ служит как левым, так и правым маркером конца строки, что заставляет основы находится между ними.

 

На рис. 34 приведены отношения приоритета операторов для грамматики (7.1) в предположении, что:

1. оператор ↑ имеет высший приоритет и правоассоциативен;

2. операторы * и / имеют приоритет следующего уровня и левоассоциативны;

3. операторы + и - имеют низший приоритет и левоассоциативны.

Пустые ячейки означают ошибки.

 

  + - * / id ( ) $
+ •> •> <• <• <• <• <• •> •>
- •> •> <• <• <• <• <• •> •>
* •> •> •> •> <• <• <• •> •>
/ •> •> •> •> <• <• <• •> •>
•> •> •> •> <• <• <• •> •>
id •> •> •> •> •>     •> •>
( <• <• <• <• <• <• <• =  
) •> •> •> •> •>     •> •>
$ <• <• <• <• <• <• <•    

 

Рис. 34. Отношения приоритета операторов

 

7.4.5 Обработка ошибок переноса/свертки

 

При обнаружении ошибок синтаксический анализатор приоритета операторов вызывает программу восстановления после ошибок. При обращении к матрице приоритетов для принятия решения о переносе или свертке можно обнаружить, что между символом на вершине стека и очередным входным символом отношения отсутствует. Предположим, что на вершине стека находятся а и b (b на вершине стека), во входном потоке — с и d (c — первый), а между b и с нет отношений приоритетов. Для восстановления после этой ошибки нужно изменить стек или входной буфер (а может быть, и тот и другой). Можно изменить символы, вставив их в стек или входной буфер или удалить оттуда. При вставке и изменении следует избегать бесконечного цикла, в котором постоянно вставляются cимволы в буфер, перенести или свернуть которые невозможно.

Один из способов гарантировать отсутствие зацикливания — это обеспечить возможность переноса символа после восстановления (если текущий символ — $, следует убедиться, что во входной поток не вставляются новые символы, а стек в конце концов прекращается). Например, при ab в стеке и cd во входной строке, если а≤с, мы можем снять со стека b. Другой способ — удаление из входного потока с при b≤d. Третий способ заключается в поиске такого е, что b ≤е ≤с, и вставке е во входной поток с. В более общем виде, если единственный символ для вставки найти не удается, мы можем вставить строку символов, такую, что b ≤ •е 1ег •… enс.

Выбор конкретного действия должен, в конечном счете, определяться интуицией разработчика компилятора. Для каждой пустой ячейки матрицы приоритетов необходимо определить подпрограмму восстановления после ошибок; одна и та же подпрограмма может использоваться в нескольких местах. Когда синтаксический анализатор рассматривает запись для а, и не обнаруживает отношений приоритета между а и b, он находит указатель на подпрограмму восстановления после этой ошибки.

 




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


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


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



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




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