OberonCore https://forum.oberoncore.ru/ |
|
Книга Вирта "Построение компиляторов" https://forum.oberoncore.ru/viewtopic.php?f=80&t=2147 |
Страница 3 из 4 |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 07:10 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
На странице 21 описан пример, показывающий структуру выражений. Используются символы E, T, F, V. Далее введённый синтаксис проиллюстрирован примером из трёх синтаксических деревьев. Я не понял, откуда на картинках взялась буква A? Кроме того, там задан следующий синтаксис: Цитата: E = T | "+" T. После этого в качестве примера предлагается формула "a * b + c". Но согласно определению E символ "+" не может встретиться после произведения. Он может быть только первым символом, либо идти сразу после "(" (см. определение F).T = F | T "*" F. F = V | "(" E ")". V = "a" | "b" | "c" | "d". Полагаю, должно быть E = T | E "+" T. |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 08:08 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
На стр. 25 в последнем примере упражнения 2.1 используется жирный символ V. Поскольку используется он на месте оператора, то я полагаю, что это логическая дизъюнкция, а не переменная. Однако, в определении синтаксиса на стр. 24 этот символ не встречается. Аналогичная ситуация с символом "?", который присутствует в примере, но отсутствует в РБНФ. В примере нет пробелов вокруг символов ">", "-", а также после символов "*" и логического отрицания. Перед символом отрицания, похоже, два пробела. |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 08:44 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Стр. 28 писал(а): Если очередное состояние уникально, то машина состояний является детерминированной, иначе недетерминированной. Вызывает сомнение выделенное слово. Уникальное состояние - это состояние, никогда не повторяющееся. Здесь же имеется в виду скорее однозначно определённое состояние.Got 1337? |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 08:50 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Стр. 31 писал(а): WHILE -R.eot & ... Похоже, в исходник вместо тильды затесался минус. Здесь же в листинге в двух местах пробел затесался перед символом ";": после WHILE и после IF. Здесь же явно в обоих случаях присваивается id[i] := OX вместо 0X.На стр. 32 картинка к упражнению 3.1 "грязная". Видны артефакты от кодирования в JPEG. Неужели нельзя было PNG или BMP? |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 09:37 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Поскольку решений к упражнениям в книге не нашёл, попробую здесь спросить. Стр. 25, упр. 2.1, последний пример: Вложение: Стр. 32, упр. 3.1:S1 = "a(x" { "ox" } ")". S2 = "a" { "+" ( "b" | { "c*" } ) } ".". |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 11:21 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Стр. 36, РБНФ. В продукции syntax лишний пробел перед точкой. В продукции factor после одного из символов "|" нет пробела. Стр. 37, листинг. В процедуре production лишний пробел перед ";" после IF. В процедуре syntax вызывается процедура prodиction. В процедуре Compile есть присваивание "lastpos := o;" (буква вместо цифры, причём в нижнем регистре). Стр. 39, РБНФ. В продукции term нужны пробелы вокруг "|". Стр. 42, упр. 4.1, РБНФ. В продукции variable нужен пробел перед между ident и "[". Стр. 43, упр. 4.2, РБНФ. В продукции factor: - кажется, есть лишний пробел между id и string; - в двух местах нужен пробел после |; - пропущен | между ")" и "[". Там же, в продукции id лишний пробел: "lette r". |
Автор: | Wlad [ Воскресенье, 02 Май, 2010 14:58 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
вы о печатном или электронном варианте говорите? и где последний взяти? |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 15:00 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Wlad2 писал(а): вы о печатном или электронном варианте говорите? О печатном.
|
Автор: | Сергей Прохоренко [ Воскресенье, 02 Май, 2010 15:49 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
А можно в wiki поместить список опечаток - чтобы всё было в одном месте? И аналогично - по второй книжке Вирта. |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 16:01 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Сергей Прохоренко писал(а): А можно в wiki поместить список опечаток - чтобы всё было в одном месте? А я думал, что здесь - "одно место".А здесь - второе. |
Автор: | igor [ Воскресенье, 02 Май, 2010 18:32 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Александр Ильин писал(а): Стр. 28 писал(а): Если очередное состояние уникально, то машина состояний является детерминированной, иначе недетерминированной. Вызывает сомнение выделенное слово. Уникальное состояние - это состояние, никогда не повторяющееся. Здесь же имеется в виду скорее однозначно определённое состояние. |
Автор: | Александр Ильин [ Воскресенье, 02 Май, 2010 18:36 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
igor писал(а): Пожалуй, не соглашусь с Вами. Слово "уникально" здесь очень хорошо подходит по смыслу. Есть ещё слово "единственно".
|
Автор: | igor [ Воскресенье, 02 Май, 2010 19:00 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Александр Ильин писал(а): Есть ещё слово "единственно". "Единственно" - это когда других состояний вообще нет. А "уникально" - это когда другие состояния всё-же есть, но они другие.Пусть система находится в каком-либо состоянии. Очередной прочитанный символ переводит систему в новое состояние. Причём, если был прочитан символ "А" (условно), то это одно новое состояние, а если "Б" - другое. То есть новое состояние в общем случае не единственно. Если же разные символы могут переводить систему в одно и то же новое состояние (не уникальное для каждого символа), то эта машина состояний является недетерминированной. |
Автор: | Александр Ильин [ Понедельник, 03 Май, 2010 11:45 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Стр. 48, наверху, продукция term(v0): нет пробела возле одного из символов "|". Стр. 53, РБНФ Оберон-0: - SimpleExpression: нет пробелов вокруг двух символов "|"; - ActualParameters, module: лишний пробел перед точкой. Далее, код модуля Sample. Лишние пробелы перед символами ";": - в процедуре Multiply - после IF и после WHILE; - в процедуре Divide - после обоих WHILE; - в процедуре BinSearch - после обоих WHILE. В процедуре BinSearch непоследовательно использованы пробелы вокруг "+": надо добавить пробелы в "(i+j)" и "k+1". |
Автор: | Александр Ильин [ Вторник, 04 Май, 2010 04:25 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Что-то я не понял, зачем в конце приложения C.1 (исходники лексического анализатора) присутствует куча вызовов EnterKW (null, "...")? Фактически тут перечислены ключевые слова, которые не используются в языке Оберон-0 (NIL, IMPORT и т.п.). Это, очевидно, следы от конвертации обычного компилятора Оберон в Оберон-0. Надо было просто удалить эти лишние ключевые слова и не вводить читателя в заблуждение относительно их необходимости в анализаторе. |
Автор: | Александр Ильин [ Вторник, 04 Май, 2010 04:47 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
На стр. 62 есть следующий исходник: Код: LOOP (*синхронизация*) Предпоследний END выровнен так, будто он относится к первому IF'у, на самом же деле он относится к ELSE. Попробовал переписать через WHILE:IF sym < ident THEN Mark("идентификатор?"); ... END; Statement; IF sym = semicolon THEN Get(sym) ELSIF sym IN follow(StatSequence) THEN EXIT ELSE Mark("точка с запятой?") END END Код: IF sym < ident THEN Mark("идентификатор?"); ... END; После этого возникли сомнения в правильности расстановки END'ов в оригинальном LOOP. Ведь получается, что у нас за одну итерацию цикла может выполниться два Mark'а. Может быть, я неправильно составил WHILE?
Statement; WHILE (sym = semicolon) & ~(sym IN follow(StatSequence)) DO IF sym = semicolon THEN Get(sym) ELSE Mark("точка с запятой?") END; IF sym < ident THEN Mark("идентификатор?"); ... END; Statement END |
Автор: | Александр Ильин [ Вторник, 04 Май, 2010 14:46 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
На стр. 67 приведён листинг процедуры NewObj. Завершающий END у процедуры имеет неправильный регистр: "End" вместо "END". |
Автор: | Valery Solovey [ Вторник, 04 Май, 2010 17:00 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Александр Ильин писал(а): Стр. 28 писал(а): Если очередное состояние уникально, то машина состояний является детерминированной, иначе недетерминированной. Вызывает сомнение выделенное слово. Уникальное состояние - это состояние, никогда не повторяющееся. Здесь же имеется в виду скорее однозначно определённое состояние. |
Автор: | Valery Solovey [ Вторник, 04 Май, 2010 17:06 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Александр Ильин писал(а): зачем в конце приложения C.1 (исходники лексического анализатора) присутствует куча вызовов EnterKW (null, "...")? Наверное, чтобы запретить использовать данные слова в качестве идентификаторов переменных. Тогда в будущем можно будет расширить компилятор, и программы на изначальном языке будут без переписывания компилироваться и на новом компиляторе.
|
Автор: | Александр Ильин [ Четверг, 06 Май, 2010 07:14 ] |
Заголовок сообщения: | Re: Книга Вирта "Построение компиляторов" |
Внизу стр. 71, третья строка снизу: нет пробела перед ":" и после "type" в комментарии. Последняя строка, нет пробела после "=". Стр. 72, третья строка сверху: должно быть "obj" вместо "Obj", нет пробелов вокруг ":=". В процедуре IdentList должно быть "NewObj" вместо "New Obj", там же нет пробела после запятой. В той же процедуре цикл WHILE не выровнен (три строки нужно сдвинуть на один уровень влево), а в строку "IF sym=ident..." нужно добавить 4 пробела: два вокруг пробела и по одному после запятой и ";". В процедуре Type1 в строке "IF (sym = number)..." не нужны скобки в условии, и далее нужно поставить пробелы вокруг ":=" в "n:=1". В следующей строке "IF sym = of..." после END нужно убрать пробел. Последние три строки на странице нужно сдвинуть вправо на один уровень (содержимое цикла WHILE и завершающий END не выровнены). Стр. 73, первая строка: лишний пробел между END и ";". |
Страница 3 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |