DU6

Úvodní kurz překladačů se soustřeďuje zejména na teoretické i praktické základy konstrukce přední části překladače. Součástí předmětu je i cvičení zaměřující se na základy práce s nástroji pro konstrukci překladačů. Po absolvování tohoto kurzu bude posluchač schopen sestrojit vlastní překladač do mezikódu nebo jiného jazyka.
D
Matfyz(ák|ačka) level I
Příspěvky: 32
Registrován: 20. 12. 2006 17:42

DU6

Příspěvek od D »

Co davate ako parameter do new ai::JMP(..??..)
Uživatelský avatar
Tacoud
Donátor
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

Příspěvek od Tacoud »

D píše:Co davate ako parameter do new ai::JMP(..??..)
Iterátor na konec icblocku. Nějak takhle:

Kód: Vybrat vše

blok->append_instruction_with_target(new ai::JMP(blok->end()), muj_label);
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í...
Spojaři všech zemí, proletujte se!
Uživatelský avatar
Necroman
Supermatfyz(ák|ačka)
Příspěvky: 459
Registrován: 20. 1. 2005 19:46
Typ studia: Informatika Mgr.
Bydliště: Louny / kolej Jednota, Praha
Kontaktovat uživatele:

Re: DU6

Příspěvek od Necroman »

Nebyl by zapis aj k sestemu cviceni? ;)
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
maccage
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

Příspěvek od maccage »

Necroman píše:Nebyl by zapis aj k sestemu cviceni? ;)
Tu su moje poznamky z cvicenia u Mgr. Dokulila. Je pravdepodobne, ze poznamky obsahuju nejake chyby, ale snad pomozu.

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 
Uživatelský avatar
Necroman
Supermatfyz(ák|ačka)
Příspěvky: 459
Registrován: 20. 1. 2005 19:46
Typ studia: Informatika Mgr.
Bydliště: Louny / kolej Jednota, Praha
Kontaktovat uživatele:

Re: DU6

Příspěvek od Necroman »

Tacoud 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í...
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 das

Kód: Vybrat vše

cod->append_instruction(new ai::LLDP(addr));
addr je adresa toho rekordu
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());
potom staci nacist/zapsat tuto promennou pres ziskany pointr

Kód: Vybrat vše

cod->append_instruction(new ai::XLTI());
cod->append_instruction(new ai::XSTI());
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
Uživatelský avatar
Che
Donátor
Donátor
Příspěvky: 166
Registrován: 2. 6. 2005 12:29
Typ studia: Informatika Mgr.
Bydliště: EU
Kontaktovat uživatele:

Re: DU6

Příspěvek od Che »

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 promenne

Kód: Vybrat vše

cod->append_instruction(new ai::LDLITI(ctx->tab->one()));
cod->append_instruction(new ai::ADDP());
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í...

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
mgrafi
Matfyz(ák|ačka) level I
Příspěvky: 3
Registrován: 28. 1. 2008 15:17
Typ studia: Informatika Bc.

Re: DU6

Příspěvek od mgrafi »

Mate uz niekto v Grupicku body za DU6?
Uživatelský avatar
Petr-H
Matfyz(ák|ačka) level II
Příspěvky: 81
Registrován: 30. 1. 2006 14:18
Typ studia: Informatika Mgr.
Bydliště: VŠK 17. listopadu
Kontaktovat uživatele:

Re: DU6

Příspěvek od Petr-H »

mgrafi píše:Mate uz niekto v Grupicku body za DU6?
Zatím ne :(
Uživatelský avatar
Necroman
Supermatfyz(ák|ačka)
Příspěvky: 459
Registrován: 20. 1. 2005 19:46
Typ studia: Informatika Mgr.
Bydliště: Louny / kolej Jednota, Praha
Kontaktovat uživatele:

Re: DU6

Příspěvek od Necroman »

Nevite, proc ma polovina lidi ve vysledcich DU6 chybu

Kód: Vybrat vše

du6-test11
1c1
< 1
---
> ERROR: Requested bad value type on IP=20
to je chybova hlaska, ktera vypadne z ICM simulatoru, pokud se tomu predhodi moa kod, ktery obsahuje spatne volani

Kód: Vybrat vše

31:	LDLITI	LITINT[0]
32:	ADDI
33:	CALL	20	;; label=ADDONE
34:	DTORP
35:	GLDI	[0]
v referencnim mls souboru je to volani funkce s var promennou pri pouziti ne-var vyrazu

Kód: Vybrat vše

procedure addone(var i:integer);
begin
  i:=i+1;
end;

addone(i+1);
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...
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
Uživatelský avatar
Petr-H
Matfyz(ák|ačka) level II
Příspěvky: 81
Registrován: 30. 1. 2006 14:18
Typ studia: Informatika Mgr.
Bydliště: VŠK 17. listopadu
Kontaktovat uživatele:

Re: DU6

Příspěvek od Petr-H »

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) :wink:
Uživatelský avatar
hydrant
Matfyz(ák|ačka) level III
Příspěvky: 196
Registrován: 4. 1. 2005 12:50
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Re: DU6

Příspěvek od hydrant »

Petr H píše:
mgrafi píše:Mate uz niekto v Grupicku body za DU6?
Zatím ne :(
yaghob mal cely tyzden dovolenku
PeterPi
Matfyz(ák|ačka) level I
Příspěvky: 16
Registrován: 15. 12. 2007 15:12
Typ studia: Informatika Bc.

Re: DU6

Příspěvek od PeterPi »

mgrafi píše:Mate uz niekto v Grupicku body za DU6?
Ja už mám, asi oddnes. :)
Uživatelský avatar
Necroman
Supermatfyz(ák|ačka)
Příspěvky: 459
Registrován: 20. 1. 2005 19:46
Typ studia: Informatika Mgr.
Bydliště: Louny / kolej Jednota, Praha
Kontaktovat uživatele:

Re: DU6

Příspěvek od Necroman »

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
Uživatelský avatar
Che
Donátor
Donátor
Příspěvky: 166
Registrován: 2. 6. 2005 12:29
Typ studia: Informatika Mgr.
Bydliště: EU
Kontaktovat uživatele:

Re: DU6

Příspěvek od Che »

Tak já už mám i body v Grupíčku i známku a to velice hezkou :D
shoot that shit
mgrafi
Matfyz(ák|ačka) level I
Příspěvky: 3
Registrován: 28. 1. 2008 15:17
Typ studia: Informatika Bc.

Re: DU6

Příspěvek od mgrafi »

PeterPi píše:
mgrafi píše:Mate uz niekto v Grupicku body za DU6?
Ja už mám, asi oddnes. :)
Jupi, aj ja! Ale im to trvalo...
Na zapisovanie do indexov ma byt nejaky specialny termin, alebo mame prist na niektoru zo skusok?
Odpovědět

Zpět na „SWI098 Principy překladačů“