Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования методов трансляции.-1.pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
1.36 Mб
Скачать

28

ку в некотором языке, рассматриваемую как «смысл» первоначальной цепочки.

Строгой теории синтаксиса и семантики пока еще нет, однако для простых случаев – языков программирования - есть два понятия, которые можно используются для разборки части необходимого описания.

Первое из них – понятие контекстно – свободной (КС) грамматики. В виде контекстно – свободной грамматики можно формализовать большую часть правил, предназначенных для описания синтаксической структуры.

Второе понятие – схема синтаксически управляемого перевода, с помощью которого можно задавать отображение одного языка в другой.

Оба этих понятия – цель дальнейшего изучения.

2.3. Процесс компиляции

Практически для всех компиляторов есть некоторые общие процессы, попробуем их выделить.

Исходная программа, написанная на некотором языке, есть цепочка знаков. Компилятор превращает эту цепочку знаков в цепочку битов– объектный код. В этом процессе превращения можно выделить следующие подпроцессы:

1)лексический анализ;

2)работа с таблицами;

3)синтаксический анализ или разбор;

4)генерация кода или трансляция в промежуточный код(например, Ассемблер);

5)оптимизация кода;

6)генерация объектного кода.

Вконкретных трансляторах состав и порядок этих процессов -мо жет отличаться.

Кроме того, транслятор должен быть построен так, что никакая цепочка не может нарушить его работоспособности, т.е. он должен реагировать на любые из них («защита от дурака»).

Кратко рассмотрим каждый из этих процессов.

2.4. Лексический анализ

Входом компилятора, а, следовательно, и лексического анализатора, служит цепочка символов некоторого алфавита.

29

Работа лексического анализатора состоит в том, чтобы сгруппировать отдельные терминальные символы в единые синтаксические объекты – лексемы. Какие объекты считать лексемами, зависит от входного языка программирования.

Лексема – цепочка терминальных символов, с которой мы связываем лексическую структуру, состоящую из пары вида(тип лексемы, некоторые данные). Первой компонентой пары является синтаксическая категория, такая как «константа» или «идентификатор», а второй указатель: в ней указывается адрес ячейки, хранящей информацию о конкретной лексеме. Для данного языка число типов лексем считается конечным.

Обычно пару (тип лексемы, указатель) называют лексемой.

Таким образом, лексический анализатор – это транслятор, входом которого служит цепочка символов, представляющая программу, а выходом – последовательность лексем.

Этот выход образует вход синтаксического анализатора.

Пример.

Оператор Фортрана

COST=(PRICE+TAX)*0.98.

Лексический анализ:

·COST, PRICE и TAX – лексемы типа <идентификатор>;

·0.98 – лексема типа <константа>;

·=, +, * - сами являются лексемами.

Пусть все константы и идентификаторы можно отображать в лексемы типа <идентификатор>. Предполагаем, что вторая компонента лексемы представляет собой указатель элемента таблицы, содержащей фактическое имя идентификатора вместе с другими данными об этом конкретном идентификаторе.

Первая компонента используется синтаксическим анализатором для разбора.

Вторая компонента используется на этапе генерации кода для изготовления объектного модуля.

Таким образом, выходом лексического анализатора будет последовательность лексем

<ИД1>=(<ИД2>+<ИД3>)*<ИД4>.

Вторая часть компоненты лексемы (указатель) – показана в виде индексов. Символы = + * трактуются как лексемы, тип которых представляется ими самими. Они не имеют связанных с ними данных, и следовательно, не имеют указателей.