DU5

Ú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.
atombomb
Matfyz(ák|ačka) level I
Příspěvky: 22
Registrován: 18. 1. 2007 13:11

Re: du5

Příspěvek od atombomb »

po hrabani sa v tom nejakom cpp zdrojaku dutables alebo tak nejak som nasiel, ze record_type->find(idx) vola na std::vector<...> funkciu find_if_(beginiterator,enditerator,...) a ten v pripade neuspechu vrati enditerator, pricom ak tomu dobre rozumiem, tak aj na record_type je metoda end() ktora zrejme vracia to iste.
Takze staci porovnat vystup find(idx) a mojRecord->end() a vieme ci mame dobry alebo zly iterator
Jochanan
Matfyz(ák|ačka) level II
Příspěvky: 85
Registrován: 12. 5. 2007 15:58
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Re: du5

Příspěvek od Jochanan »

no, ale ty dva iteratory jsou ruznyho typu. Zkousel jsem porovnavat offsety, ale to mi hnedka zahlasilo chybu, ze jsem pristoupil k neplatnymu prvku. Tak ted nevim teda...

Jinak par veci predtim jsem uz nejak "vyresil"

ad 1. symbol pointer existuje pouze pro cely recordy. Osobne si nechavam sp jen z prvniho recordu po ceste, abych pak urcil, jestli je to globalni, nebo lokalni a jeste myslim kvuli necemu to bylo potreba...

ad 2. ad 1

ad 3. ad 1

ad 4. no tu adresu polozky pomoci sp->access_XXX_variable()->address(); a potom na tp stejny polozky volam ten offset, jen to sectu.

ad 5 na to jsem jeste neprisel, myslim, ze offset hledam podle access_variable a funguje to...

ad 6. Proste zkopiruju ten tp toho recordu dole ve "faktoru", zadnej ctx->tab->logical_XXX() a porovnavam to nahore podle toho identical_type (tp1, tp2) jak bylo receny vyse
banan
Matfyz(ák|ačka) level I
Příspěvky: 40
Registrován: 14. 6. 2005 14:50
Typ studia: Informatika Bc.
Bydliště: Troja

Re: du5

Příspěvek od banan »

atombomb píše:po hrabani sa v tom nejakom cpp zdrojaku dutables alebo tak nejak som nasiel, ze record_type->find(idx) vola na std::vector<...> funkciu find_if_(beginiterator,enditerator,...) a ten v pripade neuspechu vrati enditerator, pricom ak tomu dobre rozumiem, tak aj na record_type je metoda end() ktora zrejme vracia to iste.
Takze staci porovnat vystup find(idx) a mojRecord->end() a vieme ci mame dobry alebo zly iterator
Jochanan myslim narazal na chybu, ktora je o uroven vyssie v dutabled.cpp:

Kód: Vybrat vše

93:    field_pointer type_entry::record_find_( ls_id_index idx) const
94:    {
95:	return field_pointer( & * fldlist->find( idx)); 
95:    }
Ak field s danym identifikatorom neexistuje, fldlist->find(idx) vrati (ako si aj napisal) vector::end(). Bug je v tom, ze aj tak je tento neplatny iterator na riadku 95 dereferencovany (s naslednym cielom ziskat field_entry pre dany identifikator idx). Oprava by mohla vyzerat nejako takto:

Kód: Vybrat vše

    field_pointer type_entry::record_find_( ls_id_index idx) const
    {
		field_vector::iterator field = fldlist->find( idx);
		if(fldlist->end() == field)
			return field_pointer();
		else
			return field_pointer( & *field);
    }
atombomb
Matfyz(ák|ačka) level I
Příspěvky: 22
Registrován: 18. 1. 2007 13:11

Re: DU5

Příspěvek od atombomb »

ano ano, ked som to nakodil tak som zistil to iste, pardon teda. chcel som napisat opravu skorej, ale mi vypadol internet a ide az teraz...
kazdopadne riesenie je, ze symbol_pointer ma pretazeny operator ! (not) takze staci pouzit ten, nieco na styl:

Kód: Vybrat vše

symbol_pointer sp = record_ptr->find(indexPolozky)
if(!sp) return 'errrrr';
Jochanan
Matfyz(ák|ačka) level II
Příspěvky: 85
Registrován: 12. 5. 2007 15:58
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Re: DU5

Příspěvek od Jochanan »

if (!record_ptr->find(indexPolozky)) prave spadne. O to jde.
atombomb
Matfyz(ák|ačka) level I
Příspěvky: 22
Registrován: 18. 1. 2007 13:11

Re: DU5

Příspěvek od atombomb »

a sakra, je to tak... tak sory ze otravujem vzduch :)
to je zle, pokial to nechcem prechadzat rucne, tak sa musim hrabat v dutables.cpp tym padom asi...?
qk_

Re: DU5

Příspěvek od qk_ »

atombomb píše:a sakra, je to tak... tak sory ze otravujem vzduch :)
to je zle, pokial to nechcem prechadzat rucne, tak sa musim hrabat v dutables.cpp tym padom asi...?
no kdyz je chyba v dutables, tak to neni treba resit :)...prijde mi ze tento rok ty prekladace, v porovnani s lonskem, ulita trochu flaka.
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Re: DU5

Příspěvek od hippies »

tak to bych netvrdil :lol:
Chjo, dovede te si představit svět, kde by byla každá harmonická diferenciální forma (jistého typu) nesingulární projektivní algebraické variety racionální kombinací kohomologických tříd algebraických cyklů..
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:

DU5 - update

Příspěvek od Che »

Včera se objevil update DÚ5 - má řešit některé problémy s RECORDy, třeba zde řešené chybné chování metody record_type::find().
shoot that shit
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: DU5

Příspěvek od Necroman »

Objevil se dalsi update DU 5. opravuje testy a reseni. Stahujte :)
http://ulita.ms.mff.cuni.cz/pub/predn/P ... index.html
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
dargor
Matfyz(ák|ačka) level I
Příspěvky: 31
Registrován: 15. 12. 2006 15:00

Re: DU5

Příspěvek od dargor »

Poradil byste mi prosim nekdo s timhle:

priklad s recordy:

a.b.c

jak ziskam type_pointer na tu posledni polozku, find pres to prvni 'a' mi to nenajde a to druhe 'b' mi hlasi, ze neni SKIND_LOCAL_VARIABLE ani SKIND_GLOBAL_VARIABLE

tak ze nemohu udelat find pres to druhe 'b'
symbol_pointer sp = ctx->tab->find_symbol($1);
tp = sp->access_local_variable()->type();
tp->access_record()->find($3)
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: DU5

Příspěvek od Che »

dargor píše:Poradil byste mi prosim nekdo s timhle:

priklad s recordy:

a.b.c

jak ziskam type_pointer na tu posledni polozku, find pres to prvni 'a' mi to nenajde a to druhe 'b' mi hlasi, ze neni SKIND_LOCAL_VARIABLE ani SKIND_GLOBAL_VARIABLE

tak ze nemohu udelat find pres to druhe 'b'
symbol_pointer sp = ctx->tab->find_symbol($1);
tp = sp->access_local_variable()->type();
tp->access_record()->find($3)
Pokud a.b.c <=> DUTOK_IDENTIFIER DUTOK_DOT DUTOK_IDENTIFIER DUTOK_DOT DUTOK_IDENTIFIER, pak:

Kód: Vybrat vše

symbol_pointer sp = ctx->tab->find_symbol($1);

// Zde by měla být kontrola zda $1 odpovídá nějakému identifikátoru a pokud ano, zda je to proměnná typu record.

record_pointer rp = sp->access_variable()->type()->access_record();
field_pointer fp = rp->find($3);
if ( !fp ) {
  error(DUERR_NOTFIELD, @3, *$3);
  break;
}

// Zde by opět mělo být ověření, že položka $3 je typu record.

rp = fp->type()->access_record();
fp = rp->find($5);

// A výsledný type_pointer na poslední položku je:
type_pointer tp = fp->type();
Doufám, že to alespoň trochu pomohlo...
shoot that shit
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: DU5

Příspěvek od Necroman »

dargor píše:Poradil byste mi prosim nekdo s timhle:
priklad s recordy:
a.b.c
jak ziskam type_pointer na tu posledni polozku, find pres to prvni 'a' mi to nenajde a to druhe 'b' mi hlasi, ze neni SKIND_LOCAL_VARIABLE ani SKIND_GLOBAL_VARIABLE
tak ze nemohu udelat find pres to druhe 'b'
symbol_pointer sp = ctx->tab->find_symbol($1);
tp = sp->access_local_variable()->type();
tp->access_record()->find($3)
type_pointer na prvni record je
tp1 = ctx->tab->find_symbol($1)->access_variable()->type();
do polozky rekordu se dostanes
tp2 = tp1->access_record()->find(S3)->type();
a tak dal...
tp3 = tp2->access_record()->find(S5)->type();

pak se jeste hodi funkce
off = tp1->access_record()->find(S3)->offset();
pro offset v danem rekordu. Nezapominat, ze je treba scitat offset za celu cestu, offset() vraci jen v ramci jedhoho recordu
WANTED:
Dead or Alive
^-^
( ^ )
Schroedinger's Cat
dargor
Matfyz(ák|ačka) level I
Příspěvky: 31
Registrován: 15. 12. 2006 15:00

Re: DU5

Příspěvek od dargor »

dik funguje, jeste by mne zajimalo jakou funkci pouzivate pro kontrolu skutecnych parametru s formalnimi, tzv. jaka funkce vam prozradi, jake parametry volana funkce ocekava, je to tato?

sp->access_function()->parameters()

nebo pouzivate nejakou jinou ?
Jochanan
Matfyz(ák|ačka) level II
Příspěvky: 85
Registrován: 12. 5. 2007 15:58
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Re: DU5

Příspěvek od Jochanan »

dargor píše:dik funguje, jeste by mne zajimalo jakou funkci pouzivate pro kontrolu skutecnych parametru s formalnimi, tzv. jaka funkce vam prozradi, jake parametry volana funkce ocekava, je to tato?

sp->access_function()->parameters()

nebo pouzivate nejakou jinou ?
Presne tahle, dostanes iterator s parametrama a pak jeden po druhym kontroluješ...
Odpovědět

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