Програмски преводиоци 1/Јануар 2022
Испит у јануарском року 2022. године одржан је 28. јануара. Поставка рока је доступна са странице предмета.
1. задатак
- Овај задатак није решен. Помозите СИ Wики тако што ћете га решити.
Поставка
Одредити минимални коначни детерминистички аутомат који прихвата оне и само оне улазне секвенце које НЕ прихвата коначни аутомат са слике али када се читају са десна у лево. На пример, дати аутомат не прихвата секвенцу аб, то значи да тражени аутомат треба да прихвати секвенцу ба. Поступак изложити по корацима, на генералан начин који би се могао применити и на сваки други аутомат.
Стање | а | б | Прихвата |
---|---|---|---|
→ А | Б | 0 | |
Б | C | D | 0 |
C | 1 | ||
D | Ф | 0 | |
Ф | Ф | Ф | 1 |
Решење
2. задатак
Поставка
- За смене 1 и 2 дате граматике навести које атрибуте треба рачунати и од којих других атрибута они могу да зависе да би цела граматика била L-атрибутивна. Правила наводити у облику аа = ф(бб, цц, дд,..) где је аа атрибут који мора да се рачуна, док су бб, цц, дд, итд сви други атрибути од којих посматрани може да зависи. Нетерминал <С> има синтетизован атрибут.
- Навести псеудокод за процедуру А у парсеру на бази рекурзивног спуста. Остале делове парсера не наводити. Преименовати променљиве да се минимизује број правила копирања вредности атрибута.
- <С>x → аy <А>з,в,w <С>п {бq}
- <С>x1 → дy1 {цз1} <А>в1, w1, п1
- <А>x,y,з1 → аq {цв} <А>x1,з,у <А>у,т,y1
- <А>т,с,с1 → дq {бт1} ас2
Решење
Из дате граматике можемо закључити следеће о типовима атрибута:
- Акције
b
иc
садрже наслеђене атрибуте. - Нетерминал
<A>
садржи три атрибута, од којих је први наслеђен а друга два синтетизована.
На основу тога, у првој смени видимо да атрибути могу имати следеће вредности:
а у другој смени следеће:
Код парсера са адекватно преименованим атрибутима дат је испод:
void A(int x, int& y, int& z) {
switch (input) {
case 'a':
input = advance();
int q = getInputValue();
out('c', x - q);
int u;
A(x, z, u);
int t;
A(u, t, y);
break;
case 'd':
input = advance();
out('b', x);
input = advance();
y = z = getInputValue();
break;
}
}
3. задатак
Поставка
Задата је граматика
- <С> → <С> б <А>
- <С> → <А> а <Б> б
- <А> → <Б> ц <Б> д
- <А> → ε
- <Б> → ε
- Конструисати каракетристични[сиц] аутомат ЛР(0) парсера као и одговарајућу контролну табелу. Да ли има конфликата?
- Конструисати контролну табелу СЛР(1) парсера. Да ли има конфликата?
Решење
Стање | Акција |
---|---|
<С'>0 | Р/Р конфликт |
<А>2 | СХИФТ |
<Б>31 | СХИФТ |
<С>x | СХИФТ |
ц3 | РЕДУЦЕ(5) |
<Б>32 | СХИФТ |
д3 | РЕДУЦЕ(3) |
а2 | РЕДУЦЕ(5) |
<Б>2 | СХИФТ |
б2 | РЕДУЦЕ(2) |
─┤0 | АЦЦЕПТ |
б1 | Р/Р конфликт |
<А>1 | РЕДУЦЕ(1) |
ФОЛЛОW скупови су следећи:
- ФОЛЛОW(<С>) = {─┤, б}
- ФОЛЛОW(<Б>) = {б, ц, д}
- ФОЛЛОW(<А>) = {а} ∪ ФОЛЛОW(<С>) = {─┤, а, б}
Стање | а | б | ц | д | ─┤ |
---|---|---|---|---|---|
<С'>0 | РЕДУЦЕ(4) | Р/Р конфликт | РЕДУЦЕ(5) | РЕДУЦЕ(5) | РЕДУЦЕ(4) |
<А>2 | СХИФТ | ||||
<Б>31 | СХИФТ | ||||
<С>x | СХИФТ | СХИФТ | |||
ц3 | РЕДУЦЕ(5) | РЕДУЦЕ(5) | РЕДУЦЕ(5) | ||
<Б>32 | СХИФТ | ||||
д3 | РЕДУЦЕ(3) | РЕДУЦЕ(3) | РЕДУЦЕ(3) | ||
а2 | РЕДУЦЕ(5) | РЕДУЦЕ(5) | РЕДУЦЕ(5) | ||
<Б>2 | СХИФТ | ||||
б2 | РЕДУЦЕ(2) | РЕДУЦЕ(2) | |||
─┤0 | АЦЦЕПТ | ||||
б1 | РЕДУЦЕ(4) | Р/Р конфликт | РЕДУЦЕ(5) | РЕДУЦЕ(5) | РЕДУЦЕ(4) |
<А>1 | РЕДУЦЕ(1) | РЕДУЦЕ(1) |
4. задатак
Поставка
Дат је листинг програма Јануар2022, написан на програмском језику Микројава. Све методе унутрашњих класа су виртуелне. Глобалне методе се позивају статички. Написати комплетан Микројава бајткод превода функције f
за дати програм
program Januar2022
const int K = 2;
int add;
class A {
int fld;
{
int m(int a)
{ return fld * 2; }
void met()
{ fld = fld + 3; }
} }
class B extends A {
{
int m(int b)
{ /*T1*/
return fld + b;
}
}
}
A arr[];
{
int f(int index){
add = arr[index].m(K);
arr[index].met();
return add + K;
}
void main()
B b;
int ret;
{
/*T2*/
arr = new A[2];
arr[0] = new B;
arr[1] = new A;
ret = f(0) + f(1);
print(arr[0].m(ret));
}
}
Решење
enter 1, 1 getstatic 1 load_0 aload const_2 getstatic 1 load_0 aload getfield 0 invokevirtual 'm' -1 putstatic 0 getstatic 1 load_0 aload dup getfield 0 invokevirtual 'm' 'e' 't' -1 getstatic 0 const_2 add exit return
5. задатак
Поставка
Приказати изглед табеле симбола у тренуцима Т1 и Т2 на основу изворног кода из задатка 4 према формату чворова табеле симбола из прилога. Универсе опсег не треба цртати. За Т2 довољно је назначити измене у односу на претходно стање табеле.
Решење
6. задатак
Поставка
За дати програмски фрагмент написати одговарајући међукод у ССА форми и нацртати граф тока контроле на нивоу основних блокова.
a = 1;
b = 2;
c = 3;
for (a = 4; b < c || a < 10; a++) {
if (a > b + c) {
c++;
break;
} else if (a > b * c) {
b--;
continue;
}
else return a;
}
a = b * c;
return a;
Решење
- а1 := 1
- б1 := 2
- ц1 := 3
- а2 := 4
- т1 := Ф(б1, б2)
- иф т1 < ц1 гото 8
- иф а2 >= 10 гото 17
- т2 := т1 + ц1
- иф а <= т2 гото 12
- ц2 := ц1 + 1
- гото 17
- т3 := т1 * ц1
- иф а <= т3 гото 16
- б2 := т1 - 1
- гото 5
- ретурн а2
- т4 := Ф(б1, б2)
- т5 := Ф(ц1, ц2)
- т6 := т1 * т2
- а3 := т6
- ретурн а3