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

105

2 2 1.2_node­3

1 1 1.2.2_node­8

________4

1 8 1._node­1

2 4 1.1_node­2

2 2 1.1.2._node_5

1 1 1.1.2.1_node­9

2 2 1.2_node­3

1 1 1.2.2_node­8

________5

1 8 1._node­1

2 4 1.1_node­2

2 2 1.1.2._node_5

2 1 1.1.2.2._node_10

2 2 1.2_node­3

1 1 1.2.2_node­8

________6

1 8 1._node­1

2 4 1.1_node­2

1 1 1.1.3_node­6

2 2 1.2_node­3

1 1 1.2.2_node­8

________7

9ТРАНСЛЯТОРЫ, ИНТЕРПРЕТАТОРЫ, АССЕМБЛЕРЫ, ВИРТУАЛЬНЫЕ МАШИНЫ, ДИЗАССЕМБЛЕРЫ И ОТЛАДЧИКИ

9.1 Основные определения

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

Для построения и анализа трансляторов разработана теория, методы, алгоритмы, инструментальные средства генерации компиляторов и анали­ за их функционирования. Все это можно найти в литературе приведенной в конце раздела. В этой главе будут на конкретных достаточно простых при­ мерах показаны идеи, принципы, методы и технологии разработки трансля­ торов, компиляторов, интерпретаторов, виртуальных машин, ассемблеров, линкеров, дизассемблеров и отладчиков.

106

Дадим ряд определений:

Транслятор — программа преобразования описания с одного языка на другой.

Компилятор программа перевода с алгоритмического языка высоко­ го уровня на язык машинных команд.

Ассемблер — программа перевода с низкоуровневого языка описания в последовательность машинных команд.

Интерпретатор — программа исполнения программы написанной на алгоритмическом языке.

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

9.2 Метод рекурсивного спуска

Язык арифметических выражений достаточно прост и практически всем понятно, как записывать эти выражения. Арифметические выражения строятся из идентификаторов, констант, знаков операций и скобок, кроме того можно записывать еще и некоторый функции, например, корень квад­ ратный, sin, cos и т.д.

Примеры арифметических выражений:

1.x+1/(10+y)

2.c+sin(a*x+2)

3.(count+1)*(count­1)

Грамматика языка арифметических выражений записана ниже.

<E> => <T>+<E> <E> => <T>­<E> <E> => <T>

−−−−−−−−−−−

<T> => <D>*<E> <T> => <D>/<E> <T> => <D>

−−−−−−−−−−−

<D> => (<E>)

<D> => <идентификатор> <D> => <константа>

Идентификатор — последовательность букв и цифр, начинающаяся с буквы.

Константа — вещественное число.

107

Не вдаваясь в теоретические подробности, по данной грамматике можно построить алгоритм разбора, который основан на методе рекурсив­ ного спуска[]. Суть этого метода заключается в следующем: пишутся три функции, для групп выделенных правил.

01

Функция РазборE()

02

вызвать РазборT()

03

цикл

04

если на входе "+", то сдвиг и вызвать РазборT()

05

иначе

06

если на входе "­", то сдвиг и вызвать РазборT()

07

иначе выход из цикла

08

конец цикла

09

конец функции РазборE

10

 

11Функция РазборT()

12вызвать РазборD()

13цикл

14если на входе "*" , то сдвиг и вызвать РазборD()

15иначе

16если на входе "/", то сдвиг и вызвать РазборD()

17иначе выход из цикла

18конец цикла

19конец функции РазборT

20

21Функция РазборD()

22если на входе "(" , то сдвиг и вызвать РазборЕ(), ждать " )"

23иначе

24если на входе буква, то взять идентификатор

25иначе

26если на входе цифра, то взять константу

27иначе выдать ошибку, сдвиг входа

28конец функции РазборD

Рассмотрим работу метода рекурсивного спуска на примере.

Пусть есть входная строка