Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Генерация ОПС для арифметических выражений
Преобразование арифметического выражения в ОПС можно выполнить в процессе работы анализатора. Например, в LL(1)-анализаторе для этого необходимо кроме основного магазина, куда в процессе работы записываются правые части порождающих правил, использовать синхронно работающий с ним дополнительный магазин. В этот дополнительный магазин будем записывать последовательность семантических действий, генерирующих элементы ОПС. Сами же действия по генерации ОПС будут выполняться при извлечении элементов из дополнительного магазина. Для реализации такого алгоритма наряду с основной таблицей действий LL(1)-анализатора необходимо задать семантическую таблицу. Ее размеры в точности совпадают с основной таблицей, более того, для каждой непустой клетки основной таблицы, где находится правая часть какого-либо правила порождения, в семантической таблице помещается последовательность действий, количество которых равно длине правой части. При этом надо учесть, что терминальные символы в КС-грамматике на самом деле являются лексемами, распознаваемыми лексическим анализатором. Некоторые из лексем, например имена переменных и константы, содержат дополнительную семантическую информацию – ссылки на таблицы переменных или таблицы констант, т.е. одинаковые терминальные символы в КС-грамматике семантически могут различаться. Удобнее всего показать использование семантической таблицы на примере.
Пример 11. Пусть задана грамматика простых арифметических выражений, преобразованная к обобщенной нормальной форме Грейбах, та же самая, что в примере 8. Табл. 13 в каждой клетке содержит действия LL(1)-анализатора, а ниже – синхронно выполняемые с ними семантические действия по генерации ОПС. В них знаком □ отмечены пустые действия, символом a – запись в ОПС операнда из входной цепочки (переменной или константы), символы + и * обозначают запись в ОПС знаков операций. Сами эти действия будут выполняться в момент выталкивания их из дополнительного магазина. Табл. 13
Так как одинаковые терминальные символы a в КС-грамматике семантически могут различаться, будем во входной цепочке различные операнды обозначать разными символами: a, b и др., при этом все они будут соответствовать одному и тому же терминальному символу a. При этом операнды могут быть как именами переменных, так и константами. Лексический анализатор, непосредственно анализирующий входную цепочку символов, на каждом шаге работы LL(1)-анализатора выдает ему тип лексемы. Если эта лексема – имя, а в магазине верхний символ a, то анализатор ищет это имя в таблице переменных, и если оно там будет найдено, то генерируется в ОПС тип переменной и ее номер в таблице. Если же такого имени в таблице нет, то это ошибка в анализируемом тексте программы, и анализатор должен выдать об этом диагностическое сообщение. Если очередная лексема – константа, то ее значение записывается в таблицу констант, а ее тип и номер в таблице констант генерируется в ОПС. Пример работы LL(1)-анализатора с генерацией ОПС для входной цепочки a*(c + d) ┴ представлен в табл. 14. Табл. 14
Рассмотренная грамматика простых арифметических выражений позволяет задавать формулы не только с операциями + и *, но и с некоторыми другими операциями. Тогда под обозначением + надо понимать и другие операции с таким же приоритетом, в частности, операцию – (минус), а под обозначением * еще и операцию / (делить). Заметим, что в заданной грамматике операция + имеет меньший приоритет, чем операция *. При этом конкретная операция, которая генерируется в ОПС, должна переписываться из анализируемой цепочки в дополнительный магазин, а уже оттуда – в ОПС. Эту грамматику можно расширить для того, чтобы можно было записывать унарные операции (+ и –) перед операндом. Для этого достаточно добавить еще один нетерминал и порождающие правила: F → +G G → (S) | a При работе анализатора по правилу F → +G в магазин следует записывать цепочку: +G□, а в дополнительный магазин: □□+, где под знаком + следует понимать группу унарных операций (+ и –), которые должны отличаться от бинарных. Конец примера.
Дата добавления: 2015-07-26; просмотров: 148; Нарушение авторских прав Мы поможем в написании ваших работ! |