КАТЕГОРИИ: Архитектура-(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, а в e ↑ e ↑ e — последнее выражение E↑E. 3. Для всех операторов θ определяем отношения θ <• id, id •> θ, θ <• (, (<•θ,) •> θ •>), θ •> $ и $ <• θ. Кроме того, считаем, что (=) $<•($<• id (<• ( id •> $) •> $ (<• id id •>)) •>) Эти правила гарантируют, что и id, и (E) будут приведены к E. Кроме того, $ служит как левым, так и правым маркером конца строки, что заставляет основы находится между ними.
На рис. 34 приведены отношения приоритета операторов для грамматики (7.1) в предположении, что: 1. оператор ↑ имеет высший приоритет и правоассоциативен; 2. операторы * и / имеют приоритет следующего уровня и левоассоциативны; 3. операторы + и - имеют низший приоритет и левоассоциативны. Пустые ячейки означают ошибки.
Рис. 34. Отношения приоритета операторов
7.4.5 Обработка ошибок переноса/свертки
При обнаружении ошибок синтаксический анализатор приоритета операторов вызывает программу восстановления после ошибок. При обращении к матрице приоритетов для принятия решения о переносе или свертке можно обнаружить, что между символом на вершине стека и очередным входным символом отношения отсутствует. Предположим, что на вершине стека находятся а и b (b на вершине стека), во входном потоке — с и d (c — первый), а между b и с нет отношений приоритетов. Для восстановления после этой ошибки нужно изменить стек или входной буфер (а может быть, и тот и другой). Можно изменить символы, вставив их в стек или входной буфер или удалить оттуда. При вставке и изменении следует избегать бесконечного цикла, в котором постоянно вставляются cимволы в буфер, перенести или свернуть которые невозможно. Один из способов гарантировать отсутствие зацикливания — это обеспечить возможность переноса символа после восстановления (если текущий символ — $, следует убедиться, что во входной поток не вставляются новые символы, а стек в конце концов прекращается). Например, при ab в стеке и cd во входной строке, если а≤ • с, мы можем снять со стека b. Другой способ — удаление из входного потока с при b≤ • d. Третий способ заключается в поиске такого е, что b ≤ • е ≤ • с, и вставке е во входной поток с. В более общем виде, если единственный символ для вставки найти не удается, мы можем вставить строку символов, такую, что b ≤ •е 1 ≤ • ег≤ •… ≤ • en ≤ • с. Выбор конкретного действия должен, в конечном счете, определяться интуицией разработчика компилятора. Для каждой пустой ячейки матрицы приоритетов необходимо определить подпрограмму восстановления после ошибок; одна и та же подпрограмма может использоваться в нескольких местах. Когда синтаксический анализатор рассматривает запись для а, и не обнаруживает отношений приоритета между а и b, он находит указатель на подпрограмму восстановления после этой ошибки.
Дата добавления: 2014-12-27; Просмотров: 509; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |