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/ |