OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 23 Август, 2019 02:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 21 Май, 2009 08:50 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Коллеги, прошу внимания!
Пишу я сейчас для книжки по системному программированию транслятор с ассемблера (вернее, несколько разных версий).
Дошел до перемещаемого модуля как результат трансляции.
Соответственно, парсер выражений перестает быть абсолютным и требуется различать относительные и абсолютные имена и выражения.
Обычный парсер написан по методу рекурсивного спуска по следующей обычной грамматике:
E = T {+T|-T}
T = F {*F | /F | %F }
F = A |+A|-A
A = константа|функция|имя|(E)
То есть Е - это абсолютное выражение.
Теперь, чтобы различать абсолютные и относительные, я добавляю в грамматику правилa:
R = R { +V |-V } | (R) | имяR
V = R-R | E
Далее - грамматика для E.
В последнем правиле для Е заменяем имя на имяА. Таким образом, определим две разные функции для получения значения метки: для относительной и абсолютной.

Не будут ли коллеги столь любезны посмотреть на грамматику: нет ли косяка, в котором неправильно смешиваются относительные и абсолютные выражения?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 21 Май, 2009 11:00 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А что такое относительные выражения?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 21 Май, 2009 11:26 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Valery Solovey писал(а):
А что такое относительные выражения?

Они же - адресные, они же перемещаемые.
Транслятор с ассемблера на первом проходе вычисляет смещения всех меток операторов. Все метки, помечающие команды или данные, по умолчанию являются относительными. Ибо абсолютные адреса памяти, представленные в программе именем-меткой, требуется изменять при загрузке увеличивая на адрес загрузки.
Абсолютные - это типа непосредственный операнд в команде. Он при загрузке никогда не изменяется.
Например в Интеле есть команда mov ax, 5 - тут абсолютное выражение. А в команде
lea ax, name - выражение относительное (name - адрес памяти).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 21 Май, 2009 12:16 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Чем A отличается от T?
Если F = A + A, то *F = *A + A, а не *(A + A). А что самое неприятное - теряется очерёдность приоритетов (умножение и сложение становятся равноправными).

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 22 Май, 2009 11:52 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Грамматика для E - это классическая грамматика для арифметических выражений. Здесь звездочка - это не разыменование, а как раз умножение. Правило для F учитывает унарный плюс и минус. А правило для A уже либо обращается к терминалам, либо обеспечивает рекурсивный вызов для вычисления выражения в скобках.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 23 Май, 2009 16:40 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Я так и понял, что звёздочка - это не разыменование. То есть, допустимы такие конструкции?
Код:
A*-A/+A

Арифметические выражения из книги Свердлова:
Код:
E → TA
A → ε | + TA | - TA
T → MB
B → ε | * MB | / MB
M → a | b | c | ( E )

А для унарного знака, наверное, лучше так:
Код:
E → TA | -TA



И всё равно не понятно, как будет выглядеть грамматика после добавления R.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 23 Май, 2009 16:59 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Большое спасибо за наводку на Свердлова!
Как-то я про него забыл. Посмотрю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 08:08 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Свердлов помог.
Я обычую грамматику переписал так:
A=+E|-E|E
E = T {+T|-T}
T = F {*F | /F | %F }
F = константа|функция|имя|(A)
Получилось лучше.
Относительность и абсолютность выражений на уровне LL(1) грамматики - сложно состряпать, если вообще возможно.
Дело в том, что возможны выражения R-A и R-R. Один и тот же символ (минус) в множестве first для разных правил. И там еще минус в правиле для E. А состряпать грамматику с единственным минусом мне не удалось (видно, тямы :) не хватает).
Я обошелся другим способом.
Просто вычислителю задается, какой тип выражений он должен считать, и он в лоб проверяет, соответствуют ли аргументы и операции этому выражению.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 09:06 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Интересно, какого года книга Свердлова... У Вирта такая грамматика ещё в синтаксисе Паскаля.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 10:21 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Евгений Темиргалеев писал(а):
Интересно, какого года книга Свердлова... У Вирта такая грамматика ещё в синтаксисе Паскаля.

Да понятно, что Свердлов у Вирта подсматривал :)
Но мне книга Свердлова нравится больше всего, ибо написана преподом именно для студентов. Отсюда - простой и понятный язык. Но все, что нужно - есть.
И еще, мужик реализовал язык О сразу на паскале, обероне, С++, Яве и Додиезе - и все листинги привел. Есть элемент для сравнения.
Относительно С++ могу сказать, что он, видимо, не имеет практики на С++, поэтому использовал немного устаревшие части С++.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 10:22 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
>Интересно, какого года книга Свердлова...
http://www.piter.com/book.phtml?978546900378

Описываемый в книге язык О - очень урезанная версия Оберона.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 10:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Интересно, какого года книга Свердлова...
2007.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 10:28 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Валерий Лаптев писал(а):
Относительность и абсолютность выражений на уровне LL(1) грамматики - сложно состряпать, если вообще возможно.
Вся проблема из-за имён? Не известно, какое константа, а какое адрес? Так пусть это решается на уровне словаря имён. При разборе указывается ссылка на положение в словаре нужного имени, где делается соответствующая пометка, а при трансляции эта пометка учитывается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 10:38 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Валерий Лаптев писал(а):
Да понятно, что Свердлов у Вирта подсматривал :)
Я так намекаю, что хорошую классику почитать полезно. Для меня интересен такой момент: где +- как унарные операции выделены, допустимо:
3 * -b + -a
При Виртовской грамматике, только как в математике можно:
3 * (-b) + (-a).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 13:09 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Valery Solovey писал(а):
Валерий Лаптев писал(а):
Относительность и абсолютность выражений на уровне LL(1) грамматики - сложно состряпать, если вообще возможно.
Вся проблема из-за имён? Не известно, какое константа, а какое адрес? Так пусть это решается на уровне словаря имён. При разборе указывается ссылка на положение в словаре нужного имени, где делается соответствующая пометка, а при трансляции эта пометка учитывается.

Не только. С самим именами разобраться - нефиг делать. Проблема в том, что относительные адреса не во всех операциях могут участвовать (только +-). И даже если операции допустимые, то они должны взаимно компенсироваться. То есть два относительных имени складывать нельзя, а вычитать - можно. Но вычистать можно и абсолютное выражение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 15:50 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А это, наверное, делать лучше с помощью контекстных проверок: если текущая операция в списке разрешающих использовать относительные имена (или перемещаемые?), то одно из имён может быть относительным, иначе, ошибка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2009 15:55 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Да я уже сделал все. Работает и различает относительные и абсолютные.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB