DU6

Odpovědět
Uživatelský avatar
andree
Matfyz(ák|ačka) level III
Příspěvky: 106
Registrován: 9. 12. 2006 17:00
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od andree »

Anonymous píše:Uhmm, na ulitě je další update, asi už si všimli té chyby se skokama. :twisted:
cool, it worked :D
Uživatelský avatar
Kate
Matfyz(ák|ačka) level III
Příspěvky: 146
Registrován: 8. 1. 2005 10:52
Typ studia: Informatika Mgr.
Bydliště: Milada squat
Kontaktovat uživatele:

Re: testovaci soubor

Příspěvek od Kate »

tm píše:V priloze uvadim svuj testovaci soubor. Doufam, ze ho pripadne rozsirite o dalsi zaludne pripady a vratite zpet :wink:
bezvadny, diky moc, jdu vymyslet ty dalsi zaludnosti.

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.
Uživatelský avatar
Kate
Matfyz(ák|ačka) level III
Příspěvky: 146
Registrován: 8. 1. 2005 10:52
Typ studia: Informatika Mgr.
Bydliště: Milada squat
Kontaktovat uživatele:

Příspěvek od Kate »

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 :twisted:

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.
tm
Matfyz(ák|ačka) level I
Příspěvky: 4
Registrován: 13. 12. 2006 01:18

Re: testovaci soubor

Příspěvek od tm »

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)
Diky za upozorneni - tak to mam zase o jednu chybku min :lol: Podminky u cyklu v Pascalu mi vzdycky delaly problemy.. :)
Koukam, ze ted se ten muj testovaci soubor na repeatu trochu zacykli..
Uživatelský avatar
Kate
Matfyz(ák|ačka) level III
Příspěvky: 146
Registrován: 8. 1. 2005 10:52
Typ studia: Informatika Mgr.
Bydliště: Milada squat
Kontaktovat uživatele:

Příspěvek od Kate »

asi jsem uz uplne slepa, ale jakym errcodem si vynutite hlasku "Expression may not be passed by reference" ?

myslela jsem, ze na to je DUERR_NOTPARAMVAR, ale ta (pro me teda docela prekvapive) generuje "Expression may not be passed by value"
Člověk si nemusí nic myslet, aby něco udělal.
t2
Matfyz(ák|ačka) level I
Příspěvky: 49
Registrován: 22. 1. 2006 15:19

DUTOK_EQ a DUTOK_OPER_REL

Příspěvek od t2 »

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
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: DUTOK_EQ a DUTOK_OPER_REL

Příspěvek od hippies »

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
Kvůli deklaracím typů a konstant.
Uživatelský avatar
Andrej
Matfyz(ák|ačka) level I
Příspěvky: 47
Registrován: 15. 9. 2006 17:08
Typ studia: Informatika Mgr.
Bydliště: Zlín
Kontaktovat uživatele:

Jak kopírovat icblock

Příspěvek od Andrej »

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ž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: Jak kopírovat icblock

Příspěvek od hippies »

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é...
A na co, že ho potřebuješ?
Návštěvník

Re: Jak kopírovat icblock

Příspěvek od Návštěvník »

Andrej 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í.
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
Uživatelský avatar
Andrej
Matfyz(ák|ačka) level I
Příspěvky: 47
Registrován: 15. 9. 2006 17:08
Typ studia: Informatika Mgr.
Bydliště: Zlín
Kontaktovat uživatele:

Re: Jak kopírovat icblock

Příspěvek od Andrej »

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
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.

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.
Uživatelský avatar
Andrej
Matfyz(ák|ačka) level I
Příspěvky: 47
Registrován: 15. 9. 2006 17:08
Typ studia: Informatika Mgr.
Bydliště: Zlín
Kontaktovat uživatele:

Re: Jak kopírovat icblock

Příspěvek od Andrej »

hippies píše:A na co, že ho potřebuješ?
Například (mimo jiné) pro případ, kdy je řídící proměnná cyklu prvkem pole.
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: Jak kopírovat icblock

Příspěvek od Tacoud »

Andrej píše:
hippies píše:A na co, že ho potřebuješ?
Například (mimo jiné) pro případ, kdy je řídící proměnná cyklu prvkem pole.
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šší :) )
Uživatelský avatar
Andrej
Matfyz(ák|ačka) level I
Příspěvky: 47
Registrován: 15. 9. 2006 17:08
Typ studia: Informatika Mgr.
Bydliště: Zlín
Kontaktovat uživatele:

Jak udělat skok vpřed

Příspěvek od Andrej »

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šší :) )
Taky mě to už napadlo. Prostě tam takovou možnost nedám a je vymalováno.

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.
Uživatelský avatar
Andrej
Matfyz(ák|ačka) level I
Příspěvky: 47
Registrován: 15. 9. 2006 17:08
Typ studia: Informatika Mgr.
Bydliště: Zlín
Kontaktovat uživatele:

Špatný posun instrukcí

Příspěvek od Andrej »

Zajímalo by mě, proč tento kód nefunguje správně:

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;
        }
    }
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:

Kód: Vybrat vše

program BadOffsetTest;
var i, j: integer;
begin
    i := 10;
    j := 0;
    repeat i := i - 1 until i < j
end.
Assembler:

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
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?
Odpovědět

Zpět na „2006“