Россия |
Выбор инструкций при генерации кода
Подстановка деревьев
Для дальнейших рассуждений введем следующие обозначения:
- через root(t) обозначим корень дерева t
- через t(v) обозначим поддерево дерева t с корнем v (таким образом, t(root(t))=t)
- через sons(v) обозначим множество сыновей вершины v
- через son(v,i) обозачим i-го сына вершины v
Для пары деревьев в одном и том же алфавите можно определить операцию подстановки. Для этого в одном из них выбирается лист, который затем заменяется на корень другого дерева. Если подставляется вместо вершины v в дерево , то результат подстановки будем обозначать .
Регулярные деревянные грамматики
Одним из способов задания деревянных языков являются автоматные деревянные грамматики.
Деревянная грамматика в нормальной форме - это четверка, содержащая входной алфавит (снабженный функцией арности), алфавит нетерминалов, стартовый нетерминал и множество правил. В отличие от обычных контекстно-свободных грамматик, у которых в правой части правила стоит слово из объединенного алфавита терминалов и нетерминалов, в деревянной грамматике в правой части правила находится так называемый деревянный образец, который в общем случае является деревом, у которого нетерминалами могут быть помечены только (некоторые) листья. В приведенном выше определении требуется, чтобы деревянный образец имел высоту не более единицы и чтобы все его листья были помечены нетерминалами (именно поэтому данные грамматики называются грамматиками в нормальной форме).
Очевидно, что деревянные грамматики в данном виде есть обобщение обычных контекстно-свободных автоматных грамматик. Легко видеть, что возможен и контекстно-зависимый вариант - для этого достаточно разрешить присутствие деревянного образца в левой части правила. Заметим, наконец, что неавтоматный вариант контекстно-свободных грамматик не обобщается на деревянный случай - непонятно, как можно обобщить правило