Sadrzaj:
1. Opis problema
2. Opis resenja i uputstvo za pokretanje
3. Listing programa
4. Karakteristicni ulazi i dobijeni izlazi
1. OPIS PROBLEMA
Implementira se makroprocesor sa ugnezdavanjem makropoziva, po sledecem algoritmu:
d := false (* definition mode switch *) e := 0 (* expansion-level counter *) read line from input while line != empty do if d then (* in definition mode *) case opcode of prototype: prepare formal parameter list 'MCEND': d:=false other: replace i-th formal parameter by ’#i’ write line to new macro definition else (* in copy mode or expansion mode *) case opcode of prototype: macro name: e:=e+1 prepare actual parameter list push actual parameter list on actual parameter stack 'MCDEFN' : d:=true allocate new macro definition 'MCEND': pop actual parameter list (level e) from actual parameter stack e:= e-1 other: write line to output if (e>0) (* in expansion mode *) read line from old macro definition named in current macro call replace ’#i’ by actual parameter list(i) from actual parameter stack else read line from input
Na steku stvarnih parametara je potrebno cuvati i povratnu liniju odakle treba nastaviti citanje ulaza po zavrsetku ekspanzije ugnezdenog poziva (nije precizirano u algoritmu).
2. OPIS RESENJA I UPUTSTVO ZA POKRETANJE
Opis Resenja
Implementacija je radjena u Javi.
Od nestandardnih struktura podataka koriscena je struktura Element, koja predstavlja element na steku stvarnih parametara, broj linije odakle treba nastaviti citanje po zavrsetku ekspanzije ugnezdenog poziva.
Obradjene greske u ulazu:
• MCEND bez MCDEFN
• MCDEFN bez MCEND
• Ulaz ne pocinje sa MCDEFN
• Na mestu prototipa je rezervisana rec
• Makro nije definisan
• Neusaglasen broj parametara u pozivu i definiciji makroa
Po nailasku na gresku , informacija o njoj se ispisuje , i program se prekida!
Napomena: