DU6
- Tacoud
- Donátor
- Příspěvky: 53
- Registrován: 16. 9. 2005 08:38
- Typ studia: Informatika Bc.
- Bydliště: Mladá Boleslav
- Kontaktovat uživatele:
Re: DU6
Iterátor na konec icblocku. Nějak takhle:D píše:Co davate ako parameter do new ai::JMP(..??..)
Kód: Vybrat vše
blok->append_instruction_with_target(new ai::JMP(blok->end()), muj_label);
Spojaři všech zemí, proletujte se!
-
- Matfyz(ák|ačka) level I
- Příspěvky: 4
- Registrován: 17. 6. 2006 12:57
- Typ studia: Informatika Mgr.
- Kontaktovat uživatele:
Re: DU6
Tu su moje poznamky z cvicenia u Mgr. Dokulila. Je pravdepodobne, ze poznamky obsahuju nejake chyby, ale snad pomozu.Necroman píše:Nebyl by zapis aj k sestemu cviceni?
Kód: Vybrat vše
du6
====
Predavanie odkazom (varene parametry)
porovnavanie, OR, AND - trivialne
skoky
======
icb->append_instruction_with_target
- sluzi na vkladanie instrukcii, ktore skacu prec
- prvy parameter je instrukcia : new ai::JMP()
- druhy parameter je ciel skoku
pozn: ic_label
pozn: new_label
label je v podstate nieco medzi instrukciami
akoby sa pamatalo odkial je ktory label
icb->add_label(label_type)
na konci zasobnika prida label
opt_label :
| DUTOK_UINT COLON: {
ctx->tab->find_label( $1 );
// vrati to label symbol pointer (dalej lsp)
//
if (! lsp ) { volam error; }
else {
$$->add_label(lsp->label)
$$->label_found(@1) //viz dalej, preco tento prikaz
}
}
ako vyriesit: goto 5;
najdeme label,
zistime ci je platny
ak nie je, tak pridame $$->add_instruction_with_target(new ai::JMP(), lsp->label() ) ;
musime spravne volat (na kazdy novy lavel a kazdy novy goto)
lsp->goto_found ( @1 )
lsp->label_dound ( @1 )
@1 - cislo riadku
to kvoli tomu, aby tabulky vedeli
skoky IF-ELSE
=============
if (a=1) then a:=2;
LLDI 1
LDLITI "1"
EQI
JF 1 //JUMP
LDLITI "2"
LST1 1
1:
EQI - spapa 2 int z vrcholu zasobnika a na vrhol prida true/false
JF - jump false 1, preskoci na label 1: v kode
- vezme bool z vrcholu zasobniku a ak je false skoci na "1"
- ak vysledok bol true, ide sa dalej na dalsiu instrukciu (bez skoku)
cond
JF 1
code 1
JMP 2
1: code 2
2:
IF_ELSE
==========
IF cond THEN prikaz
//cond aj prikaz je icblock
$$ = $2;
//pozor, potrebujeme zistit, ci vyraz je bool, da sa to nejak zistit (ako ?)
ic_label tgt = new_label(ctx);
$$->aint( new ai:: JF, tgt );
$$->append_clear_block( $4 );
$$->add_label ( tgt );
WHILE
===========
WHILE vyraz DO prikaz
i. hlupsia moznost
vyhodnotime vyraz (na zasobniku ostate )
2: vyraz JF 1
prikaz
JMP 2
1:
ii. chytrejsia moznost
JMP 1
2: prikaz
1: vyraz
JT 2
FOR CYKLUS
============
FOR i:=2 to 1 do
ctx->tab->one() - vrati index literalu s jednickou
VARene parametre
=================
kod:
procedure inc (var i:integer);
begin
i := i + 1;
end;
instrukcie:
LLDP -1
- vlozi na vrchol zasobnika pointer
XLDI
- z vrcholu zasobniku nacita pointer a vlozi na vrchol hodnotu kde pointer ukazuje
LDLITI 1
ADDII
LLDP -1
XSTI
- ulozi na pointer zo zasobnika hodnotu pred nim
kod:
var g:int;
procedure x (p:int)
var l:int
begin
inc(p);
instrukcie:
LREF(-1)
CALL inc
DTORP
GREF - volanie pre globalne premenne
ak je "p" v "x" vareny, tak miesto LREF(-1) bude LLDP -1
problem je, ako to zaistit v bisonu
konkretne tu pravu stranu (volanie procedury)
napriklad: inc(a+1)
to co je vnutri tj (a+1) sa zredukuje a pri vyhodnocovani inc uz dostaneme len icblock
i. prva moznost - osetrenie gramaticky
prikaz : DUTOK_IDENTIFIER DUTOK_LPAD skutecne_parametre DUTOK_RPAR
to sa da prepisat ako
prikaz: volproc RPAR
volproc: ID LPAR vyraz
| volproc COMMA vyraz
potom vznikne takyto strom:
prikaz
/ \
volpar )
/ | \
volpar , b
/ | \
ID ( a
problem je, ze treba menit gramatiku
ii. osetrenie kodom
spatne si predavam pomocnu premennu
150b
=====
predavanie struktur
problem nastane, ako raz predame
procedure p(var r:rec)
r.a := 1;
...
...
procedure X(r:rec)
...
...
x(r);
LDLITI "1" _
LLDP -1 |
LDLLIT "1" |- toto opakovat kolko streba
ADDP _|
XSTI
instrukcia SLDI
to nejak pracuje s relativnym hodnotam voci vrcholu zasobniku
- Necroman
- Supermatfyz(ák|ačka)
- Příspěvky: 459
- Registrován: 20. 1. 2005 19:46
- Typ studia: Informatika Mgr.
- Login do SIS: suchm4am
- Bydliště: Louny / kolej Jednota, Praha
- Kontaktovat uživatele:
Re: DU6
Pokud predavas record hodnotou do funkce, tak typicky zkopirujes vsechny polozky na zasobnik. Pokud referenci, tak tam das jen pointr na hlavicku toho rekordu. Potom kdyz potrebujes pristoupit na polozku toho rekordu, tak dasTacoud píše:Nevíte někdo, jak řešit ukládání do recordu předaného pomocí reference? Nezmiňoval se někdo na cvičeních, jak se s tím vypořádat? V testech jsou bohužel jenom outputy z loňska, které se vztahují k polím. Ty letošní tam nějak chybí...
Kód: Vybrat vše
cod->append_instruction(new ai::LLDP(addr));
potom si zjistis offset a po jednickach prictes k tomu pointru na vrcholu tolik, aby ukazoval na tu spravnou polozku ve sve promenne
Kód: Vybrat vše
cod->append_instruction(new ai::LDLITI(ctx->tab->one()));
cod->append_instruction(new ai::ADDP());
Kód: Vybrat vše
cod->append_instruction(new ai::XLTI());
cod->append_instruction(new ai::XSTI());
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
- Che
- Donátor
- Příspěvky: 166
- Registrován: 2. 6. 2005 12:29
- Typ studia: Informatika Mgr.
- Login do SIS: przyc4am
- Bydliště: EU
- Kontaktovat uživatele:
Re: DU6
Nebo lze vytvořit nový literál s hodnotou offsetu a přičíst ho pak jen jednou Ušetříš tím někdy dost instrukcí...Necroman píše: potom si zjistis offset a po jednickach prictes k tomu pointru na vrcholu tolik, aby ukazoval na tu spravnou polozku ve sve promenneKód: Vybrat vše
cod->append_instruction(new ai::LDLITI(ctx->tab->one())); cod->append_instruction(new ai::ADDP());
Kód: Vybrat vše
icbp->append_instruction(new ai::LDLITI(ctx->tab->ls_int().add(offset)));
icbp->append_instruction(new ai::ADDP());
shoot that shit
- Necroman
- Supermatfyz(ák|ačka)
- Příspěvky: 459
- Registrován: 20. 1. 2005 19:46
- Typ studia: Informatika Mgr.
- Login do SIS: suchm4am
- Bydliště: Louny / kolej Jednota, Praha
- Kontaktovat uživatele:
Re: DU6
Nevite, proc ma polovina lidi ve vysledcich DU6 chybu
to je chybova hlaska, ktera vypadne z ICM simulatoru, pokud se tomu predhodi moa kod, ktery obsahuje spatne volani
v referencnim mls souboru je to volani funkce s var promennou pri pouziti ne-var vyrazu
Podle me by se tento kod nemel vubec generovat, protoze nejde pouzit. Uz to, ze se vygeneruje chyba by melo uzivatele trknout, ze je neco spatne...
Kód: Vybrat vše
du6-test11
1c1
< 1
---
> ERROR: Requested bad value type on IP=20
Kód: Vybrat vše
31: LDLITI LITINT[0]
32: ADDI
33: CALL 20 ;; label=ADDONE
34: DTORP
35: GLDI [0]
Kód: Vybrat vše
procedure addone(var i:integer);
begin
i:=i+1;
end;
addone(i+1);
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
- Petr-H
- Matfyz(ák|ačka) level II
- Příspěvky: 81
- Registrován: 30. 1. 2006 14:18
- Typ studia: Informatika Mgr.
- Login do SIS: hosep5am
- Bydliště: VŠK 17. listopadu
- Kontaktovat uživatele:
Re: DU6
Podle toho co bylo řečeno na cvičení by tyto chyby neměli být brány při hodnocení v potaz (podobně jako varování v kódu generovaném Bisonem)
- Necroman
- Supermatfyz(ák|ačka)
- Příspěvky: 459
- Registrován: 20. 1. 2005 19:46
- Typ studia: Informatika Mgr.
- Login do SIS: suchm4am
- Bydliště: Louny / kolej Jednota, Praha
- Kontaktovat uživatele:
Re: DU6
Zatim nic, ale jak tak koukam, prehodnotil testy a u du6-test11 uz nejsou ty chyby, jako byly predtim u poloviny lidi
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
-
- Matfyz(ák|ačka) level I
- Příspěvky: 3
- Registrován: 28. 1. 2008 15:17
- Typ studia: Informatika Bc.
Re: DU6
Jupi, aj ja! Ale im to trvalo...PeterPi píše:Ja už mám, asi oddnes.mgrafi píše:Mate uz niekto v Grupicku body za DU6?
Na zapisovanie do indexov ma byt nejaky specialny termin, alebo mame prist na niektoru zo skusok?