КАТЕГОРИИ: Архитектура-(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) |
Пример 36Синтезируемые атрибуты в стеке синтаксического анализатора Восходящее выполнение S-атрибутных определений Для определения трансляций можно использовать синтаксически управляемые определения. Рассмотрим реализацию таких трансляторов. Создание транслятора для произвольного синтаксически управляемого определения может оказаться сложной задачей; однако имеются большие классы полезных синтаксически управляемых определений, трансляторы для которых строятся достаточно просто. К таким классам относятся S-атрибутные определения, т.е. синтаксически управляемые определения, в которых применяются исключительно синтезируемые атрибуты. Синтезируемые атрибуты могут быть вычислены восходящим синтаксическим анализатором в процессе разбора входной строки. Синтаксический анализатор может хранить значения синтезируемых атрибутов, связанных с грамматическими символами, в своем стеке. При выполнении свертки по хранящимся в стеке атрибутам символов из правой части сворачиваемой продукции вычисляются значения новых синтезируемых атрибутов. Можно расширить стек синтаксического анализатора для хранения значений этих синтезируемых атрибутов. Восходящий синтаксический анализатор для хранения информации о разобранных поддеревьях использует стек. Можно использовать дополнительные поля в стеке синтаксического анализатора для хранения значений синтезируемых атрибутов. Пример стека синтаксического анализатора с пространством для хранения одного значения атрибута показан на рис. 55. Стек реализован с помощью пары массивов — state и val. Каждая запись state является указателем (или индексом) на запись в таблице LR(1)-анализа. Если символ i -го состояния — А, то val[i] содержит значение атрибута, связанного с узлом дерева разбора, соответствующим этому А.
Рис. 55. Стек синтаксического анализатора с полем для синтезируемого атрибута
Текущая вершина стека определяется указателем top. Считаем, что синтезируемые атрибуты вычисляются непосредственно перед каждой сверткой. Предположим, что с продукцией А → XYZ связано семантическое правило А.а:=f(X.x,Y.y,Z.z). Перед Сверткой XYZ в А значение атрибута Z.z находится в val[top], значение Y.y — в vaI[top-1] иX.x — в val[top-2]. Если символ не имеет атрибутов, то соответствующая запись в массиве val не определена. После свертки top уменьшается на 2, состояние, соответствующее А, помещается в state[top] (т.е. на место Х.х), а значение синтезируемого атрибута А.а — в val[top]. Рассмотрим синтаксически управляемое определение калькулятора, приведенное на рис. 49. Синтезируемые атрибуты в аннотированном дереве разбора на рис. 50 могут быть вычислены LR-анализатором в процессе восходящего разбора входной строки 3*5 + 4n. Как и ранее, полагаем, что лексический анализатор обеспечивает значение атрибута digit. lexval — числовое значение каждой лексемы, представляющей цифру. При переносе синтаксическим анализатором лексемы digit в стек, он помещается в state[top], а значение атрибута — в val[top]. Для вычисления атрибутов модифицируем синтаксический анализатор, чтобы он выполнял фрагменты кода, показанные на рис. 56, непосредственно перед выполнением соответствующей свертки. Можно связать вычисление атрибутов со свертками, поскольку каждая свертка определяет используемую продукцию. Фрагменты кода получены из семантических правил на рис. 40 путем замены каждого атрибута позицией в массиве val.
Рис. 56. Реализация калькулятора с помощью LR-анализатора
Фрагменты кода не показывают, каким образом происходит работа с ntop и top. При свертке продукции с r символами в правой части значение ntop устанавливается равным tор-r+ 1, а после выполнения фрагмента кода top становится равным ntop. Последовательность действий, выполняемых синтаксическим анализатором для входной строки 3*5 + 4 n показана на рис. 57. В таблице представлено содержимое полей state и val стека после каждого действия синтаксического анализатора. Состояние стека заменяется соответствующим грамматическим символом, и вместо лексемы digit используется введенная цифра.
Рис. 57. Действия транслятора для входной строки 3*5 +4n
Рассмотрим последовательность событий для входного символа 3. На первом шаге синтаксический анализатор переносит в стек состояние, соответствующее лексеме digit (значение ее атрибута равно 3). Состояние представлено тройкой; в поле val находится значение 3. На следующем шаге синтаксический анализатор выполняет свертку в соответствии с продукцией F→ digit и семантическое правило F.val:= digit. lexval. Третий шаг состоит в свертке по продукции T → F. С этой продукцией не связан никакой фрагмент кода, поэтому массив val остается неизменным. После каждой свертки вершина стека val содержит значение атрибута, связанное с левой частью сворачивающей продукции. При реализации фрагменты кода выполняются непосредственно перед сверткой. Таким образом, можно связать с продукцией действие, выполняемое в процессе свертки в соответствии с данной продукцией.
Дата добавления: 2014-12-27; Просмотров: 481; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |