Програмски преводиоци 1/Јануар 2024 — разлика између измена
(Rok je delimicno resen) |
|||
| (Није приказано 11 међуизмена 2 корисника) | |||
| Ред 1: | Ред 1: | ||
{{tocright}} | {{tocright}} | ||
'''Januarski ispit 2024. godine''' održan je 18. januara i trajao je 150 minuta. Postavka roka nije dostupna sa stranice predmeta. | '''Januarski ispit 2024. godine''' održan je 18. januara i trajao je 150 minuta. Postavka roka nije dostupna sa stranice predmeta. | ||
== 1. zadatak == | == 1. zadatak == | ||
{{delimično rešeno}} | |||
=== Postavka === | === Postavka === | ||
Dat je sledeći kod na programskom jeziku C. | Dat je sledeći kod na programskom jeziku C. | ||
| Ред 44: | Ред 44: | ||
== 2. zadatak == | == 2. zadatak == | ||
{{delimično rešeno}} | |||
=== Postavka === | === Postavka === | ||
Data je sledeća gramatika: | Data je sledeća gramatika: | ||
| Ред 59: | Ред 60: | ||
== 3. zadatak == | == 3. zadatak == | ||
=== Postavka === | === Postavka === | ||
Date su sledeće gramatike: | |||
Gramatika A: | |||
# <P> -> o <P> <P> | |||
# <P> -> v | |||
Gramatika B: | |||
# <P> -> <P> o <P> | |||
# <P> -> v | |||
Gramatika C: | |||
# <P> -> <P> <P> o | |||
# <P> -> v | |||
Gramatika D: | |||
# <P> -> v <Q> | |||
# <Q> -> <P> o <Q> | |||
# <Q> -> eps | |||
Gramatika E | |||
# <P> -> v <P> o | |||
# <P> -> v | |||
* Koje su dve gramatike iste? | |||
* Dokazati na primeru neke sekvence da se ostale 3 gramatike razlikuju. | |||
=== Rešenje === | === Rešenje === | ||
a) Gramatika A jedina može počinjati sa O, pa ona sigurno nije ista kao neka druga. Gramatika B može prihvatiti sekvencu VOV, dok gramatika C ne može, pa ni one nisu iste. Gramatika C mora početi sa VV, što važi i za gramatiku E, pa su te dve gramatike iste. | |||
b) Ukoliko uzmemo sekvencu OVV, takva sekvenca je validna za gramatiku A, ali nije za gramatike B i D. U gramatici B vidimo da ukoliko je ulazna sekvenca duža od 1, posle V mora da sledi O, dok u gramatici D to nije slučaj. Na primer, za sekvencu VVO se vidi da se B i D razlikuju jer gramatika D prihvata takvu sekvencu dok je gramatika B odbija. | |||
== 4. zadatak == | == 4. zadatak == | ||
=== Postavka === | === Postavka === | ||
Napisati funkciju <code>static Obj find(String name, boolean isGlobal)</code> za mikrojavu, koja se ponaša kao operator <code>::</code> ako je <code>isGlobal=true</code>. Traženu funkciju pisati od nule. | |||
<syntaxhighlight lang="java"> | |||
public class Tab { | |||
public static final Struct | |||
noType = new Struct(Struct.None), | |||
intType = new Struct(Struct.Int), | |||
charType = new Struct(Struct.Char), | |||
nullType = new Struct(Struct.Class); | |||
public static final Obj noObj = new Obj(Obj.Var, "noObj", noType); | |||
public static Obj chrObj, ordObj, lenObj; | |||
public static Scope currentScope; | |||
private static int currentLevel; //universe == -1 | |||
public static Obj find(String name, boolean isGlobal); | |||
} | |||
</syntaxhighlight> | |||
=== Rešenje === | === Rešenje === | ||
<syntaxhighlight lang="java"> | |||
public static Obj find(String name, boolean isGlobal) { | |||
Obj result = null; | |||
if (isGlobal == true) { | |||
Scope s = currentScope; | |||
while (s.getOuter() != null) { | |||
s = s.getOuter(); | |||
} | |||
if (s.getLocals() != null) { | |||
result = s.getLocals().searchKey(name); | |||
} | |||
} else { | |||
for (Scope s = currentScope; s != null; s = s.getOuter()) { | |||
if (s.getLocals() != null) { | |||
result = s.getLocals().searchKey(name); | |||
if (result != null) break; | |||
} | |||
} | |||
} | |||
return (result != null) ? result : noObj; | |||
} | |||
</syntaxhighlight> | |||
Operator :: preskače sve opsege i traži ime direktno u universe opsegu. Pošto u fragmentu koda koji je dat nije navedeno da postoji pokazivač na universe opseg, onda se u if grani ide na gore sve dok se ne dođe do njega i zatim se u njemu pretražuje. Else grana je standardna implementacija koja je data u projektu. | |||
== 5. zadatak == | == 5. zadatak == | ||
{{delimično rešeno}} | |||
=== Postavka === | === Postavka === | ||
Za dati regularni izraz <code>(a | (bc)*)+ d (c | ε)+</code> konstruisati DKA. | |||
=== Rešenje === | === Rešenje === | ||
== 6. zadatak == | == 6. zadatak == | ||
{{delimično rešeno}} | |||
=== Postavka === | === Postavka === | ||
Za sledeći kod napisati Mikrojava bajtkod. | |||
<syntaxhighlight lang="java"> | |||
int b; | |||
const int one = 1; | |||
class A { | |||
int[] niz; | |||
int calc(int a) { | |||
...nebitno | |||
} | |||
} | |||
class B extends A { | |||
int calc(int a) { | |||
...isto nebitno | |||
} | |||
} | |||
int f(int c) | |||
{ | |||
if (c > 10) return c; | |||
else return c + 1; | |||
} | |||
void main() | |||
int x, y; A c; | |||
{ | |||
read(b); | |||
b = f(b); | |||
c = new B; | |||
x = 0; | |||
do { | |||
if (x % 2 == 0) y = c.calc(b); | |||
else y = y + (b + one); | |||
x++; | |||
} while (x < 5); | |||
} | |||
</syntaxhighlight> | |||
=== Rešenje === | === Rešenje === | ||
Тренутна верзија на датум 14. октобар 2025. у 01:33
Januarski ispit 2024. godine održan je 18. januara i trajao je 150 minuta. Postavka roka nije dostupna sa stranice predmeta.
1. zadatak
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Postavka
Dat je sledeći kod na programskom jeziku C.
int f1(int a) {
int b = a;
b = b + 1;
return b;
}
int f2(int a) {
int b = a;
b = b + f1(1);
return b;
}
int m(int a, int n, int (*m1)(int), int(*m2)(int)) {
int tmp1, int tmp2;
tmp1 = f1(a);
tmp2 = f2(a);
if (n == 0) {
return 1;
} else {
return tmp2 * m(tmp1, n - 1, m1, m2);
}
}
int main() {
printf("%d", m(1, 3, &f1, &f2));
return 0;
}
- Dati ispis programa;
- Dati izgled steka nakon poslednjeg poziva funkcije
f2; - Dati x86 kod za funkciju
f2.
Rešenje
2. zadatak
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Postavka
Data je sledeća gramatika:
- <S> -> <S>a
- <S> -> <S><A>b
- <S> -> eps
- <A> -> a
- <A> -> b
- Konstruisati automat i kontrolnu tabelu SLR(1) automata
- Ispraviti gramatiku tako da se ukloni konflikt ali semantika ostane ista.
Rešenje
3. zadatak
Postavka
Date su sledeće gramatike:
Gramatika A:
- <P> -> o <P> <P>
- <P> -> v
Gramatika B:
- <P> -> <P> o <P>
- <P> -> v
Gramatika C:
- <P> -> <P> <P> o
- <P> -> v
Gramatika D:
- <P> -> v <Q>
- <Q> -> <P> o <Q>
- <Q> -> eps
Gramatika E
- <P> -> v <P> o
- <P> -> v
- Koje su dve gramatike iste?
- Dokazati na primeru neke sekvence da se ostale 3 gramatike razlikuju.
Rešenje
a) Gramatika A jedina može počinjati sa O, pa ona sigurno nije ista kao neka druga. Gramatika B može prihvatiti sekvencu VOV, dok gramatika C ne može, pa ni one nisu iste. Gramatika C mora početi sa VV, što važi i za gramatiku E, pa su te dve gramatike iste.
b) Ukoliko uzmemo sekvencu OVV, takva sekvenca je validna za gramatiku A, ali nije za gramatike B i D. U gramatici B vidimo da ukoliko je ulazna sekvenca duža od 1, posle V mora da sledi O, dok u gramatici D to nije slučaj. Na primer, za sekvencu VVO se vidi da se B i D razlikuju jer gramatika D prihvata takvu sekvencu dok je gramatika B odbija.
4. zadatak
Postavka
Napisati funkciju static Obj find(String name, boolean isGlobal) za mikrojavu, koja se ponaša kao operator :: ako je isGlobal=true. Traženu funkciju pisati od nule.
public class Tab {
public static final Struct
noType = new Struct(Struct.None),
intType = new Struct(Struct.Int),
charType = new Struct(Struct.Char),
nullType = new Struct(Struct.Class);
public static final Obj noObj = new Obj(Obj.Var, "noObj", noType);
public static Obj chrObj, ordObj, lenObj;
public static Scope currentScope;
private static int currentLevel; //universe == -1
public static Obj find(String name, boolean isGlobal);
}
Rešenje
public static Obj find(String name, boolean isGlobal) {
Obj result = null;
if (isGlobal == true) {
Scope s = currentScope;
while (s.getOuter() != null) {
s = s.getOuter();
}
if (s.getLocals() != null) {
result = s.getLocals().searchKey(name);
}
} else {
for (Scope s = currentScope; s != null; s = s.getOuter()) {
if (s.getLocals() != null) {
result = s.getLocals().searchKey(name);
if (result != null) break;
}
}
}
return (result != null) ? result : noObj;
}
Operator :: preskače sve opsege i traži ime direktno u universe opsegu. Pošto u fragmentu koda koji je dat nije navedeno da postoji pokazivač na universe opseg, onda se u if grani ide na gore sve dok se ne dođe do njega i zatim se u njemu pretražuje. Else grana je standardna implementacija koja je data u projektu.
5. zadatak
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Postavka
Za dati regularni izraz (a | (bc)*)+ d (c | ε)+ konstruisati DKA.
Rešenje
6. zadatak
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Postavka
Za sledeći kod napisati Mikrojava bajtkod.
int b;
const int one = 1;
class A {
int[] niz;
int calc(int a) {
...nebitno
}
}
class B extends A {
int calc(int a) {
...isto nebitno
}
}
int f(int c)
{
if (c > 10) return c;
else return c + 1;
}
void main()
int x, y; A c;
{
read(b);
b = f(b);
c = new B;
x = 0;
do {
if (x % 2 == 0) y = c.calc(b);
else y = y + (b + one);
x++;
} while (x < 5);
}