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

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

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

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


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

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

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

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