Анимация
JavaScript
|
Главная Библионтека Упражнения Эти упражнения охватывают круг вопросов, рассмотреннтх в гл. 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).
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 |