Expresii

    Elementul de baza al limbajului ALLO il constituie expresia care este nelipsita aproape din toate instructiunile cu exceptia instructiunilor de structurare pe sectiuni a modelului. Avem urmatoarele tipuri de expresii:

            - expresii aritmetice;
            - expresii relationale;
            - expresii simbolice.

Expresii aritmetice

    Expresiile aritmetice sunt constructii la care participa operanzi, operatori si paranteze rotunde. Ca operanzi pot fi constante intregi sau reale, variabile auxiliare de tip intreg sau real, referinte la elemente de masiv de variabile intregi sau reale apeluri de functii recunoscute implicit de translatorul ALLO. Rezultatul evaluarii unei expresii aritmetice este o valoare reala sau intreaga in functie de compozitia operanzilor si a operatorilor functie utilizati.

Evaluarea unei expresii se face de la stinga la dreapta si pe baza prioritatilor operatorilor si parantezelor. Un operator actioneaza asupra unuia sau mai multor operanzi. Daca este in drept de a fi evaluat atunci trebuie ca operanzii sai sa fie evaluati mai intii dupa care se poate face si operatiunea solicitata de acest operator. Operatorii multiplicativi au aderenta superioara celor aditivi. Minus unar are prioritate fata de operatorii binari. Operatorul indicial simbolizat de o pereche de paranteze drepte (acolo unde este implicata o referinta la un element de masiv) solicita evaluarea expresiilor indiciale pe baza carora se calculeaza indicele liniarizat care permite accesul la elementul referit. Operatorul de tip functie solicita evaluarea mai intii a listei de parametri actuali dupa care se poate lansa procedura de evaluare a sa. Operatorul aritmetic binar care actioneaza pe acelasi tip de operanzi da ca rezultat un operand de acelasi tip. Daca actioneaza asupra unui intreg si a unui real rezultatul este un operand real. Modul de evaluare a expresiilor aritmetice este similar cu cel adoptat in limbajele de programare consacrate si nu mai insistam asupra acestuia.

Pentru evaluarea unei expresii aritmetice translatorul ALLO (in procesul de analiza sintactica) o aduce la o forma mixta bazata pe o forma poloneza postfixata in care au fost desfiintate parantezele rotunde si in care operatorii functie si de referinta nu sunt dupa listele corespunzatoare ci au ramas in fata pe locul lor.

Alte elemente de sintaxa nexeplicitate inca pina la acest punct se pot regasi in anexa corespunzatoare pentru intreaga sintaxa sau la alte rubrici de mai jos.

Sintaxa

expr_aritm ::= termen rest_suma
termen ::= factor rest_produs
rest_suma ::= lambda | opr_adit rest_suma
rest_produs ::= opr_mult factor rest_produs | lambda
factor ::= numar | ref_var_aux | apel_fun | ( expr_aritm ) | SUM [ l_expr_apart ] ( expr_aritm )
ref_var_aux ::= ref_var_intreaga | ref_var_reala
ref_var_intreg ::= var_intreg_scalara| ref_element_masiv_intreg
ref_var_real ::= var_real_scalara | ref_element_masiv_real

Exemple : (d-1)*nrwhse+w , h-(m-1)*nrprod , ATR(h+IFS(rtl[d,w],1,0),h) ,

                SUM[f IN fact,p IN prod](Ifp(rpc[f,p],0,1,0)) , +2.3 , N , 5 * M

Expresii conditie de validare

    Aceste expresii sunt constructii bazate pe doua expresii aritmetice legate printr-un operator relational. Rezultatul evaluarii unei asemenea expresii este o valoare intreaga 0 sau 1 cu semnificatia de fals sau adevar. Sunt evaluate mai intii cele doua expresii aritmetice dupa care se face comparatia lor si se da rezultatul in functie de operatorul respectiv. Aceste expresii sunt utilizate in instructiunile de definire a variabilelor auxiliare de tip intreg sau real si anume in clauza de validare.

Sintaxa

expr_cond_valid ::= expr_aritm opr_rel expr_aritm

Exemple : prodmax > 0.0 | omin[f] <= omax[f] | nrdctr < nrwhse

Observatie. Expresiile aritmetice pot fi mult mai complicate dupa cum sunt necesitatile de validare pentru anumite variabile auxiliare sau referinte la elemente de masiv de variabile auxiliare.

Expresii simbolice lineare

    Expresiile liniare simbolice sunt expresii construite si evaluate in mod similar cu expresiile aritmetice. Numai ca aici apar si operanzi variabile model scalare sau referinte la elemente de tablou variabile model. Trebuie spus ca nu se poate sa avem pe rol de operanzi la operatorii binari multiplicativi nu putem sa avem simultan expresii simbolice caci expresia rezultata nu ar mai fi liniara lucru semnalat de translator in procesul de evaluare. Variabilele functii obiectiv sau variabilele restrictii n-au ce cauta intr-o expresie simbolica liniara. Ele pot primi ca definitie (ca "valoare") o expresie simbolica liniara.

Sintaxa

expr_simb ::= termen_simb rest_suma_simb
termen_simb ::= factor_simb rest_produs_simb
rest_suma_simb ::= lambda | opr_adit rest_suma_simb
rest_produs_simb ::= lambda|opr_mult factor_simb rest_produs_simb
factor_simb ::= numar|ref_var_aux| ref_var_model| apel_fun | ( expr_simb ) |
                                                                             SUM [ l_expr_apart ] ( expr_simb )

Exemple : Sum[f In fprod,p In perp](profdc[f,p]*xprod[f,p]) ,

                xsmat[r,p] - Sum[f In fprod](ump[r,f] * xprod[f,p])

Blocuri repetitive

    Blocurile repetitive sunt constructii semantice ALLO care ne permit reluarea instructiunilor sau operatiunilor din corpul lor de un numar de ori lucru deosebit de util in scrierea concentrata a modelului precum si in posibilitatile oferite in vederea modelarii proceselor sau sistemelor de mari dimensiuni. Aceste blocuri au in constructie un antet de definire a unuia sau mai multor cicluri simultan. Un ciclu este definit de un indice de ciclare inactiv in acest moment de utilizare precum si de un domeniu intreg in care are voie sa evolueze cu pasul 1 care este implicit. Pentru initierea unui ciclu se evalueaza domeniu de ciclare (chiar daca acesta a putut sa fie evaluat in mod static anterior, spre deosebire de domeniile dinamice care au in expresiile de margini variabile de tip indici ce nu pot fi evaluate decit in timpul cind aceste variabile sunt active) dupa care indicele de ciclare este initializat cu marginea inferioara a domeniului numai daca indicele a fost gasit inactiv caz in care starea sa va fi activa pina la epuizarea domeniului de ciclare. In caz contrar se semnaleaza eroarea respectiva.

Dupa initializarea indicelui se parcurge sau se executa instructiunile din corpul ciclului respectiv. Ajuns la sfirsitul acestui corp se incrementeaza cu 1 indicele si se compara cu marginea superioara a domeniului de ciclare. Daca valoarea indicelui n-o depaseste se reia executia/explorarea expresiei de la inceputul corpului acestui bloc. In caz contrar se considera ca executia acestui ciclu a fost epuizata si se pune statutul acestui indice ca inactiv lucru ce induce posibilitatea de reutilizare a acestuia mai departe.

In ALLO avem doua blocuri repetitive semnalate de cuvintele cheie FOR si SUM si care vor fi descrise sumar mai jos.

Blocul FOR

    Acest bloc permite reluarea unui grup de instructiuni ce formeaza asa numitul corp al ciclului al carui sfirsit este sesizat prin sintaxa.

Sintaxa

antet_for ::= FOR [ l_expr_apart ]
l_expr_apart ::= expr_apart | expr_apart , l_expr_apart
expr_apart ::= var_indice IN domeniu

Exemplu : FOR [p IN perp] | FOR [r IN rmat, f IN fprod]

Blocul SUM

    Acest bloc permite reluarea procesului de sumare a unei expresii cuprinsa intre doua paranteze rotunde si care formeaza asa numitul corp al ciclului. Blocul SUM este deosebit de util in exprimarea expresiilor simbolice foarte mari care pot fi exprimate printr-o formula concentrata ce include acest operator SUM. In procesul de sumare se porneste cu valoarea 0.0 la care se adauga ceea ce rezulta la trecerile repetate (pina la epuizarea ciclului) peste expresia ce reprezinta corpul blocului.

Sintaxa

antet_sum ::= SUM [ l_expr_apart ]
l_expr_apart ::= expr_apart | expr_apart , l_expr_apart
expr_apart ::= var_indice IN domeniu

Exemplu : SUM[r IN rmat] , SUM [f IN fprod, p IN perp]