Изменения

Перейти к: навигация, поиск

Атрибутные транслирующие грамматики

2391 байт добавлено, 00:47, 4 июня 2015
Нет описания правки
|style="background-color:#FFF;padding:2px 30px"| $T.type = real$
|-
|style="background-color:#FFF;padding:2px 30px"| $L \to L,id\ \{ENTRY addtype(key, value)\}$|style="background-color:#FFF;padding:2px 30px"| $L_1.in=L.in \\ addtype(ENTRY.key=id.entry, \\ ENTRY.value=L.in)$
|-
|style="background-color:#FFF;padding:2px 30px"| $L_id L.id \to id\ \{ENTRY addtype(key, value)\}$|style="background-color:#FFF;padding:2px 30px"| $addtype(ENTRY.key=id.entry, \\ ENTRY.value=L.in)$
|}
 
Семантическое правило $L.in = T.type$, связанное с продукцией $D \to TL$, определяет наследуемый атрибут $L.in$ как тип объявления. Затем приведенные правила распространяют этот тип вниз по дереву разбора с использованием атрибута $L.in$. Транслирующий символ ENTRY, связанный с продукциями для $L$, вызывает процедуру $addtype$ для добавления типа каждого идентификатора к его записи в таблице символов (по ключу, определяемому атрибутом $entry$).
 
<картинка>
Расмотрим некоторые аспекты реализации на более сложном примере
 При реализации методом рекурсивного спуска, каждому нетерминалу соответствует рекурсивная функция, которая ранее возвращала дерево разбора соответствующего узла. Теперь же функция, соответствующая некоторому нетерминалу $AT$, будет принимать в качестве аргументов его наследуемые атрибуты, а возвращать его синтезируемые атрибуты.
T(): '''int'''
'''return''' MUL.res
Заметим, что в рассматриваемой грамматике присутствует левая рекурсия, в связи с чем некоторые наши примеры имеют искусственный характер, хотя и являются наглядными. Левую рекурсию устраним позже.
Рассмотрим, что происходит с атрибутами при [[Устранение_левой_рекурсии| устранения левой рекурсии]] из грамматики.
$
<картинка>
 
 
Рассмотрим грамматику арифметических выражений, для наглядности оставив только числа, сложение и скобки.
 
<картинки деревьем и псевдокод финкций для грамматики до и после устранения левой рекурсии.>
 
<также пример генерации асссемблерного кода для стековой и регистровой машины.>
 
 
хоть немного про ANTLR - атрибуты.
</wikitex>
 
== Источники информации ==
* Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс. Первое издание. 2003. Стр. 279 {{---}} 305.
* Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс. Второе издание. 2008. Стр. ??? {{---}} ???.
* [https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Parser+Rules#ParserRules-RuleAttributeDefinitions| ANTLR Documentation - Rule Attribute Definitions]
 
[[Категория: Методы трансляции]]
[[Категория: Нисходящий разбор]]
497
правок

Навигация