A Cool programozási nyelv

Vezérlési szerkezetek

Kifejezések

Vezérlési szerkezetek

A legegyszerűbb kifejezések a konstansok. A logikai konstansok a true és a false. Az egész szám konstansok számjegyek előjelnélküli sorozata. A karakterlánc konstansok karakterek sorozata idézőjelek közé zárva. Ezek maximum 1024 karakter hosszúak lehetnek.
A konstansok a Bool, Int és a String osztályokhoz tartoznak. Egy konstans értéke a megfelelő osztály egy objektuma.

Azonosítók

A lokális változók, a formális paraméterek, a self és az osztály attribútumok azonosítók. Attribútumot nem hozhatunk létre self azonosítóval.
A lokális változók és a formális paraméterek lokális láthatósággal rendelkeznek. Az attribútumok az egész osztályban láthatóak, feltéve, hogy más változó nem fedi el őket.

értékadás

Egy értékadásnak

<azonosító> <- <kifejezés>

formája van. A kifejezés statikus típusa meg kell feleljen az azonosító deklarált típusának. Az utasítás értéke kifejezés értékével egyezik meg, statikus típusa kifejezés statikus típusa.

Eljáráshívás

Cool-ban háromféle eljáráshívás van. Ezek abban különböznek, hogy hogyan választjuk ki a hívott metódust. A leggyakrabban a

<kifejezés>.<azonosító>(<kifejezés>,...,<kifejezés> )

formát használjuk. Először az argumentumokat balról jobbra kiértékeli a rendszer, majd a . előtti kifejezés típusát is meghatározza. Ha ez void, akkor futásközbeni hiba lép fel. Egyébként a típus osztályának azonosító nevű metódusa kerül meghívásra a kiértékelt kifejezésekkel, a self változóhoz pedig a . előtti kifejezés értékét kell rendelni. Az egész kifejezés értéke a metódus által visszaadott érték.
Ha a metódus által visszaadott érték a SELF_TYPE, akkor a kifejezés típusa a . előtti kifejezés típusa lesz, egyébként a metódus definíciójában megadott. A

<azonosító>(<kifejezés>,...,<kifejezés> )

forma a

self.<azonosító>(<kifejezés>,...,<kifejezés> )

forma rövidítése. A

<kifejezés>@<típus>.<azonosító>(<kifejezés>,...,<kifejezés> )

forma segítségével elérhetünk olyan, a szülőben definiált metódusokat, melyeket a gyermekben elfedtünk. Természetesen ekkor az @ jel baloldalán álló kifejezés típusának meg kell felelnie a típus- nak.
A . előtt álló kifejezés statikus típusának rendelkeznie kell a hívott eljárással és a paraméterek statikus típusának illeszkedni kell a hívott metódus formális paramétereinek típusára. (A feljebb definiált >= reláció szerint:
paraméter statikus típusa >= formális paraméter típusa

Feltételes elágazás

A feltételes elágazás formája a következő:

if <kifejezés> then <kifejezés> else <kifejezés> fi

A szemantika a szokásos. Először az if utáni kifejezés kiértékelése történik meg (ennek Bool statikus típusúnak kell lennie). Ha true, akkor a then ágat választjuk, egyébként az else ágat. Az utasítás értéke a megfelelő ág értékével egyezik meg. Mivel az ágak tetszőleges típusúak lehetnek, így a feltételes elágazás típusa a két ág típusának legközelebbi közös őse lesz. Ez végső esetben az Object. Ennek jelölésére bevezetjük a típusokon értelmezett műveletet. Legyen A, B, C és D tetszőleges típus (de nem SELF_TYPE). A legkisebb típusa típusok egy halmazának az az eleme, amelynél minden más típus >= a halmazban (a típusokon értelmezett >= reláció szerint).

A B =

az a legkisebb C típus, melyre C >= A és C >= B (vagyis A és B legkisebb közös öse)

SELF_TYPED SELF_TYPED =

SELF_TYPED

SELF_TYPED A =

D A

A SELF_TYPED =

A D

Legyen T és F a statikus típusa az elágazás ágainak. Ekkor az elágazás típusa T F lesz.

Ciklus

A ciklus formája a következő:

while <kifejezés> loop <kifejezés> pool

A ciklus minden lefutása előtt megtörténik a while utáni kifejezés kiértékelése (ennek Bool statikus típusúnak kell lennie). Ha false, akkor a ciklus terminál. A ciklus statikus típusa Object .

Blokk

A blokk formája a következő:

begin <kifejezés>;...,<kifejezés>; end

A kifejezés-ek balról jobbra értékelődnek ki. Minden blokknak legalább egy kifejezés-e van. A blokk értéke az utolsó kifejezés értéke, statikus típus az utolsó kifejezés típusa.
A pontosvessző mint terminátor használható.

A let utasítás

A let utasítás a következő alakú:

let <azonosító1> : <típus1> [ <- <kifejezés1> ], ... <azonosítón> : <típusn> [ <- <kifejezésn> ] in <kifejezés> end

Lehetőség van a változóknak kezdeti értéket adni. Ha van kezdeti érték, akkor azok balról jobbra értékelődnek ki. A let utasítás értéke a kifejezés értékével egyezik meg. A megadott változók csak a let utasítás törzsében láthatóak.
Az azonosító1, ..., azonosítók változók felhasználhatóak az azonosítóm változó értékadásakor, ha m > k.
Ha egy azonosító többször fordul elő, akkor az utolsó elfedi a többit. A bevezetett változók minden azonos nevű változót elfednek. Minden let utasításnak legalább egy változót kell deklarálnia.
A let utasítás típusa kifejezés típusa.

Többirányú elágazás

A

case <kifejezés0> of
 
     <azonosító1> : <típus1> => < EM> <kifejezés1>
      ...
      <azonosítón> : <típusn> => < EM> <kifejezésn>
esac

utasítással valósíthatunk meg többirányú elágazást. Ez futásidejű típusellenőrzést tesz lehetővé. Először kifejezés0 értékelődik ki, majd az értéke típusának legközelebbi ősének típusk ágát kell választani. Ekkor az azonosítók értéke kifejezés0 értéke lesz, és kifejezésk kerül kiértékelésre. A case értéke kifejezésk értéke. Ha nem lehet ágat kiválasztani, vagy kifejezés0 típusa void, akkor futásidejű hiba lép fel.
Minden case utasításnak legalább egy ága kell legyen. A case utasítás statikus típusa a kifejezési kifejezések legközelebbi közös őse.
Nincs default ág, de a

x : Object => ...

utasítás nyílván hasonló értelmű.

A new utasítás

Objektumot a

new <típus>

utasítással hozhatunk létre. Az utasítás statikus típusa típus .

Az isvoid utasítás

Az

isvoid <kifejezés>

utasítás true-t ad, ha a kifejezés típusa void .

Aritmetikai és relációs műveletek

A Coolban 4 bináris aritmetikai művelet van. Ezek a +, a -, a * és a /.
Az operandusok statikus típusa Int kell legyen, az eredmény típusa is Int lesz.
3 bináris összehasonlító művelet van. Ezek a <, a <= és az =.
A < és a <= operandusai is csak Int-ek lehetnek, az eredmény Bool típusú. Az = művelet esetén ha valamelyik operandus Int, Bool vagy String típusú, akkor a másiknak is annak kell lennie. Nem alap objektumok esetén pointer egyenlőséget vizsgál a rendszer.
Unáris operátor kettő van. Ezek a ~, amely a komplemensét adja az Int statikus típusú operandusnak és a not, amely a< STRONG > Bool< /STRONG> típusú operandus logikai ellentettjét adja.