Programski prevodioci 1/Projekat
Projekat na predmetu važi za jednu od najtežih aktivnosti na njemu zbog toga što zahteva praktičnu primenu znanja stečenih u trećem bloku (i ponekih iz prvog i drugog bloka). Njegova izrada može zahtevati oko nedelju dana konstantnog rada (u zavisnosti od nivoa za koji radite) ali se takođe veliki deo toga može iskoristiti iz postojećih materijala sa vežbi i zvaničnih video vodiča za projekat, na koje će se ovaj vodič nadalje oslanjati.
Osnovno
Ideja projekta jeste konstrukcija prevodioca za Mikrojavu — pojednostavljenu, školsku varijantu jezika Java čija se specifikacija pomalo menja iz godine u godinu (ali neke suštinske stvari ostaju iste). Prevodilac iz jednog fajla sa izvornim kodom čita Mikrojava kod po specifikaciji datoj uz tekst projekta (a odvojenoj od same postavke), prolazi kroz četiri faze prevođenja (leksičku analizu, sintaksnu analizu, semantičku analizu i generisanje koda) i njegov krajnji rezultat jeste objektna datoteka sa Mikrojava bajtkodom. Taj objektni fajl se zatim može izvršavati preko Mikrojava virtuelne mašine (čija je implementacija već data i ne može se menjati) i na osnovu nekog unosa proizvesti neki izlaz.
Za projekat je potrebno gledati vežbe trećeg bloka iz tabele simbola i Mikrojava virtuelne mašine, i eventualno vežbe prvog i drugog bloka iz JFlex i CUP. Takođe su dostupni video vodiči za projekat sa stranice predmeta, koje je korisno pogledati kao uvod u alate i neka generalna očekivanja. Ti vodiči su enkodovani nekim jako zastarelim kodekom, a reenkodovani snimci se mogu naći ovde.
Pre nego što pređete na dalje odeljke, preporučuje se da pročitate postavku projekta. Mikrojava specifikaciju ne morate čitati, jer će vam ona najviše značiti prilikom samog razvijanja projekta.
Postavka
Sada kada ste pročitali postavku, o njoj je potrebno reći par reči.
- Struktura projekta uopšte ne mora da bude onakva kakva piše u postavci. To znači:
- Paket ne mora da se zove
rs.ac.bg.etf.pp1. - Ne postoji konkretan direktorijum u koji morate da smestite specifikacije leksera i parsera.
- Nije obavezno korišćenje JDK 1.8 (mada je preporučeno)
- Klase ne moraju da se zovu
Compiler,SemanticAnalyzeriCodeGenerator.
- Paket ne mora da se zove
- Na odbrani se manje-više gleda samo izlaz prevedenog Mikrojava programa za modifikaciju i za javni test odgovarajućeg nivoa za koji radite. Ovo u praksi znači:
- Niko neće proveravati format greške leksera.
- Niko neće proveravati da li se uspešno radi oporavak od greške.
- Ipak, preporučuje se da probate ovaj deo da odradite, ali ako na nekom mestu ne radi to nije veliki problem.
- Niko neće proveravati da li niste koristili
%precedence(ali niko neće ni objasniti kako se koristi). - Niko neće proveravati kako su imenovani neterminali niti klase koje odgovaraju granama tih neterminala.
- Niko neće proveravati da li ste dodali akcije u specifikaciju parsera.
- Svakako se preporučuje da potrebne akcije obavljate kroz odgovarajuće posetioce stabla, jer u specifikaciji parsera nije dostupan IntelliSense.
- Nije mnogo verovatno da će predmetni saradnici pogledati da li koristite njihovu tabelu simbola, da li ste je raspakovali i preveli ponovo ili koristite neku potpuno drugu implementaciju.
- Ipak, korišćenje njihove tabele simbola nosi sa sobom pogodnost da ćete uvežbati rad sa njom pa nećete mnogo morati da obnavljate za takve zadatke na ispitu.
- Niko neće proveravati da li ste implementirali metodu
tsdump(). - Niko neće proveravati da li ispisujete simbole pri njihovoj detekciji.
- Slabo će se proveravati da li se prijavljuju semantičke greške.
- Ipak, pošto tokom semantičke obrade svakako mora da se popuni tabela simbola, vredi dodati ove provere, u krajnjem slučaju zato što će vama značiti ukoliko budete pisali svoje test primere i napišete nešto semantički neispravno.
- Može da se desi da neke stvari iz javnih testova ili testova za modifikacije koje su zakomentarisane moraju da prijave semantičke greške, i da ih predmetni saradnici otkomentarišu prilikom odbrane.
- Niko neće proveravati da li se putanje do ulaznih i izlaznih fajlova prosleđuju kroz argumente komandne linije.
- Na odbrani se ne traži da se bilo šta pokreće iz komandne linije, niti preusmerava standardni izlaz i izlaz za greške.
- Primeri Mikrojava koda iz postavke i specifikacije mogu često biti sintaksno ili semantički neispravni. Ovo je zbog toga što predmetni saradnici ne napišu prevodilac za specifikaciju Mikrojave koju su zadali, a primer verovatno iskopiraju iz postavke odnosno specifikacije od prethodne godine, pa ne provere da li je ispravan.
- Na odbrani niko ne pogleda izveštaj sa projekta.
- Niko neće tražiti da se pokrenu studentski testovi projekta.
- Suprotno postavci, dorada projekata na odbrani je dozvoljena.
- U odeljku za kontekstne uslove u okviru specifikacije mogu biti opisane stvari koje se ne rade u fazi semantičke analize, već ili opisuju generalno funkcionisanje tog programskog konstrukta, ili opisuju stvari koje se moraju obezbediti u fazi genrisanja koda.
- Prilikom specifikacije sintakse koristi se EBNF notacija.
- Podela funkcionalnosti po nivoima može biti jako konfuzna. Specifikacija Mikrojave može posebno napomenuti za samo par stvari da se implementiraju samo na određenim nivoima (ostavljajući utisak da je potrebno prepoznati sintaksu za metode i klase čak i u projektu A nivoa), dok postavka može nepotpuno izlistavati smene koje su potrebne da se implementiraju za određeni nivo. Najbolji način za određivanje šta se implementira za koji nivo jesu odgovarajući javni testovi.
Alati
U ovom odeljku navedene su sve napomene u vezi sa alatima koje ćete koristiti na projektu, od kojih će neke imati smisla tek nakon što pogledate video vodiče.
- Jedna od prvih stvari pomenutih u video vodičima jeste instaliranje Ant. Za ovime nema potrebe, jer je Ant već instaliran u okviru Eclipse. Takođe, Ant pravila se dosta lakše mogu pokretati odlaskom na Window → Show View → Ant, i zatim dodavanjem
build.xmlfajla u projektu. - U računarskim laboratorijama bi trebalo da je dostupan i IntelliJ, pa možete u njemu takođe raditi projekat.
- Nije neophodno koristiti Log4j bibliioteku za ispis ukoliko ne želite.
- Obavezno preuzeti biblioteke sa stranice predmeta umesto korišćenja onih iz šablona projekta ili video vodiča, jer njihove verzije mogu biti zastarele i prouzrokovati probleme.