ВУЗ:
Рис. 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) и является важной задачей генератора кода.
Этапы лексического анализа, синтаксического анализа и генерации кода никогда не выполняются в указанной строгой
последовательности. На самом деле они тесно переплетаются между собой. Лексический анализатор начинает с чтения сим-
волов текста исходной программы и идентификации первых лексем. Затем он передает эти лексемы синтаксическому анализа-
тору.
Страницы
- « первая
- ‹ предыдущая
- …
- 127
- 128
- 129
- 130
- 131
- …
- следующая ›
- последняя »