Operatori

    Operatorii sunt elemente ale limbajului ALLO care actioneaza asupra unuia sau mai multor operanzi pentru a produce o valoare, o actiune si o valoare sau o limitare de domeniu pentru unele variabile model sau pentru anumite restrictii. Limbajul ALLO are urmatoarele categorii de operatori :

            - Operatori aritmetici
            - Operatori functie
            - Operatori relationali
            - Operatori de marginire simbolica

Operatori aritmetici

    Operatorii aritmetici sunt utilizati in constructia expresiilor aritmetice si a expresiilor simbolice. In cadrul expresiilor aritmetice acesti operatori actioneaza asupra unui operand sau asupra a doi operanzi producind un nou operand care participa mai departe in evaluarea expresiei. Daca acestia sunt intr-o expresie simbolica atunci pot fi regasiti intr-o expresie aritmetica coeficient al unei variabile simbolice, ca operator pe o expresie simbolica sau ca operator asupra a doua expresii simbolice caz in care produc un nou operand expresie simbolica. Avem operatori unari si operatori binari. Pe de alta parte unii sunt operatori aditivi iar altii multiplicativi.

Sintaxa

opr_aritm ::= opr_unar | opr_binar
opr_unar ::= -
opr_binar ::= - | + | * | /
opr_adit ::= + | -
opr_mult ::= * | /

Operatori functie

    Operatorii functii sunt desemnati de catre numele unei functii recunoscute de limbajul ALLO. Ei actioneaza asupra operanzilor din lista de operanzi inchisa intre doua paranteze rotunde ce urmeaza dupa numele operator. Rezultatul este dat de executia acelei functii (care poate fi si o actiune intermediara necesara) care in final produce un operand ce participa mai departe la calculul expresiei respective. Inainte de executia functiei sunt evaluati toti operanzii din apel in ordinea de la stinga catre dreapta o lista de valori concrete la care se ataseaza si tipul acestora. Functia verifica corectitudinea apelului vizavi de numar de operanzi, de tipul lor si chiar de valorile permise atunci cind este cazul. Daca totul a fost corect rezulta operandul respectiv, iar daca nu se semnaleaza eroarea depistata.

Sintaxa

opr_fun ::= ABS | AND | APX | ATR | DIP | IFP | IFS | LOR | LOG |
                   MAX | MIN | MOD | NOT | SEARCH | SIG | SQR | XOR

apel_fun ::= opr_fun ( l_param_act )
l_param_act ::= expr_aritm | expr_aritm , l_param_act

Observatie. La numele de operatori functie citati se adauga numele rezultate din scrierea acestora cu litere mici si chiar in combinatie mari cu mici dupa dorinta.

Exemple apel functie : ATR(rtl[d,w]*((d-1)*nrwhse+w),h) , ABS(a[j,k]+5.3] ,

                                   SEARCH(h,rtindl[1],find) , Ifp(rpc[f,p],0,1,0) , Ifs(rtl[d,w],1,0) ,

                            And(Ifp(dctrs[d]-whses[w],1,0,1), Ifp(sc[w,d]-huge,1,0,0)) , Max(a,b)

Functii recunoscute de translatorul ALLO

Nr.
Nume
Descriere argumente
Descriere rezultat

1

ABS

 


Un argument intreg sau real 

Valoarea absoluta a argumentului
raminind acelasi tip

2

AND

 


Doua argumente intregi cu valori 0 sau 1

1 daca cele doua argumente sunt egale cu 1 si 0 in rest

3

APX

Doua argumente intregi sau reale. Primul argument trebuie sa fie strict pozitiv.

 

O valoare reala ca rezultat al ridicarii primului argument la puterea data de al doilea argument. Rezultatul este intreg daca ambele argumente au fost intregi.

4

ATR

 


Primul argument reprezinta o valoare intreaga sau reala. Al doilea argument reprezinta o variabila intreaga sau reala.
Functia atribuie argumentului 2 valoarea argumentului 1 facind o eventuala conversie daca este cazul. De asemenea intoarce ca rezultat valoarea intreaga 0.

5

 


DIP

Doua argumente (arg1,arg2) reale sau intregi.
Daca arg1 <= arg2 intoarce valoarea 0 altfel intoarce valoarea arg1-arg2. Tipul rezultat este intreg numai daca ambele argumente au fost intregi. 

6

 


IFP

Patru argumente reale sau intregi
Functia intoarce : daca arg1 < 0 atunci arg2, daca arg1 = 0 atunci arg3, altfel arg4. Rezultatul are tipul argumentului selectat.

7

 


IFS

Trei argumente din care primul de tip intreg si cu valori 0 sau 1.
Functia intoarce : daca arg1 = 1 atunci arg2, daca arg1 = 0 atunci arg3. Rezultatul are tipul argumentului selectat.

8

LOR

Doua argumente intregi cu valori 0 sau 1
Daca unul din argumente este egal cu 1 atunci functia intoarce valoarea 1, altfel 0

9

LOG

Un argument intreg sau real dar strict pozitiv

Intoarce logaritmul zecimal al acestui argument si de tip real

10

 


MAX

Doua argumente intregi sau reale
Intoarce maximul dintre acestea eventual convertit la real daca n-au fost amindoua intregi

11

 


MIN

Doua argumente intregi sau reale
Intoarce minimul dintre acestea eventual convertit la real daca n-au fost amindoua intregi

12

MOD

Doua argumente intregi si mai mari sau egale cu 1
Intoarce restul impartirii intregi al primului argument cu al doilea argument.

13

 


NOT

Un argument intreg de valoare 0 sau 1

Intoarce 0 daca argumentul a fost 1 si 1 daca a fost 0

14

 


SEARCH

Trei argumente. Argumentul 1 reprezinta o valoare de cautat in vectorul reprezentat de argumentul 2 ca referinta. Acestea trebuie sa fie de acelasi tip. Argumentul trei reprezinta o variabila scalara intreaga. Argumentul 2 este privit ca un vector chiar daca este matrice sau masiv. Functia cauta prima aparitie a valorii respective.

Se cauta valoarea reprezentata de arg1 in vectorul reprezentat de arg2 ca referinta iar locul liniar al primei valori gasite ca egala se depune in variabila desemnata de arg3. Daca operatia a avut succes (in sensul ca s-a gasit o valoare egala cu arg1) functia intoarce valoarea 1 altfel 0. In acest din ultim caz arg3 primeste valoarea 1 .

15

 


SIG

Un argument

Daca arg < 0 intoarce -1, daca

arg = 0 intoarce 0, altfel 1


16

 


SQR

Un argument intreg sau real dar pozitiv

 


Intoarce radicalul din acest argument cu valoarea convertita la tipul acestuia

17

 


XOR

Doua argumente intregi de valori 0 sau 1

Intoarce 1 daca numai un argument a fost 1 in rest 0

Operatori relationali

    Acesti operatori sunt utilizati in expresii relationale necesare pentru validarea unor variabile auxiliare de tip intreg sau real. Acestea pot fi supuse unor restrictii in momentul definirii si initializarii lor. Rezultatul evaluarii unei conditii este adevar sau fals dupa cum a fost indeplinita sau nu relatia ceruta.

Sintaxa

opr_rel ::= < | <= | = | >= | > | <>

Operatori de marginire variabile simbolice

    In practica se cere ca unor variabile model sa li se permita a primi valori numai intr-un anumit domeniu. Aceasta cerere trebuie sa fie marcata in fisierul MPS pentru ca optimizatorul s-o ia in seama in momentul incercarii de a gasi o solutie optima. Dar nu numai variabilele model pot fi supuse unor restrictii ci chiar si variabilele restrictii ale modelului. La nivelului limbajului ALLO conditionarea este obtinuta prin utilizarea operatorilor de marginire simbolica care apar in clauzele de marginire variabile model sau restrictii model.

Sintaxa

opr_marg ::= <= | = | >= | IN

    Observatie. In cazul lui = avem variabile model cu valoare deja fixata. O restrictie model este restrictie cu egalitate.

Operatorul IN ( care poate fi scris in patru moduri- combinatii litere mici cu mari) determina apartenenta la un domeniu cu margini reale finite.

Operatorii <= sau >= spun ca variabila model/variabila restrictie model are voie sa ia si valoarea respectiva. Nu exista cazul strict in modelarea standard.

Paranteze

    Limbajul ALLO utilizeaza trei perechi de paranteze distincte :

            - paranteze rotunde ( );
            - paranteze drepte [ ]
            - paranteze acolade { }.

    Parantezele rotunde sunt utilizate in construirea expresiilor complexe care necesita transformarea unora dintre acestea in factori, sau in constructia apelurilor de functii implicite prin incadrarea listei de argumente actuale intr-o astfel de pereche de paranteze. In functie de rol ele solicita calculul expresiei parantezata a carei valoare este utilizata ca operand, sau solicita calculul valorilor argumentelor actuale care sunt necesare pentru operatorul functie respectiv din a carei actiune rezulta neaparat si un operand utilizat in calcul mai departe.

    Parantezele drepte sunt utilizate in definirea masivelor (prin includerea listei de dimensiuni intre o pereche de paranteze drepte), in construirea referintei la un element de masiv (prin includerea listei indiciale intre o pereche de paranteze drepte), precum si in constructia preambulului de ciclare din blocurile FOR si SUM. In functie de context aceasta pereche declanseaza o anumita actiune de evaluare si retinere a listei de dimensiuni, de evaluare a expresiilor indiciale din lista de referinta a elementului de masiv corespunzator pe baza carora se calculeaza indicele liniarizat al acestuia, sau de evaluare, startare si control a operatiunilor de ciclare solicitate in blocul respectiv. Putem considera ca in contextul referinta o pereche de paranteze drepte actioneaza ca un operator de evaluare a expresiilor din lista indicilor si de calcul a indicelui liniarizat.

    Parantezele acolade sunt utilizate in delimitarea unui bloc de instructiuni ce tine de una si aceeasi definitie a unei variabile(de orice fel care are drept de a le folosi in definitie) precum si pentru incadrarea listei cu expresii de initializare a unei variabile auxiliare de tip masiv de intregi sau de reali. In cazul cind aceasta lista este citita dintr-un fisier secundar atunci aceste paranteze au fost suprimate din ratiuni practice si chiar de usurare in urmarirea textului respectiv.

Sintaxa

p_rotunda ::= ( | )
p_dreapta ::= [ | ]
p_acolada ::= { | }