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:
- Érték típus:
- Integer
- Short integer
- Real
- Long real
- Boolean
- Character
A short integer és a long real típusok csupán a szabványos aritmetikai típusok javasolt kibővítései. A short integer típusdeklaráció olyan egész változók deklarálására szolgál, amelyek értéktartománya része az egész változók értéktartományának. A long real típusdeklaráció olyan változók deklarálására szolgál, amelyekre a felhasználó a real típusú változóknál pontosabb aritmetikai műveletvégzést kíván. Néhány kivételtől eltekintve bárhol használni lehet őket, ahol az integer, vagy real típus előfordulását a nyelv definíciója megengedi.
- Hivatkozási típus:
- Objektumhivatkozás: ref(< osztályazonosító >)
- Text
Egy objektumhoz mindig létezik egy objektumhivatkozás. Bármely C osztály meghatároz egy REF(C)-vel hivatkozási típust. E típus hivatkozhat bármely C-beli objektumra, vagy lehet nullpointer, aminek a neve NONE.
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.