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
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 ::= * | /
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. |
|
|
|
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 |
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 ::= < | <= | = | >= | > | <>
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.
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 ::= { | }