Az Euclid programozási nyelv

Vezérlési szerkezetek

Egyszerű utasítások

Az utasítások végrehajthatók, egy algoritmust adnak meg. Az egyszerű utasítás olyan utasítás, aminek semelyik része sem tartalmaz másik utasítást. Ilyenek: az értékadó utasítás, az eljáráshívás, a kilépő utasítások, az állítások, és az üres utasítás.

A nyelv legalapvetőbb utasítása az értékadó utasítás, amely egy kifejezés értékét hozzárendeli egy változóhoz. A kifejezések operandusokból, műveletekből és függvényekből állnak. Azonos precedenciájú műveletek kiértékelése balról jobbra történik. Ha T az U típusú elemek halmaza, akkor a T()az üres halmazt, a T(all) az U összes elemét, a T(x..y) az x és az y közti elemeket jelöli.
Ha a fordító nem tudja ellenőrizni, hogy egy kifejezésben túlcsordulás történt-e, egy érvényességi állítást helyez el a programban. Az operandusok típusának a specifikációban szereplő típussal kell megegyeznie, vagy annak altípusa lehet. Az értékadásnál a két oldal típusának meg kell egyeznie, a következő kivételek figyelembevételével:


A nyelvnek öt fajta operátora van:

Hét* precedencia osztály van:
*: mindegyiküknél erősebben kötnek az egyop. nem aritmetikai operátorok.

Az eljáráshívás tartalmazza az aktuális paramétereket, melyeket sorrendben feleltet meg a formális paramétereknek. A paramétereknek két típusa van: konstans, vagy változó. Ha a paraméter konstans, akkor a megfelelő formális paraméter egy lokális konstanst reprezentál, és az aktuális paraméternek kifejezésnek kell lennie. Változó paraméter esetén az aktuális paraméternek változónak kell lennie.
Kétféle kilépő utasítás van: az exit egy ciklusból lép ki, a return egy rutin végét jelzi. Ezeket el lehet látni logikai kifejezéssel (when parancs), így csak akkor hajtódnak végre, ha a kifejezés igaz.
Az állításokról bővebben a helyességbizonyításnál lesz szó.

Összetett utasítások

Az összetett utasítások más utasítások konstrukciójából állnak, amiket szekvenciálisan, feltételesen, vagy ismételve hajthatunk végre.
A szekvenciális végrehajtásnál blokkokat hozhatunk létre(begin..end), melyekben új változókat deklarálhatunk, ezáltal egy belső láthatósági kört teremtve. Létrehozhatunk blokkokat, amik deklarációk és utasítások egymáshoz rendelésére szolgálnak. Egy változó láthatósági köre lehet egy blokk, egy if ág, egy case eset, egy loop törzs, vagy egy modul(Az export ill. import kulcsszavakról (wordSymbol) az absztrakt adatszerkezeteknél lesz szó.).
Két feltételesen elágazó utasítás van, az if és a case. Az if a szokásos, megadható több elseif és egy else ág is benne.
A case több esetből választ ki egyet a szelektor értéke alapján, amelyre csak az a kikötés van, hogy manifest constant legyen. Ha a cimkék között nem szerepel a szelektor értéke, és nincs otherwise ág, akkor a program hibás.
A ciklusszervező utasítások a loop és a for. A loop folyamatosan ismétli a törzs végrehajtását, amíg egy exit utasítás ki nem lép belôle. A for utasítás végigmegy egy megadott értékkeszleten egy paraméterrel, és annak minden értékével végrehajtja a törzset. Az értékkészletet megadhatja egy modultípus, egy indextípus, vagy egy halmaz. A modultípusban három kötelező komponensnek kell szerepelni: a value és stop változóknak, és a Next eljárásnak, melyeket exportálni kell. Indextípus esetén meg lehet adni decreasing kapcsolót is, ami hatására fordított sorrendben járja be a ciklus az indexeket.
Nézzük példának a for-ciklusokat, melyek visszaköszönnek az Adában is:

for i in 1 .. upperBound loop exit when a(i)=searched end loop var b: sintArray { valamilyen tomb tipus } ... for i in b.IndexType loop b(i) := 0 end loop