Adaのnewの話

http://www.adaic.com/standards/05rm/html/RM-4-8.htmlのallocatorの文法をごらんください。型名のところがsubtype_indicationになっております。

ということは!このようなコードが意味解析はともかくパーサは通るはず!

X := new not null T delta 0.25 digits 10 range 1.1 .. 1.1 + 2.2;

実際にはshift/reduce conflictになりますけどね!

式の優先順位を定義したhttp://www.adaic.com/standards/05rm/html/RM-4-4.htmlをごらんください。allocatorはprimaryとして項扱いになってますよね。足し算は優先順位低いですよね。でもってconstraintの方をみると".."の左右はsimple_expressionで足し算書けますよね。

そう!上のコードは、2通りの解釈ができてしまうのです。

X := new [ not null T delta 0.25 digits 10 range 1.1 .. [ 1.1 + 2.2 ] ];
X := [ new [ not null T delta 0.25 digits 10 range 1.1 .. 1.1 ] ] + 2.2;

orz

ちなみにGNATはnewする型にconstraintなんて付けられませんよ、ええ。