- Nacrtaj sintaksičko stablo kojim se može predstaviti sledeći kod: x = 3; while (x < 10) { print(x); x = x + 1; } - U jeziku C definisati strukturu podataka za reprezentovanje stabla aritmetičkih izraza u kojima se javljaju konstante, promenljive i operacije + i *. Definisati funkciju kojom se izračunava vrednost izraza, pri čemu je vrednost promenljivih zadata globalnom tablicom simbola. Pretpostaviti da na raspolaganju imate funkciju double lookup(char* id) koja za dato ime promenljive određuje njenu vrednost. - Opiši kako se tehnikom rekurzivnog spusta može generisati stablo aritmetičkih izraza koji sadrže samo konstante i operator + i to tako da izrazi imaju (a) desnu asocijativnost (b) levu asocijativnost. - U jeziku C++ ili Java definisati hijerarhiju klasa kojom se može reprezentovati stablo aritmetičkih izraza u kojima se javljaju konstante, promenljive i operacije + i *. Definisati metode kojima se izračunava vrednost izraza, pri čemu je vrednost promenljivih zadata globalnom tablicom simbola tipa map tj. HashMap. - Data je sledeća struktura u jeziku C: /* node je pokazivac na strukturu node_ */ typedef struct node_* node; struct node_ { /* vrsta cvora: konstante, promenljive, operatori */ enum {typeCon, typeOp} type; union { /* vrednost konstante */ int value; /* binarni operator ('+', '*') i dva njegova operanda */ struct { char operator; node left, right; } op; }; }; Definiši funkciju koja za dati aritmetički izraz generise kod kojim se vrednost tog izraza na 0-adresnom računaru (stek mašini). - Napisati troadresni međukod koji odgovara narednom fragmentu koda: x = 3 + 4 * y; while (x < 2 * z) { print(x); x = 2 * x + 1; } - Koja je svrha upotrebe troadresnog međukoda u okviru kompilatora? Opiši osnovne razlike između troadresnog međukoda i stvarnog asemblerskog koda. - Opiši kako se vrši prevođenje naredbi kontrole toka na primeru prevođenja naredbe while. - Kako se predstavljaju tipovi unutar kompilatora? U jeziku po izboru definiši strukture podataka za reprezentovanje tipova i pomoću njih predstavi tip "niz od 10 pokazivača na int". - Opiši kako se vrši semantička analiza aritmetičkih izraza. - Opiši neku strukturu podataka kojom se može implementirati tabela simbola koja podržava koncept dosega promenljivih. - Tablica simbola je predstavljena heš-tablicom sa kolizijama koje se razrešavaju ulančanim listama. U implementaciji tablice koja identifikatore povezuje sa njihovim tipovima koriste se sledeće stukture podataka. typedef struct _bucket { char id[MAX_ID]; struct _bucket* next; typeT* type; } bucket; bucket* table[MAX_BUCKETS]; unsigned hash(char* s); (a) Napiši funkciju typeT* lookup(char* id) koja pronalazi tip promenljive na osnovu njenog imena ili vraća null ukoliko promenljiva nije definisana. (b) Napiši funkciju void insert(char* id, typeT* type) koja datoj promenljivoj pridružuje tip (dodavanje izvršiti na početak liste). - Šta su bazični blokovi, a šta graf kontrole toka? Ilustruj na primeru sledećeg troadresnog koda: i = 0 petlja: if i >= 10 goto kraj print i i = i + 1 goto petlja kraj: print "kraj"