A Simula programozási nyelv

Típusok, típuskonstrukciók



Szintaxis

<típusdeklaráció> ::= <típus> <típuslista>
<tömbdeklaráció> ::= ARRAY <tömblista> | <típus> ARRAY <tömblista>
<típus> ::= <érték típus> | <hivatkozási típus>
<érték típus> ::= INTEGER | SHORT INTEGER | REAL | LONG REAL | BOOLEAN | CHARACTER
<hivatkozási típus> ::= <objektumhivatkozás> | TEXT
<objektumhivatkozás> ::= REF(<minősítés>)
<minősítés> ::= <osztályazonosító>
<típuslista> ::= <típuslista elem> | <típuslista>,<típuslista elem>
<típuslista elem> ::= <azonosító> | <konstans elem>
<konstans elem> ::= <azonosító>= <érték típusú kifejezés> | <azonosító> = <szövegkonstans>

A nyelvben használatos típusok

A nyelv definíciója alapján a típus kétféle lehet:

Az érték típus olyan információt tartalmaz, amely a program futása során önmagában is értelmezhető. A hivatkozás önmagában nem értelmezhető információ, a hivatkozott értéket azonosítja. A hivatkozás fogalom a SIMULA 67 nyelvben a pointer intuitív fogalmának felel meg.

A karakter és a szöveg típus

Karakterek

A karaktereken létezik egy rendezés amit a következő eljárás szolgáltat:

INTEGER PROCEDURE rank(c); CHARACTER c;

Az ellentettje is létezik :

CHARACTER PROCEDURE char(n); INTEGER n;

Szöveg (Text)

Szövegérték: Karakterek sorozata, hossza a karakterek száma, lehet nulla is.
Szövegobjektum: Ez egy képzeletbeli osztály :

class TEXTOBJ(SIZE,CONST); INTEGER SIZE, BOOLEAN CONST; BEGIN   CHARACTER ARRAY MAIN(1:SIZE); END;

Szövegtároló: Adott hosszú, nem üres szövegértéket tartalmazó memóriaszelet. A szövegtároló rögzített hosszúságú, és csakis ilyen hosszúságú szöveget tartalmazhat. Lehet "konstans", vagy "változtatható". Ez tulajdonképpen egy szövegobjektum főtárolójának a részsztringje vagy az egész.
Szöveghivatkozás:Hivatkozás egy szövegtárolóra. Lehet szövegnélküliséget kifejező "NOTEXT" is.
Szövegváltozó:Olyan memóriaszelet, amely szöveghivatkozásból+pozíciójelzőből áll. A pozíciójelző által meghatározott karakter hozzáférhető a szövegből.

Mindent egybevetve tehát egy szövegváltozó fogalmilag a következő elemekből áll:
ref(textobj)obj ; integer start, length, pos
Ezekből az obj, a start és a length alkotja a szöveghivatkozást, az obj szövegobjektum MAIN-jének start - start+length-1 -ig tartó része a szövegtárolót, és a pos a pozíciójelzőt.

A szöveg típus műveletei

A következők mindig teljesülnek a szövegváltozókra:

OBJ =/= none
START >= 1
LENGTH >= 1
START + LENGTH <= OBJ.SIZE + 1
1 <= POS <= LENGTH + 1
OBJ = none
START = 1
LENGTH = 0
POS = 1

A Text osztályhivatkozás, rendelkezik attribútumokkal és műveletekkel.

Műveletei
Boolean Procedure Constant; (Igaz, ha konstans)
Text Procedure Main; (Fő sztring - a szöveg a Main egy része)
Integer Procedure Start; (Kezdőpozíció a Main-ban)
Integer Procedure Length; (Karakterek száma)
Integer Procedure Pos; (Aktuális pozíció)
Procedure SetPos(i); Integer i; (Pozíció változtatása)
Boolean Procedure More; (Igaz, ha Pos <= Length)
Character Procedure GetChar; (A Pos helyen lévő karakter)
Procedure PutChar(c); Character c; (Karakter helyezése Pos-ba)
Text Procedure Sub(i, n); Integer i,n; (Részsztring i kezdéssel n hosszon)
Text Procedure Strip; (Eldobja a space-eket)

Lekérdező műveletek:
Integer Procedure GetInt; (Integer-t olvas)
Long Real Procedure GetReal; (Real-t olvas)
Integer Procedure GetFrac; (Mint a GetInt, csak eldobja a space-eket)

Szerkesztő műveletek:
Procedure PutInt(i); Integer i; (Integer értéket ír be)
Procedure PutFix(i, n); Integer i,n; (Decimális értéket ír be)
Procedure PutReal(r, n); Long Real r; Integer n; (Tudományos formátumban ír be)
Procedure PutFrac(i, n); Integer i,n; (Csoportosít 3, space-ekkel elválasztott csoportba)

Text előállítás:
Text Procedure Blanks(n); Integer n; (Visszatér n hosszú üressel)
Text Procedure Copy(T); Text T; (T egy másolatát eredményezi) Példa:

a) begin   text t1;   t1:=copy("Géza");  ! Ez runtime error, mert a t1 szövegtárolója notext b) begin   text t1;   t1:-copy("Géza");  ! Ez jó, mert ez új szövegtárolóra való hivatkozást ad a változónak. c) begin   text t1;   t1:-copy("Lajos");   t1:="Géza";        ! Ez is jó, mert a szövegtároló már megvolt amikor beleírjuk a Lajost. d) begin   text t1;   t1:-copy("Géza");   t1:="Lajos";       ! Ez megint runtime error, mert a Lajos hosszabb mint a Géza. e) begin   text t1,t2;   t1:-copy("16Géza");   t2:-t1.sub(1,2);   while t1.pos<=t1.length do outchar(t1.getchar);   oustrongext(",");   while t2.pos<=t2.length do outchar(t2.getchar);   oustrongext(",");   oustrongext(t2.main);   oustrongext(",");   outint(t1.getint,2); end;

Az eredmény 16Géza,16,16Géza,16 lesz.

Típuskonstrukciók

Tömbök

A Simula nyelvben lehetőségünk van tömbök létrehozására.
Példák tömbökre:

(n, m, a, b globálisváltozók): Integer Array MyList (1:100); Array Matrix (1:n, 1:m); (Itt az implicit típus real lesz) Character Array Buffer(1: If a>b then a else b);

Konstansok

Szöveg konstansok

<szövegkonstans> ::= <egyszerű szövegkonstans> | <szövegkonstans> <szövegkonstans elhatároló> <egyszerű szövegkonstans> ::= "<karaktersorozat>"
<karaktersorozat> ::= <üres> | <karaktersorozat> <ISO kód> <a " kivételével egy nyomtatható karakter> | <karaktersorozat> <belső idézőjel>
<belső idézőjel> ::= ""
<ISO kód> ::= !<előjel nélküli egész szám>!
<szövegkonstans elhatároló> ::= <szóköz> | <sorvég> | <szövegkonstans elhatároló> <szóköz> | <szövegkonstans elhatároló> <sorvég>

Karakter konstansok

<karakterjelölés> ::= <ISO kód> | <nyomtatható karakter>

Numerikus konstansok

<hatványkitevő> ::= & <egész szám> | && <egész szám>

Pl. a 2&12 jelenti a 2*10E12-t.
A && arra szolgál, hogy ha a konstans a nagyobb pontosságú LONG REAL-ként értelmezendő.

Kifejezések

Érték- és hivatkozási típusú kifejezések

<címke> ::= <azonosító> <kifejezés> ::= <érték típusúkifejezés> | <hivatkozási típusúkifejezés> | <helymegjelölő kifejezés> <érték típusúkifejezés kifejezés> ::= <aritmetikai kifejezés> | <logikai kifejezés> | <karakterkifejezés> <hivatkozási típusúkifejezés> ::= <objektumkifejezés> | <szövegkifejezés>

Karakterkifejezések

<egyszerű karakterkifejezés> ::= '<karakterjelölés>' | <változó> | <függvényeljárás hívása> | (<karakterkifejezés>)
<karakterkifejezés> ::= <egyszerű karakterkifejezés> | IF <feltétel> <egyszerű karakterkifejezés> ELSE <karakterkifejezés>

Objektumkifejezések

<egyszerű objektumkifejezés> ::= none | <változó> | <függvényeljárás hívása> | <objektumgenerátor> | <helyi objektumkifejezés> | <minősített objektum> | (<objektumkifejezés>)
<objektumkifejezés> ::= <egyszerű objektumkifejezés> | IF <feltétel> <egyszerű objektumkifejezés> ELSE <objektumkifejezés>
<objektumgenerátor> ::= NEW <osztályazonosító> <aktuális paraméterlista>
<helyi objektumhivatkozás> ::= THIS <osztályazonosító>
<minősített objektum> ::= <egyszerű objektumkifejezés> QUA <osztályazonsító>

Szövegkifejezések

<egyszerű szövegkifejezés> ::= NOTEXT | <szövegkonstans> | <változó> | <függvényeljáráshívás> | (<szövegkifejezés>)
<szövegkifejezés> ::= <egyszerű szövegkifejezés> | IF <feltétel> <egyszerű szövegkifejezés> ELSE <szövegkifejezés>

Operátorok

Relációk

<reláció> ::= <ALGOL reláció> | <karakterreláció> | <szövegérték reláció> | <objektumreláció> | <hivatkozási reláció>

Karakterértékek összehasonlítása

<karakterreláció> ::= <egyszerű karakterkifejezés> <relációjel> <egyszerű karakterkifejezés>

Az x rel y ekvivalens a rank(x) rel rank(y) -nal, ahol a rel a következőket jelentheti : <,<=,=,<>,>=,>

Szövegértékek összehasonlítása

<szövegértékreláció> ::= <egyszerű szövegkifejezés> <relációjel> <egyszerű szövegkifejezés>

Két szövegérték egyenlő, ha mindkettő ugyanannak a karaktersorozatnak egy példánya. A <, reláció a szokott lexikografikus módon van értelmezve.

Objektumok összehasonlítása

<objektumreláció> ::= <egyszerű objektumkifejezés> IS <osztályazonosító> | <egyszerű objektumkifejezés> IN <osztályazonosító>

Az X IN C akkor igaz ha az X objektum a C osztályba vagy C valamelyik részosztályába tartozik. Az X IS C akkor igaz ha az X objektum a C-osztályba tartozik.

Hivatkozások összehasonlítása

<hivatkozás-összehasonlító> ::= == | ! | =/=
<hivatkozási reláció> ::= <objektumhivatkozási reláció> | <szöveghivatkozási reláció>
<objektumhivatkozási reláció> ::= <egyszerű objektumkifejezés> <hivatkozás-összehasonlító> <egyszerű objektumkifejezés>
<szöveghivatkozási reláció> ::= <egyszerű szövegkifejezés> <hivatkozás-összehasonlító> <egyszerű szövegkifejezés>

A hivatkozások összehasonlítása a == ( egyenlő ), és a =/= ( nem egyenlő ) szimbólumokkal lehetséges. Ha U és T szövegváltozók akkor a T == U a következővel ekvivalens : T.OBJ == U.OBJ and T.START = U.START and T.LENGTH = U.LENGTH. Vagyis a pozíciójelző nem számít. A T=/=U és a T=U nem zárják ki egymást.