- •Цели лексического анализа:
- •Основные функции лексического анализатора:
- •Общие принципы построения лексических анализаторов
- •Конечные автоматы
- •Преобразования нка
- •Задачи синтаксич анализа:
- •Роль синтаксического анализатора
- •Контекстно-свободные грамматики
- •Стековая реализация пс-анализа
- •Грамматики предшествования
- •Алгоритм синтаксического анализа простого предшествования
- •Алгоритм синтаксического анализа приоритета операторов
- •Нерекурсивный предиктивный анализ
- •Множества first и follow
- •Внутреннее представление программы
- •Способы внутреннего представления программ.
- •Триады – многоадресный код с неявно именуемым результатом.
- •Алгоритм преобразования дерева вывода в дерево операций:
- •Ассемблерный код и машинные команды
- •Синтаксически управляемые определения
- •Вид синтаксически управляемого определения
- •Восходящее выполнение s-атрибутных определений
- •Синтезируемые атрибуты в стеке синтаксического анализатора
- •Наследование атрибутов в стеке синтаксического анализатора
- •Замена наследуемых атрибутов синтезируемыми
Триады – многоадресный код с неявно именуемым результатом.
<операция>(<операнд1>,<операнд2>)
Один или оба операнда могут быть ссылками на другую триаду, если в качестве операнда данной триады выступает рез-т выполнения другой триады.
A:=B*C+D-B*10
1. * (B,C) 2. + (^1,D) 3. * (B,10) 4. – (^2,^3) 5. := (A,^4)
Преимущества триад:
1) Триады представляют собой линейн последоват-сть. Поэтому для них несложно написать алгоритм, который будет преобразовывать последоват-сть триад в последоват-сть команд результирующей программы. Однако здесь треб-ся алгоритм, отвечающ за распределение памяти, необходимой для хранения промежуточных результатов вычисления, так как временные переменные для этой цели не используются. В этом отличие триад от тетрад.
2) Триады представляют собой машинно-независимую форму внутреннего представления программы,
3) Триады требуют меньше памяти для своего представления, чем тетрады,
4) Триады явно отражают взаимосвязь операций между собой, что делает их применение удобным.
Косвенные триады - представление трехадресного кода состоит в использовании списка указателей на триады вместо списка самих триад.
1. ^11 2. ^12 3. ^13 4. ^14 5. ^15
11. *(B,C) 12. +(^1,D) 13. * (B, 10) 14. –(^2,^3) 15. := (A,^4)
Синтаксические деревья
Синтаксическое дерево (дерево операций) - это структура, представляющая собой результат работы синтаксического анализатора. Она отражает синтаксис конструкций входного языка и явно содержит в себе полную взаимосвязь операций.
Дерево разбора. Преобразование дерева разбора в дерево операций
В синтаксическом дереве внутренние узлы (вершины) соответствуют операциям, а листья представляют собой операнды. Как правило, листья синтаксического дерева связаны с записями в таблице идентификаторов. Структура синтаксического дерева отражает синтаксис языка программирования, на котором написана исходная программа.
Дерево операций можно непосредственно построить из дерева вывода, порожденного синтаксическим анализатором. Для этого достаточно исключить из дерева вывода цепочки нетерминальных символов, а также узлы, не несущие семантической (смысловой) нагрузки при генерации кода. Примером таких узлов могут служить различные скобки, которые меняют порядок выполнения операций и операторов, но после построения дерева никакой смысловой нагрузки не несут, так как им не соответствует никакой объектный код.
Алгоритм преобразования дерева вывода в дерево операций:
1). Если в дереве больше не содержится узлов, помеченных нетерминальными символами, то выполнение алгоритма завершено, иначе — перейти к шагу 2.
2). Выбрать крайний левый узел дерева, помеченный нетерминальным символом грамматики и сделать его текущим. Перейти к шагу 3.
3). Если текущий узел имеет только один нижележащий узел, то текущий узел необходимо удалить из дерева, а связанный с ним узел присоединить к узлу вышележащего уровня (исключить из дерева цепочку) и вернуться к шагу 1;
иначе — перейти к шагу 4.
4). Если текущий узел имеет нижележащий узел (лист дерева), помеченный терминальным символом, который не несет семантической нагрузки, тогда этот лист нужно удалить из дерева и вернуться к шагу 3; иначе — перейти к шагу 5.
5). Если текущий узел имеет один нижележащий узел (лист дерева), помеченный терминальным символом, обозначающим знак операции, а остальные узлы помечены как операнды, то узел, помеченный знаком операции, надо удалить из дерева, текущий узел пометить этим знаком операции и перейти к шагу 1; иначе — перейти к шагу 6.
6). Если среди нижележащих узлов для текущего узла есть узлы, помеченные нетерминальными символами грамматики то необходимо выбрать крайний левый среди этих узлов, сделать его текущим узлом перейти к шагу 3; иначе — выполнение алгоритма завершено.
Дерево операций является формой внутреннего представления программы, которой удобно пользоваться на этапах синтаксического разбора, семантического анализа и подготовки к генерации кода, когда еще нет необходимости работать непосредственно с кодами команд результирующей программы.
Преимущества внутреннего представления в виде дерева операций:
1) четко отражает связь всех операций между собой, поэтому его удобно использовать для преобразований, связанных с перестановкой и переупорядочиванием операций без изменений конечного результата;
2) синтаксические деревья – это машинно-независимая форма внутреннего представления программы.
Недостаток синтаксических деревьев заключается в том, что они представляют собой сложные связанные структуры, а поэтому не могут быть тривиальным образом преобразованы в линейную последовательность команд результирующей программы. Тем не менее, они удобны при работе с внутренним представлением программы на тех этапах, когда нет необходимости непосредственно обращаться к командам результирующей программы.
Синтаксические деревья могут быть преобразованы в другие формы внутреннего представления программы, представляющие собой линейные списки, с учетом семантики входного языка. Эти преобразования выполняются на основе принципов СУ-компиляции.