4.Instructiuni secventiale

a)Instructiunea de atribuire:

Sintaxa este:

instr atribuire::=tinta:=expresie;

tinta::=nume l lista-elemente

Partea stinga si partea dreapta ale atribuirii trebuie sa aiba acelasi tip de baza. Daca in partea stinga se afla o lista de elemente, atunci ele trebuie sa fie nume de obiecte, iar in partea dreapta trebuie o valoare compusa de acelasi tip. ?Mai intii se se evalueaza lista, apoi expresia si, in final, componentele expresiei sint atribuite.

Exemplu: ( a => r.b , b => r.a ) = r

b)Instructiunea IF:

Sintaxa este:

instr_if::=if conditie then

secventa_instr

{ elsif conditie then

secventa_instr}

[else secventa_instr]

end if;

c)Instructiunea CASE:

Sintaxa este:

instr_case::= case expresie is

alternativa case

{alternativa case}

end case;

alternativa_case::=when alternative => secventa_instr

alternative::=alternativa{, alternativa}

alternativa::=expresie_simpla

interval discret

nume_simplu_element

others

Expresia de selectie trebuie sa aiba tip discret sau sa fie un vector de caractere. Alternativele trebuie sa fie distincte, deci nu trebuie sa existe valori duplicate. Toate valorile trebuie sa fie prezente in lista de alternative, sau OTHERS trebuie inclusa ca ultima alternativa. Daca expresia are ca valoare un vector, atunsi alternativele trebuie sa fie siruri de caractere sau siruri de biti.

Exemple:

case element colour of

when red => instr. red;

when green I blue => instr. green, blue;

when orange to turquoise => instr;

end case;

case opcode of

when X"00" => perform add;

when X"01" => perform substract;

when others => signal_illegal_opcode;

end case;

d)Implementarea ciclurilor:

Sintaxa este:

ciclu::= [eticheta:]

[schema de iteratie] loop

secventa_instr

end loop [eticheta];

schema_de iteratie::= while conditie

| for specificare_parametrii_bucla

specificare_parametrii_bucla::= identificator in interval_discret

Daca lipseste schema de iteratie, avem cazul unei bucle infinite:

loop ceva;

end loop;

Exemplu ciclu WHILE:

while index < length and str(index) /= " loop

index := index + 1;

end loop;

Exemplu ciclu FOR:

for item in 1 to last item loop table(item) := 0;

end loop;

Exista doua tipuri de instructiuni aditionale care pot fi folosite in cadrul unui ciclu. Cu instructiunea 'next' se termina executia iteratiei curente si se trece la iteratia urmatoare. Cu instructiunea 'exit' se termina executia iteratiei curente si se iese din ciclu. Sintaxa este:

instr next::=next[eticheta][when conditie];

instr exit::=exit[eticheta][when conditie];

Daca este omisa eticheta, instructiunile se executa in cadrul buclei celei mai apropiate care le cuprinde, altfel se executa in cadrul buclei specificate de eticheta. Daca clauza WHEN este prezenta, dar conditia asociata a evaluata la FALSE, iteratife continua normal.

Exemple:

for i in 1 to max str_len loop

a(i) .= buf(i);

exit when buf(i) = NUL;

end loop;

outer loop: loop

inner_loop: loop do_something;

next outer_loop when temp = 0;

do_something-else;

end loop inner_loop;

end loop outer loop;

e)Instructiunea vida:

Instructiunea vida nu are nici un efect. Este folosita cind se doreste sa se arate explicit ca in unele cazuri nu se executa nimic. E folosita frecvent in instructiuni CASE, unde trebuie listate toate valorile alternative posibile ale unei expresii, cu toate ca pentru unele dintre ele nu trebuie sa se execute nimic. Sintaxa este: case controller command is when forward => engage motor forward; when reverse => engage-motorreverse; when idle => null; end case;

f)Asertiuni:

Asertiunile sint folosite pentru verificarea unor conditii

specificate si raportarea in caz ca acestea nu sint verificate.

Sintaxa este:

asertiuni::=assert conditie

[report expresie]

[severity expresie];

Daca a prezenta clauza REPORT, rezultatul expresiei trebuie sa fie un sir de caractere. Acesta reprezinta un mesaj ce va fi raportat in cazul in care conditia a evaluata la FALSE. Daca este omis, mesajul implicit este "Assertion violation". Daca e prezenta clauza SEVERITY atunci tipul expresiei trebuie sa fie 'severity-level'. Daca a omisa, valoarea implicita este 'error'. Un simulator termina executia daca o asertiune nu se mai respecta si valoarea specificata de 'severity' a mai mare decit un prag dat, dependent de implementare. De obicei acest prag este dat de catre utilizator.