OberonCore
https://forum.oberoncore.ru/

Грамотный парсер чисел
https://forum.oberoncore.ru/viewtopic.php?f=61&t=919
Страница 1 из 1

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

Хотел добавить в "Технологии компиляции", но там закрыто...

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

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

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


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

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

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

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

Автор:  Info21 [ Четверг, 20 Март, 2008 16:38 ]
Заголовок сообщения:  Re: Грамотный парсер чисел

Сергей Губанов писал(а):
... И как же быть? ...

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

Автор:  Trurl [ Четверг, 20 Март, 2008 17:18 ]
Заголовок сообщения:  Re: Грамотный парсер чисел

Сергей Губанов писал(а):
Как правильно сканер/парсер должен прочитать (LONGINT) число -9223372036854775808?

Как "-", 9223372036854775808.

Автор:  Valery Solovey [ Пятница, 21 Март, 2008 17:50 ]
Заголовок сообщения:  Re: Грамотный парсер чисел

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/