cool, it workedAnonymous píše:Uhmm, na ulitě je další update, asi už si všimli té chyby se skokama.
DU6
- Kate
- Matfyz(ák|ačka) level III
- Příspěvky: 146
- Registrován: 8. 1. 2005 10:52
- Typ studia: Informatika Mgr.
- Login do SIS: opock4am
- Bydliště: Milada squat
- Kontaktovat uživatele:
Re: testovaci soubor
bezvadny, diky moc, jdu vymyslet ty dalsi zaludnosti.tm píše:V priloze uvadim svuj testovaci soubor. Doufam, ze ho pripadne rozsirite o dalsi zaludne pripady a vratite zpet
muj vystup je totozny az na chovani u repeatu.
tady si ale myslim, ze se repeat-until nechova spravne u tebe (na konci by melo byt JF, tedy cykli se znovu v pripade, ze podminka neplati, konci se, pokud je true a u tebe se to chova, jako kdyby bylo na konci JT - aspon soudim dle vystupu)
Člověk si nemusí nic myslet, aby něco udělal.
- Kate
- Matfyz(ák|ačka) level III
- Příspěvky: 146
- Registrován: 8. 1. 2005 10:52
- Typ studia: Informatika Mgr.
- Login do SIS: opock4am
- Bydliště: Milada squat
- Kontaktovat uživatele:
prikladam svuj lehce psychedelicky testik pro du6, zamereny predevsim na kopirovani casti poli. zdrojak ani vystup nejsou moc elegantni ani okomentovane, ale ony uz se s tim vase prekladace nejak poperou
reporty chyb a dalsi testy uvitam
reporty chyb a dalsi testy uvitam
- Přílohy
-
- ktest.rar
- chutovka pro mlaskompiler
- (6.06 KiB) Staženo 189 x
Člověk si nemusí nic myslet, aby něco udělal.
Re: testovaci soubor
Diky za upozorneni - tak to mam zase o jednu chybku min Podminky u cyklu v Pascalu mi vzdycky delaly problemy..Kate píše:muj vystup je totozny az na chovani u repeatu.
tady si ale myslim, ze se repeat-until nechova spravne u tebe (na konci by melo byt JF, tedy cykli se znovu v pripade, ze podminka neplati, konci se, pokud je true a u tebe se to chova, jako kdyby bylo na konci JT - aspon soudim dle vystupu)
Koukam, ze ted se ten muj testovaci soubor na repeatu trochu zacykli..
DUTOK_EQ a DUTOK_OPER_REL
Nevie preco ma "=" extra token DUTOK_EQ a nepatri medzi tokeny zdruzene do DUTOK_OPER_REL ? Nejak neviem prist na to, preco by to malo byt osobitne, pri vyhodnocovani vyrazov tie semanticke pravidla vyzeraju uplne rovnako (az na generovanu instrukciu samozrejme).
Tak bud to je ozaj rozdelene zbytocne, alebo mi unika nejake vynimocne postavenie DUTOK_EQ oproti operatorom z DUTOK_OPER_REL
Tak bud to je ozaj rozdelene zbytocne, alebo mi unika nejake vynimocne postavenie DUTOK_EQ oproti operatorom z DUTOK_OPER_REL
- hippies
- Admin(ka) level I
- Příspěvky: 990
- Registrován: 29. 9. 2004 12:46
- Typ studia: Informatika Mgr.
- Login do SIS: procj4am
- Bydliště: Mladá Boleslav
- Kontaktovat uživatele:
Re: DUTOK_EQ a DUTOK_OPER_REL
Kvůli deklaracím typů a konstant.t2 píše:Nevie preco ma "=" extra token DUTOK_EQ a nepatri medzi tokeny zdruzene do DUTOK_OPER_REL ? Nejak neviem prist na to, preco by to malo byt osobitne, pri vyhodnocovani vyrazov tie semanticke pravidla vyzeraju uplne rovnako (az na generovanu instrukciu samozrejme).
Tak bud to je ozaj rozdelene zbytocne, alebo mi unika nejake vynimocne postavenie DUTOK_EQ oproti operatorom z DUTOK_OPER_REL
- Andrej
- Matfyz(ák|ačka) level I
- Příspěvky: 47
- Registrován: 15. 9. 2006 17:08
- Typ studia: Informatika Mgr.
- Login do SIS: podza4am
- Bydliště: Zlín
- Kontaktovat uživatele:
Jak kopírovat icblock
Ahoj, mám jednoduchý dotaz: Přišel už někdo na to, jak se dá zkopírovat icblock?
Už se to tu jednou řešilo, ale špatně. Projít icblock iterátorem a zapsat prvky do jiného není možné. Důvod je prostý: Z několika míst finálního icblocku se ukazuje na tytéž instance instrukcí a při destrukci icblocku se na ně opakovaně volá delete. Kompilátor pak krásně odletí.
Instrukce nemají žádný příhodný konstruktor, který by kopírování umožňoval, a není možné je duplikovat jednu po druhé. Vyřešil tohle už někdo? S největší pravděpodobností se lze bez kopírování bloků obejít, ale řešení pak bude (mírně řečeno) hodně ošklivé...
Už se to tu jednou řešilo, ale špatně. Projít icblock iterátorem a zapsat prvky do jiného není možné. Důvod je prostý: Z několika míst finálního icblocku se ukazuje na tytéž instance instrukcí a při destrukci icblocku se na ně opakovaně volá delete. Kompilátor pak krásně odletí.
Instrukce nemají žádný příhodný konstruktor, který by kopírování umožňoval, a není možné je duplikovat jednu po druhé. Vyřešil tohle už někdo? S největší pravděpodobností se lze bez kopírování bloků obejít, ale řešení pak bude (mírně řečeno) hodně ošklivé...
- hippies
- Admin(ka) level I
- Příspěvky: 990
- Registrován: 29. 9. 2004 12:46
- Typ studia: Informatika Mgr.
- Login do SIS: procj4am
- Bydliště: Mladá Boleslav
- Kontaktovat uživatele:
Re: Jak kopírovat icblock
A na co, že ho potřebuješ?Andrej píše:Ahoj, mám jednoduchý dotaz: Přišel už někdo na to, jak se dá zkopírovat icblock?
Už se to tu jednou řešilo, ale špatně. Projít icblock iterátorem a zapsat prvky do jiného není možné. Důvod je prostý: Z několika míst finálního icblocku se ukazuje na tytéž instance instrukcí a při destrukci icblocku se na ně opakovaně volá delete. Kompilátor pak krásně odletí.
Instrukce nemají žádný příhodný konstruktor, který by kopírování umožňoval, a není možné je duplikovat jednu po druhé. Vyřešil tohle už někdo? S největší pravděpodobností se lze bez kopírování bloků obejít, ale řešení pak bude (mírně řečeno) hodně ošklivé...
Re: Jak kopírovat icblock
kopirovani lze pouzit zde uvedenym zpusobem. z obou icblocku se vzdy vyuzije jen jeden, tudiz po jeho append&delete nezbude nic ani z toho druheho a zaroven neni duvod na ten druhy delete volat => nic nepadaAndrej píše: Už se to tu jednou řešilo, ale špatně. Projít icblock iterátorem a zapsat prvky do jiného není možné. Důvod je prostý: Z několika míst finálního icblocku se ukazuje na tytéž instance instrukcí a při destrukci icblocku se na ně opakovaně volá delete. Kompilátor pak krásně odletí.
- Andrej
- Matfyz(ák|ačka) level I
- Příspěvky: 47
- Registrován: 15. 9. 2006 17:08
- Typ studia: Informatika Mgr.
- Login do SIS: podza4am
- Bydliště: Zlín
- Kontaktovat uživatele:
Re: Jak kopírovat icblock
Zaprvé, nebyla řeč o případu, kdy se použije jen jeden ze dvou icblocků. Mluvím o případech, kdy se jeden icblock několikrát duplikuje a poté opakovaně použije.Anonymous píše:kopirovani lze pouzit zde uvedenym zpusobem. z obou icblocku se vzdy vyuzije jen jeden, tudiz po jeho append&delete nezbude nic ani z toho druheho a zaroven neni duvod na ten druhy delete volat => nic nepada
Zadruhé, na nepoužitý icblock je samozřejmě nutné zavolat delete. (Nepoužitý = nepřidaný do hlavního.) Jinak se neuvolní paměť, kterou zabírá. Není jí moc a neděláme kompilátor pro skutečné nasazení, takže si s tím asi nikdo neláme hlavu, ale je prostě dobrým zvykem nenechávat téct paměť...
Naposledy upravil(a) Andrej dne 27. 1. 2007 20:24, celkem upraveno 1 x.
- Andrej
- Matfyz(ák|ačka) level I
- Příspěvky: 47
- Registrován: 15. 9. 2006 17:08
- Typ studia: Informatika Mgr.
- Login do SIS: podza4am
- Bydliště: Zlín
- Kontaktovat uživatele:
Re: Jak kopírovat icblock
Například (mimo jiné) pro případ, kdy je řídící proměnná cyklu prvkem pole.hippies píše:A na co, že ho potřebuješ?
- 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: Jak kopírovat icblock
Je otázka, jestli tohle v Mlaskalu vůbec jde. Podle mě to z diagramů nevyplývá ( tj. lze si podle mě z diagramů odvodit, že to nelze a život je hned jednodušší )Andrej píše:Například (mimo jiné) pro případ, kdy je řídící proměnná cyklu prvkem pole.hippies píše:A na co, že ho potřebuješ?
- Andrej
- Matfyz(ák|ačka) level I
- Příspěvky: 47
- Registrován: 15. 9. 2006 17:08
- Typ studia: Informatika Mgr.
- Login do SIS: podza4am
- Bydliště: Zlín
- Kontaktovat uživatele:
Jak udělat skok vpřed
Taky mě to už napadlo. Prostě tam takovou možnost nedám a je vymalováno.Tacoud píše:Je otázka, jestli tohle v Mlaskalu vůbec jde. Podle mě to z diagramů nevyplývá ( tj. lze si podle mě z diagramů odvodit, že to nelze a život je hned jednodušší )
Teď tu mám ale jiný problém: Nevíte někdo, jak se dělá skok dopředu? Iterátory z icblocku nemají žádný operátor +, takže je člověk musí otrocky krokovat přes ++ a for-cyklus. To by ještě tolik nevadilo... Problém je, že to umožňuje jen skoky v rámci již existujících prvků aktuálního icblocku. Chci-li (například v if-then-else) skok dopředu, není možné ho realizovat, protože v momentě přidávání instrukce JF/JMP potřebná část icblocku ještě neexistuje a nelze na ni žádným způsobem vytvořit iterátor.
Posouvání iterátoru za end() samozřejmě nefunguje a vyvolá výjimku std::out_of_range. Zkoušel jsem vzít iterátor do jiného icblocku (určeného k přidání po instrukci JMP). To (pochopitelně) taktéž nefunguje, protože nic nezaručuje platnost iterátorů po spojení icblocků.
Nechápu, proč prostě není prametrem pro JMP, JT a JF nějaký int, který vyjadřuje offset. Tyhle nesmysly s iterátory jsou jen na obtíž. Jestli se někomu podařilo vytvořit skok dopředu, prosím o jakýkoliv hint.
- Andrej
- Matfyz(ák|ačka) level I
- Příspěvky: 47
- Registrován: 15. 9. 2006 17:08
- Typ studia: Informatika Mgr.
- Login do SIS: podza4am
- Bydliště: Zlín
- Kontaktovat uživatele:
Špatný posun instrukcí
Zajímalo by mě, proč tento kód nefunguje správně:
Kompilátor generuje špatný posun a icm někdy odletí, jindy ohlásí špatný stav zásobníku. Přitom na $$.icb->begin() přece není co splést! Skok vždy směřuje o několik instrukcí dál, než by měl.
Příklad kódu, na kterém to generuje špatný posun:
Assembler:
Správný target je 26, nikoliv 29.
Protože tu nikdo o podobném problému nepsal, mám za to, že všem ostatním to funguje správně. Samozřejmě mám nejnovější verzi knihoven... Netušíte někdo, jaká je skutečná sémantika těch iterátorů u icblocku a z jakého důvodu se generuje špatný offset?
Kód: Vybrat vše
| DUTOK_REPEAT command_list DUTOK_UNTIL expression
{
if ( identical_type( $4.cur_type, ctx->tab->logical_bool() ) ) {
$$.icb = $2.icb;
icblock_append_delete( $$.icb, $4.icb );
$$.icb->append_instruction( new ai::JF( $$.icb->begin() ) );
} else {
error( DUERR_TYPEMISMATCH, @4 );
$$.icb = $2.icb;
}
}
Příklad kódu, na kterém to generuje špatný posun:
Kód: Vybrat vše
program BadOffsetTest;
var i, j: integer;
begin
i := 10;
j := 0;
repeat i := i - 1 until i < j
end.
Kód: Vybrat vše
BADOFFSETTEST:
20: INITI
21: INITI
22: LDLITI LITINT[1]
23: GSTI [0]
24: LDLITI LITINT[2]
25: GSTI [1]
26: GLDI [0]
27: LDLITI LITINT[0]
28: SUBI
29: GSTI [0]
30: GLDI [0]
31: GLDI [1]
32: LTI
33: JF -4 ;; target=29
34: DTORI
35: DTORI
36: HALT
Protože tu nikdo o podobném problému nepsal, mám za to, že všem ostatním to funguje správně. Samozřejmě mám nejnovější verzi knihoven... Netušíte někdo, jaká je skutečná sémantika těch iterátorů u icblocku a z jakého důvodu se generuje špatný offset?