Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 [ 60 ] 61 62 63 64 65 66 67 68 69

Упражнения

Эти упражнения охватывают круг вопросов, рассмотреннтх в гл. 1 -13. Многие из них носят обзорный характер, и решения к ним не приводятся.

13.1. Обоснуйте важность определения целей проектирования компилятора на начальном этапе.

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

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

13.4. Объясните, как вы можете подойти к решению вопроса выбора языка реализации для компилятора.

13.5. Должен ли разработчик компилятора хорошо знать тот язык, который он реализует?

13.6. Как вам кажется, в правильном ли порядке были рассмотрены в данной книге различные аспекты построения компиляторов? Если вы считаете этот порядок правильным, обоснуйте его, а если нет, предложите свой вариант.

13.7. Предложите темы для дальнейших разработок в области построения компиляторов.

13.8. Какие трудности, возникнут при написании компилятора для английского языка?

13.9. Декомпилятор осуществляет трансляцию с объектного кода в исходный. Какие проблемы возникнут при его разработке?

13.10. Рассмотрите аспекты разработки компилятора для Паскаля, Фортрана или любого другого более знакомого вам языка.



РЕШЕНИЯ УПРАЖНЕНИЙ К ГЛ. 1 - 12

Глава 1

1.1.

1.2.

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

Потребуется компилятор, написанный в коде 1900. Он осуществляет трансляцию с Алгола 68 в код 1900 (рис. У .1).

Паскаль

Код то

Г--------

Паскаль 1

йлгоп 68

йлгол 68

«од то

Код j

1900 1

Рис. У.1

1900

Hod I то I

1.3. а) Практически необходимы, несмотря на стоимость, так как позволяют проверить, не приводит ли логика программы к ошибкам в индексах. б) Если логика программы считается правильной, можно опустить, чтобы сделать объектный код меньше и быстрее, но это все же может дать нежелательный эффект." Цели 1, 2 и, возможно, 5, 6.

1.4. 1.5.

1.6.

1.7. 1.8.

1.9.

а) б) в)

1. 2.

Для стеков и таблиц. Требуются редко. Для модульности. Для более четкой диагностики.

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

Возможная несовместимость этих двух компиляторов.

(а + bxc) обычно представляется бинарным деревом, изображенным на рис. У.2, но если был объявлен приоритет у « + » больше, чем у «х, это дерево будет выглядеть так, как показано на рис. У. З.

Эффективный объектный код и небольшие объектные программы. 1.10. Построчная компиляция. Рис. У.2

рис. У.З





Глава 2

2.1. G1 = ({a, b. с},{А. В, С, S), P, S), где элементами P являются

S->ABC B->e

A->aA C->cC

A->e C->e

B->bB

G2=({a, b. с}, {Т. С, S}, P, S) где элементами P являются

S->TC C->cC

T->aTb C->e

T->е

Gз=({а,b,x,y},{S},P,S) где элементами P являются

S->xSy

S->a

S->b

2.2. L1, так как он соответствует регулярному выражению

a*b*c

2.3. Правила разбора:

S->xV T->yT

S->yT T->bB

V->xV T->b

V->bB B->bB

V->b B->b

2.4. (xx*\yy*)bb*.

2.5. Предложение

if b then if 6 then a else

имеет два синтаксических дерева (рис. У. 4).

2.6. См. рис. У.5.

2.7. G = ({0,1},{S}, P, S )

где элементами P являются

S->0S S->1S S->e



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 [ 60 ] 61 62 63 64 65 66 67 68 69