Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 08:32   #1
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию Обработка унарного минуса при трансляции языка

Не подскажите, как это лучше сделать?
Ахо и Ульман говорять только, что для синтаксического анализатора это сложная задача, поэтому в Fortran'е она была вынесена в лексический. Но для этого нужно хранить предыдущий токен, значит структура лексического анализатора будет весить больше, и вообще по-моему это ИЗВРАЩЕНИЕ =(
Как это делают в наши дни?

Последний раз редактировалось anyx; 10.12.2010 в 07:55.
anyx вне форума Ответить с цитированием
Старый 09.12.2010, 08:33   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

По-разному, но в основном большинство прислушиваются к мнению академиков, ибо авторитет. Я преобразовывал -а в 0-а .

Цитата:
поэтому в Fortran'е
В каком еще Фортране? Фортран Фортрану рознь и конкретная реализация зависит от разработчиков - а их (и Фортранов и разработчиков) мама не горюй.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.12.2010, 08:35   #3
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Я преобразовывал -а в 0-а .
В смысле, перед каждым "-" ставить "+ 0"?

Цитата:
Сообщение от Utkin Посмотреть сообщение
В каком еще Фортране?
В одной из первых реализаций
anyx вне форума Ответить с цитированием
Старый 09.12.2010, 08:37   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
В смысле, перед каждым "-" ставить "+ 0"?
Ну да . Только просто 0, а не +0. Хотя не знаю какая у тебя там реализация...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.12.2010, 08:40   #5
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Ну да . Только просто 0, а не +0. Хотя не знаю какая у тебя там реализация...
Нет, если просто ноль, то ошибка будет:

"- x) - 5" => "- x) 0 - 5"

Я вот что имел в виду:

"- x) - 5" => "- x) + 0 - 5"
"6 - 3" => "6 + 0 - 3"
anyx вне форума Ответить с цитированием
Старый 09.12.2010, 08:41   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну пусть так. Смысл идеи думаю тебе ясен.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 07:30   #7
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Только сейчас понял - это не прокатит. Приоритет унарного минуса больше, чем у степени ("**"). Т.е. "-5 ** 3" => "(-5) ** 3", а не в "- (5 ** 3)". А этот способ даёт "-5 ** 3" => "+ 0 - 5 ** 3" => "+ 0 - (5 ** 3)". Есть идеи?
anyx вне форума Ответить с цитированием
Старый 10.12.2010, 08:19   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Да.
-5**3 --> (0-5)**3
-5/6 --> (0-5)/6
Не знаю как у Вас, а у меня шла автозамена -5 чуть позже в момент получения действительного значения числа...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 08:25   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,068
По умолчанию

Цитата:
Сообщение от anyx Посмотреть сообщение
Нет, если просто ноль, то ошибка будет:

"- x) - 5" => "- x) 0 - 5"

Я вот что имел в виду:

"- x) - 5" => "- x) + 0 - 5"
"6 - 3" => "6 + 0 - 3"
Так это ж не унарный минус...
В книжках советуют первым делом все унарные минусы заменить на символ типа тильды, т.е. из такого:
Цитата:
-5 * 4 - 3
нужно получить такое:
Цитата:
~5 * 4 - 3
Ну а дальше уже дело техники.
В синтаксическом анализаторе этой штуке делать нечего, ибо там оно действительно будет сложно. А как лучше в лексический поместить - тут всё зависит от организации самого лексического анализатора.
pu4koff вне форума Ответить с цитированием
Старый 10.12.2010, 08:33   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Так это ж не унарный минус...
Ну в общем да, он его не там увидел -х-5 --> (0-x)-5 . Тогда не будет коллизий и при -х +-5 и при -х--5, что между прочим логично, но на современных парсерах обычно вызывает ошибку...

Зы. С тильдой тоже интересно, но у меня была засада - я допускал в идентифкаторах все спецзнаки, которые не используются для обозначений операций и разделителей, а в ряде случаев (когда ситуация позволяла) допускал и их использование.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 10.12.2010 в 10:15.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать переключение языка ввода при попадании в определенное поле smoky Microsoft Office Access 6 15.09.2017 07:59
Вставка трансляции bsanchezb HTML и CSS 0 11.06.2009 22:57
Захват и запись видео трансляции из интернета polco Софт 1 02.02.2009 13:58