OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 22:37

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Грамотный парсер чисел
СообщениеДобавлено: Четверг, 20 Март, 2008 15:05 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Хотел добавить в "Технологии компиляции", но там закрыто...

Как правильно сканер/парсер должен прочитать (LONGINT) число -9223372036854775808?

Если это число встречается при объявлении константы
CONST a = -9223372036854775808;
то, казалось бы, всё должно быть хорошо.

Если это число идёт в выражении VAR i, j: LONGINT
i := j - 9223372036854775808;
то тут возникает неоднозначность потому, что максимальное положительное число LONGINT равно 9223372036854775807, а знак - здесь вроде как не унарный, хотя тождественным преобразованием в него превращается:
i := j + (-9223372036854775808);


Вопрос в том кто отвечает за распознавание таких штуковин: сканер или парсер?

Традиционно это делает сканер (так проще запрограммировать), но для сканера выражение
"-9223372036854775808"
есть не один, а два символа: "-" и "9223372036854775808", причём второй - number to large.

И как же быть? Неужели числовые литералы должен распознавать не сканер, а парсер?

Но перенос этого дела из сканера в парсер усложнит его, а в итоге даст только то, что константу "-9223372036854775808" можно будет написать в тексте программы. Стоит ли овчинка выделки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грамотный парсер чисел
СообщениеДобавлено: Четверг, 20 Март, 2008 16:38 
Аватара пользователя

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

За попадание в диапазон ответственность с программиста не снимается никогда.
А значит важнее простые правила игры.
Вроде именно для этого придуманы всякие MIN(LONGINT).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грамотный парсер чисел
СообщениеДобавлено: Четверг, 20 Март, 2008 17:18 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Сергей Губанов писал(а):
Как правильно сканер/парсер должен прочитать (LONGINT) число -9223372036854775808?

Как "-", 9223372036854775808.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грамотный парсер чисел
СообщениеДобавлено: Пятница, 21 Март, 2008 17:50 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Не обязательно усложнять парсер. Можно усложнить сканер : ). После разбора знака минуса проверить, не идёт ли следом число. Если число не укладывается в верхний предел, но укладывается в нижний, то вернуть не минус с последующим числом, а плюс и отрицательное число.
Для этого в сканере придётся завести список опознанных, но не отправленных парсеру лексем.
А чем Вам не нравится такой способ?
Код:
i := j - 9223372036854775807 - 1
Ведь Вы же не расстраиваетесь по поводу того, что нельзя так:
Код:
i := j - 9223372036854775808 DIV 2 * 3


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

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


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

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


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

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