Информатика. Курс лекций. Громов Ю.Ю - 129 стр.

UptoLike

Рис. 5.16. Два варианта дерева синтаксического анализа
оператора if Bl then if В2 then S1 else S2
Действительно, чтобы определить значение символа +, синтаксический анализатор должен знать, какой тип данных
связан с переменными Price и Tax. Если переменная Price имеет тип real, а переменная Taxтип character, то операция
суммирования переменных Price и Tax не имеет смысла; ее появление должно рассматриваться как ошибка. Если обе пе-
ременные Price и Tax имеют тип integer, то синтаксический анализатор потребует от генератора кода создать на машин-
ном языке команду с кодом операции сложения двух целых чисел. Если эти переменные имеют тип real, то синтаксический
анализатор потребует использовать операцию сложения двух чисел с плавающей точкой.
Предыдущий оператор имеет смысл и в некоторых из тех случаев, когда входящие в него переменные имеют разный
тип. Например, если переменная Price имеет тип integer, а переменная Taxтип real, то вполне возможно применить опе-
рацию сложения. В этом случае синтаксический анализатор может предложить генератору кода предварительно преобразо-
вать одну из переменных в другой тип и после этого выполнить требуемое сложение. Такое неявное преобразование типов
называется приведением типов (coercion).
Неявное приведение типов не одобряется многими разработчиками языков. Они считают, что неявное приведение типов
свидетельствует о неправильной разработке программы и что синтаксический анализатор ни в коем случае не должен по-
крывать эти недостатки. В результате большинство современных языков программирования являются строго типизирован-
ными (strongly typed), т.е. они требуют, чтобы все операции в программе выполнялись над данными согласованных типов без
необходимости неявного приведения типов. Синтаксические анализаторы этих языков рассматривают любые несоответствия
типов как ошибку.
Последняя стадия процесса трансляции программыэто генерация кода, т.е. создание команд машинного языка, вы-
полняющих выражения, распознанные синтаксическим анализатором. Этот процесс включает множество различных аспек-
тов, один из которыхповышение эффективности генерируемого кода. Например, рассмотрим задачу трансляции последо-
вательности из двух следующих операторов:
x у + z;
w x + z;
Эти операторы могут быть оттранслированы по отдельности. Однако это не позволит достичь высокой эффективности
результата. Генератор кода должен суметь распознать, что, когда первый оператор будет выполнен, переменные х и z уже
будут находиться в регистрах общего назначения центрального процессора и, следовательно, нет необходимости снова за-
гружать их из памяти перед выполнением второго оператора. Реализация подобных нюансов в построении программы назы-
вается оптимизацией кода (code optimization) и является важной задачей генератора кода.
Этапы лексического анализа, синтаксического анализа и генерации кода никогда не выполняются в указанной строгой
последовательности. На самом деле они тесно переплетаются между собой. Лексический анализатор начинает с чтения сим-
волов текста исходной программы и идентификации первых лексем. Затем он передает эти лексемы синтаксическому анализа-
тору.