Програмски преводиоци 1/Јануар 2023 — разлика између измена
(Zadaci sa današnjeg roka iz sećanja. // Edit via Wikitext Extension for VSCode) |
м (→3. zadatak: j ide od i+1, ne od 0) |
||
Ред 81: | Ред 81: | ||
for (int i = 0; i < 10; i++) { | for (int i = 0; i < 10; i++) { | ||
int n = res; | int n = res; | ||
for (int j = | for (int j = i + 1; j < n; j++) { | ||
if ((i + j) % 2 == 0) { | if ((i + j) % 2 == 0) { | ||
res++; | res++; |
Верзија на датум 20. јануар 2023. у 01:30
- Овај рок није решен. Помозите SI Wiki тако што ћете га решити.
Januarski ispit 2023. godine održan je 19. januara. Postavka roka nije dostupna sa stranice predmeta.
1. zadatak
Postavka
Dat je sledeći program:
int main() {
int count;
void procX() {
void report() {
writeln("count = " + count);
}
void proxY() {
int count;
count = 200;
report();
}
count = 100;
report();
procY();
}
count = 300;
procX();
}
- Ukoliko se koristi statičko razrešavanje dosega, šta će ispisati dati program?
- Ukoliko se koristi dinamičko razrešavanje dosega, šta će ispisati dati program?
- Ukoliko se za nelokalne promenljive koriste displeji, nacrtati poslednje stanje steka i displeja nakon što je
report
funkcija pozvana poslednji put.
Rešenje
2. zadatak
Postavka
Dat je isečak koda klase Struct
. Dopuniti metodu AssignableTo
kodom koji fali.
public class Struct {
class Kinds {
public static final int None = 0, Int = 1, Char = 2,
Array = 3, Class = 4, Bool = 5;
}
private int kind;
private Struct elemType;
private int numOfFields;
public boolean IsRefType() {
return kind == Kinds.Class || kind == Kinds.Array;
}
public boolean Equals(Struct other) {
if (kind == Kinds.Array) return other.kind == Kinds.Array
&& elemType.Equals(other.elemType);
if (kind == Kinds.Class) return other.kind == Kinds.Class
&& numOfFields == other.numOfFields
&& Obj.equalsCompleteHash(members, other.members);
return this == other;
}
public boolean CompatibleWith(Struct other) {
return this.Equals(other)
|| this == Tab.nullType && other.IsRefType()
|| other == Tab.nullType && this.IsRefType();
}
public boolean AssignableTo(Struct dest) {
if (this.Equals(dest) || (this == Tab.nullType && dest.IsRefType())
|| (this.kind == Kinds.Array && dest.kind == Kinds.Array && dest.elemType == Tab.noType)) {
return true;
}
return false;
}
}
Rešenje
3. zadatak
Postavka
Za dati blok koda napisati međukod a zatim nacrtati graf toka kontrole sa međukodom u SSA formi.
int res = 10;
for (int i = 0; i < 10; i++) {
int n = res;
for (int j = i + 1; j < n; j++) {
if ((i + j) % 2 == 0) {
res++;
}
}
}
Rešenje
4. zadatak
Postavka
Za datu gramatiku konstruisati karakteristički LR(0) automat i kontrolnu tabelu, a zatim dodati LALR(1) predikcione skupove.
- <S> → <S> <A>
- <A> → <A> a <A> b
- <A> → <S> a
- <A> → c
Rešenje
5. zadatak
Postavka
U datoj gramatici neterminalu <list>
dodati sintetizovani atribut koji naizmenično sadrži cifre najvećih i najmanjih brojeva iz niza. Na primer, ukoliko je sekvenca koja se prepoznaje [1, 2, 3] [4, 5, 6] [7, 8, 9], taj atribut bi imao vrednost 349. Smatrati da terminal INT
ima sintetizovani simbol sa svojom vrednošću.
- <list> → <list> <item>
- <list> → <item>
- <item> → [ <num_arr> ]
- <num_arr> → <num_arr>, INT
- <num_arr> → INT
Rešenje
6. zadatak
Postavka
Napisati kompletan prevod funkcija f1
, f2
i main
. Smatrati da prevod f1
kreće od adrese 0. Sekciju označenu sa // ...
nije potrebno prevoditi i smatrati da je njena dužina jedna instrukcija.
int b;
class A {
int fun1(int p) {...}
}
class B {
A[] arr;
}
B bObj;
int f1() {
return 1;
}
int f2() {
return 2;
}
void main() int x; {
bObj = new B;
// ...
b = bObj.arr[1].fun1(3);
if (b < x) {
b = f1();
}
else b = f2();
}