DIBAGER (hipsim), za pokretanje asemblerskog koda (hipotetski asemblerski kod) korak po korak:
./hipsim < naziv_asm_fajla.asm
Proširiti miniC gramatiku globalnim promenljivim i napraviti generisanje koda za njih.
Primer deklaracije:
int a;
Izgenerisani kod za datu deklaraciju:
a:
WORD 1
Ako je a
globalna promenljiva, tada za iskaz dodele:
a = a + 1;
treba da bude izgenerisan sledeći kod:
ADDS a,$1,%0
MOV %0,a
Realizovati semantičku proveru:
- promenljiva ne sme biti prethodno deklarisana.
POMOĆ:
Globalni i lokalni identifikatori mogu imati isto ime, pa se u tabeli simbola moraju razlikovati.
Napraviti generisanje koda za postinkrement iskaz.
Primer iskaza:
x++;
Primer izgenerisanog koda (za prvu lokalnu promenljivu):
ADDS -4(%14),$1,-4(%14)
Primer izgenerisanog koda (za globalnu promenljivu):
ADDS x,$1,x
Realizovati semantičku proveru:
- postinkrement operator može da se primeni samo na promenljive (lokalne i globalne) i parametre.
Napraviti generisanje koda za postinkrement unutar numeričkih izraza.
Primer:
int main() {
int x;
int y;
x = 3;
y = x++ + x++ + 42;
return x + y;
}
Izlazni kod treba da proizvede rezultat 53.
Generisanje operacije za inkrement treba da bude nakon obrade kompletnog numeričkog izraza.
Izgenerisani kod za y = x++ + x++
:
ADDS -4(%14),-4(%14),%0 //num_exp
ADDS %0,$42,%0 //num_exp
ADDS -4(%14),$1,-4(%14) //++
ADDS -4(%14),$1,-4(%14) //++
MOV %0,-8(%14) //assign
Realizovati semantičku proveru:
- postinkrement operator može da se primeni samo na promenljive (lokalne i globalne) i parametre.
Proširiti miniC izraze conditional operatorom:
"(" <uslov> ")" "?" <izraz1> ":" <izraz2>
<uslov>
predstavlja relacioni izraz<izraz1>
i<izraz2>
predstavljaju promenljivu, parametar ili konstantu<izraz1>
i<izraz2>
su istog tipa
Realizovati generisanje koda za conditional operator.
Primer 1:
a = (a == b) ? a : 0;
Primer 2:
a = a + (a == b) ? a : b + 3;
Proširiti miniC numeričke izraze operacijama *
i /
.
Operacije *
i /
treba da budu većeg prioriteta od +
i -
.
Proširiti miniC iskaze for petljom koja izgleda ovako:
"for" _LPAREN <name> "=" <lit> ";" <rel> ";" <name> "++")
<statement>
gde je:
-
<name>
ime lokalne promenljive ili parametra -
<lit>
literal -
<rel>
relacioni izraz -
"++"
inkrement operator -
<name>
mora biti deklarisano pre upotrebe -
<name>
i<lit>
treba da budu istog tipa
Realizovati generisanje koda za for petlju.
- Inicijalizacija iteratora se vrši samo jednom, pre prvog izvršavanja tela petlje.
- Tačnost relacije se proverava na početku svake iteracije.
- Inkrementiranje iteratora se vrši na kraju svake iteracije.
Napomena: Petlje mogu biti i ugnježdene.
Primer:
int suma;
int i;
suma = 0;
for(i = 0; i < 5; i++)
suma = suma + i;
Proširiti miniC gramatiku switch iskazom. Sintaksa switch iskaza ima oblik:
"switch" "(" switch_expression ")" "{"
"case" constant_expression ":" case_body [ "break" ";" ]
"case" constant_expression ":" case_body [ "break" ";" ]
...
[ "default" ":" default_body ]
"}"
switch_expression
predstavlja ime promenljive koja prethodno mora biti deklarisanaconstant_expression
predstavlja konstantucase_body
idefault_body
predstavljaju iskaz
Postoji bar jedna case naredba.
default
naredba se može pojaviti samo nakoncase
naredbi (kao poslednja).break
naredba se može pojaviti samo na krajucase
naredbe.
Izvršavanje:
- na početku
switch
iskaza se izvrši provera vrednosti promenljive u zagradama - u zavisnosti od te vrednosti preusmerava se tok izvršavanja na telo odgovarajuće case naredbe
- ukoliko se na kraju
case
naredbe nalazibreak
naredba, tok izvršavanja se preusmerava na kraj switch iskaza; a ako jebreak
naredba izostavljena, "propada" se na izvršavanje sledećecase
naredbe default
naredba se izvršava ukoliko se vrednostswitch
promenljive razlikuje od svih konstanti navedenih u svimcase
naredbama
Primer1:
switch (state) {
case 10: { s = 1; } break;
case 20: s = 2;
default: s = 0;
}
Primer2:
switch (state) {
case 10: s = 1; break;
case 20: { s = 2; }
}
NAPOMENA: ne moze se napisati switch u drugom switchu.