Любопытная деталь: компилятор ББ считает число -9223372036854775808 в тексте программы ошибкой, хотя оно входит в диапазон LONGINT согласно Сообщению о языке. Вместо этого можно писать MIN(LONGINT) или -9223372036854775807 - 1.
Связано с тем, что унарный минус расценивается как операция, за которой следует число; а 9223372036854775808 не входит в диапазон LONGINT, и поэтому выдается ошибка number too large.
Поправить несложно:
в DevCPS: (* global *) VAR unaryMinus*: BOOLEAN; (* в PROCEDURE Number после строчки *) ELSIF intval < 9223372036854775808.0E0 - realval THEN numtyp := int64 (* 2^63 *) (* добавить *) ELSIF unaryMinus & (intval = 9223372036854775808.0E0 - realval) THEN numtyp := int64 (* и в конце *) IF unaryMinus THEN intval := -intval; realval := -realval END END Number;
DevCPP: (* в PROCEDURE SimpleExpression *) IF sym = minus THEN DevCPS.unaryMinus := TRUE; DevCPS.Get(sym); DevCPS.unaryMinus := FALSE; Term(x); IF (x.class # Nconst) OR ~(x.typ.form IN {Int8, Int16, Int32, Int64, Real32, Real64}) THEN DevCPB.MOp(minus, x) END
Но, может, и не стоит трогать 20-летний код ради такой мелочи.
|