Page 1 of 2

CB Brainfuck

Posted: Sat Jan 19, 2008 1:24 pm
by Eräs cb koodaaja
Laitan nyt joululomalla tekemäni Brainfuck kääntäjän tänne.
Jos, et tiedä mikä Brainfuck on tässä ohjelmointiputkan opas.
Kääntäjän komennot:

LATAA -> Lataa koodin muistiin. Toimii näin -> LATAA testi.txt
AJA -> Ajaa muistiin ladatun koodin
TYHJENNÄ -> Tyhjentään näytöltä tekstit.
POISTU -> Poistuu ohjelmasta

Esc lopettaa ajon.
ÄLÄ KIRJOITA KOODI-TIEDOSTOON MITÄÄN MUUTA KUIN KOODIA, KOSKA KÄÄNTÄJÄ ON VIRHEHERKKÄ.
Lataa

Re: CB Brainfuck

Posted: Sat Jan 19, 2008 5:25 pm
by Pettis
CB:lläkö toteutit kääntäjän? Kääntääkö kääntäjäsi ihan binääriksi vai tavukoodiksi? Jos tavukoodiksi, niin millä toteutit sitten itse tulkin?

Re: CB Brainfuck

Posted: Sat Jan 19, 2008 8:34 pm
by Eräs cb koodaaja
CB:llä on tehty. Ohjelma suoritetaan ihan cb-komennoilla esim. pilkku vastaa getkeytä ja piste lisää muuttujaan paikan ASCII-arvon, joka taas tulostetaan CBSDK:n RowTextillä. Julkaisen tämä jossain vaiheessa open sourseksi, joten silloin tekniikka selviää.

Re: CB Brainfuck

Posted: Sun Jan 20, 2008 4:07 am
by Pie2
Tjoo-o. Ihan kunnon BF. Vähän hankala käyttää. Pikanäppäimet tekis terää.

Päätinpä minäkin kokeilla omaani. Ethän pahastu jos julkaisen koodin täällä... :]
Koodi on kommentoitu. Näyttää myös virheilmoituksia.
EDIT: joo, tuo virhetsydeemi onkin pelkkää purkkaa.

Code: Select all

    //*****CB brainfuck*************//
    //Tehnyt: Pie2                  //
    //Nopeasti koodasin tämmössen.  //
    //Saa käyttää miten haluaa :)   //
    //////////////////////////////////

    //PERUSASETUKSET
        strict_run=1    //0 = ei olla niin ankaria väärille komennoille, voit laittaa 1 jos haluat ohittaa muistitarkastuksen
        make_error=0    //heittää erroria kun tulee virhe, ei huomaa "["
        show_unknown=1  //kun tulee tuntematon komento niin tulostuu "?"
        memo_size=255   //varattavien muistipalikoiden määrä
        console_size=255 //kuinka monta riviä "konsolissa" on
        loop_size=255   //maksimimäärä silmukoita "[" --> "]" 
    //INITIALISOIDAAN
        //MUISTI
        Dim memo(memo_size) As Byte   //muisti
        Global memo_p As integer      //muistin "pointeri"
        //KONSOLI
        Dim console(console_size) As String     //konsolin rivit
        Global console_p As integer   //konsolin "poineri" aka. millä rivillä mennään
        //KOODI
        Global code As String         //itse koodi
        Global code_len As integer    //koodin pituus
        //SILMUKAT
        Dim loop_start(loop_size) As integer //silmukan alku
        Global loop_p As integer             //silmukan "pointer"
        loop_p=-1
    //ANNETAAN ARVOT
    code="++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+."
    code_len=Len(code)-1
    For k=0 To code_len
        c$=com(k)  //haetaan komento
        SetWindow ""+k+"/"+code_len+"    "+c
        Select c
            Case "+"
                memo(memo_p)=memo(memo_p)+1    //lisätään pointerin kohdalla olevaa arvoa
            Case "-"
                memo(memo_p)=memo(memo_p)-1    //vähennetään pointerin kohdalla olevaa arvoa
            Case "."
                tex(Chr(memo(memo_p)))         //tulostetaan
                draw=1                         //optimoinnin vuoksi ruutu piirretään ainoastaan kun tulostetaan...
            Case ">"
                memo_p=memo_p+1                //liikutetaan pointeria oikealle
            Case "<"
                memo_p=memo_p-1                //liikutetaan pointeria vasemmalle
            Case ","
                tmp_timer=10                           
                tmp_blink=1
                ClearKeys()                    //jos suorituksen aikana on painettu jtn niin unohdetaan se
                Locate 0,-15    //siirretään input pois näkyvistä
                Repeat
                    //OTETAAN INPUT
                    f$=Left(Input(""),1)
                    //PIIRRETÄÄN konsoli
                    For i=0 To console_p
                        Text 0,i*15,console(i)
                    Next i
                    //PIIRRETÄÄN INPUT ja välkkyvä kursori
                    Text TextWidth(console(console_p)),console_p*15,f
                    If tmp_blink Then Text TextWidth(console(console_p)),console_p*15,"_"
                    //päivitetään välkkymistimeriä
                    tmp_timer=tmp_timer-1
                    If tmp_timer<0 Then tmp_timer=10:tmp_blink=Not tmp_blink
                   
                    DrawScreen
                Until KeyHit(28)
                Cls
                CloseInput()
                memo(memo_p)=Asc(f)  //asetetaan pointerin kohdalla olevalle muistille arvoksi juuri saatu näppäin
            Case "["
                loop_p=loop_p+1        //lisätään looppipoineria=uusi looppi
                loop_start(loop_p)=k   //laitetaan muistiin alkukohta
            Case "]"
                If loop_p=-1 Then
                    tex("E")                  //ohjelma kaatuisi koska sulkuja olisi liikaa
                    tmp_sulkuja=tmp_sulkuja+1  //lasketaan virheellisiä sulkuja
                    If make_error Then MakeError "Ylimääräinen sulku "+Chr(34)+c+Chr(34)+" kohta:"+k
                Else
                    If memo(memo_p)>0 Then
                        k=loop_start(loop_p)  //jos pointerin kohdalla oleva arvo ei ole 0 niin palataan
                    Else
                        loop_start(loop_p)=0  //...jos se taas on niin nollataan looppi muistista
                        loop_p=loop_p-1       // loopin pointeri takaisin=looppi loppui
                    EndIf
                EndIf
            Default
                If c<>" " And show_unknown Then tex("?")
                If c<>" " And make_error Then MakeError "Tuntematon komento "+Chr(34)+c+Chr(34)+" kohta:"+k
                If c<>" " Then tmp_komentoja=tmp_komentoja+1   //lasketaan komentovirheitä
        End Select
       
        If strict_run=0 Then
            //tarkistetaan muisti
            For i=0 To memo_size
                memo(i)=Max(0,Min(memo(i),255))  //maksimiarvo on 255 ja minimi 0
            Next i
            //tarkistetaan pointerit
            memo_p=Max(0,Min(memo_size,memo_p))
            console_p=Max(0,Min(console_size,console_p))
            loop_p=Max(-1,Min(loop_size,loop_p))
        EndIf
        //LOPPUVIESTI, kertoo virheet etc
        If k=code_len Then
            tex(Chr(10)):tex("======================VALMIS======================"):draw=1
            If loop_p>-1 Then tex("Sulkemattomia looppeja! ("+(loop_p+1)+")"):tex(Chr(10))
            If tmp_sulkuja>0 Then tex("Liikaa sulkuja ("+(tmp_sulkuja)+")"):tex(Chr(10))
            If tmp_komentoja>0 Then tex("Tuntemattomia komentoja ("+tmp_komentoja+")")
        EndIf
        //PIIRRETÄÄN (ainoastaan jos on juuri tulostettu jtn)
        If draw Then
            tmp_y=Max(0,console_p-19)
            For i=0 To Min(console_size,23) 'Max(0,console_p-23) To console_p
                Text 0,i*15,console(tmp_y+i)
            Next i
            DrawScreen
            draw=0
        EndIf
    Next k
    //LOPPU
    WaitKey
    End

    Function com(i)
        Return Mid(code,i+1,1)
    EndFunction

    Function tex(t$)
        While Len(console(console_p))>49
            console_p=console_p+1
        Wend
        If Asc(t)=10 Then
            console_p=console_p+1
        ElseIf Asc(t)=8 Then
            console(console_p)=Left(console(console_p),Len(console(console_p))-1)
        Else
            console(console_p)=console(console_p)+t
        EndIf
    EndFunction



Re: CB Brainfuck

Posted: Sun Jan 20, 2008 10:53 am
by Eräs cb koodaaja
Ihan toimiva tuokin on. Enkä pahastu. Virheilmoitukset eivät toimi koodissasi, kun lisäsin silmukkaan yhden merkin, niin valitti kahdestakymmenestä virheellisestä merkistä. Minulla ongelmana on, kun virheet tehdään makeerrorilla niin ohjelman joutuu avaamaan uudelleen. Siitäkin päästään kunhan saan IDE:n valmiiksi ja siihen SDK:n Api-funktioilla virheilmotukset.

Re: CB Brainfuck

Posted: Sun Jan 20, 2008 12:11 pm
by Pie2
Eräs cb koodaaja wrote:Virheilmoitukset eivät toimi koodissasi, kun lisäsin silmukkaan yhden merkin, niin valitti kahdestakymmenestä virheellisestä merkistä.
Tuo johtuu siitä että ohjelma laskee virheet realliaikaisesti. Laitoit siis merkin silmukan sisään, ja koodi yritti lukea merkkiä 20 kertaa, lisäsin tuon virhesysteemin ihan lopuksi, voisin muokata sitä vähän.

Re: CB Brainfuck

Posted: Tue Jan 22, 2008 5:42 pm
by Guest
Eräs cb koodaaja wrote:Laitan nyt joululomalla tekemäni Brainfuck kääntäjän tänne.
Jos, et tiedä mikä Brainfuck on tässä ohjelmointiputkan opas.
Kääntäjän komennot:

LATAA -> Lataa koodin muistiin. Toimii näin -> LATAA testi.txt
AJA -> Ajaa muistiin ladatun koodin
TYHJENNÄ -> Tyhjentään näytöltä tekstit.
POISTU -> Poistuu ohjelmasta

Esc lopettaa ajon.
ÄLÄ KIRJOITA KOODI-TIEDOSTOON MITÄÄN MUUTA KUIN KOODIA, KOSKA KÄÄNTÄJÄ ON VIRHEHERKKÄ.
Lataa
Miten sillä käännetään?

Re: CB Brainfuck

Posted: Thu Jan 24, 2008 9:05 pm
by Guest
Eikö kukaan tiedä?

Re: CB Brainfuck

Posted: Thu Jan 24, 2008 9:24 pm
by Eräs cb koodaaja
1. Lataa koodisi LATAA- komennolla.
2. Aja koodi kirjoittamalla AJA

Paina enteriä komennon kirjoittamisen jälkeen. ;)

Re: CB Brainfuck

Posted: Fri Jan 25, 2008 5:24 pm
by Guest
Eräs cb koodaaja wrote:1. Lataa koodisi LATAA- komennolla.
2. Aja koodi kirjoittamalla AJA

Paina enteriä komennon kirjoittamisen jälkeen. ;)
Ei se kyl ainakaan mulla käännä. Ainoastaan tulkkaa =(

Re: CB Brainfuck

Posted: Sat Jan 26, 2008 12:01 pm
by koodaaja
Guest wrote:
Eräs cb koodaaja wrote:1. Lataa koodisi LATAA- komennolla.
2. Aja koodi kirjoittamalla AJA

Paina enteriä komennon kirjoittamisen jälkeen. ;)
Ei se kyl ainakaan mulla käännä. Ainoastaan tulkkaa =(
Siis wtf, tämähän nimenomaan on tulkki eikä kääntäjä. Etkai nyt tosissasi kuvitellut, että joku saisi CB:llä tehtyä ehdan kääntäjän? ( no, onkai sekin periaatteessa mahdollista, mutta kovasti olen skeptinen )

Re: CB Brainfuck

Posted: Sat Jan 26, 2008 9:58 pm
by jabanii
koodaaja wrote:
Guest wrote:
Eräs cb koodaaja wrote:1. Lataa koodisi LATAA- komennolla.
2. Aja koodi kirjoittamalla AJA

Paina enteriä komennon kirjoittamisen jälkeen. ;)
Ei se kyl ainakaan mulla käännä. Ainoastaan tulkkaa =(
Siis wtf, tämähän nimenomaan on tulkki eikä kääntäjä. Etkai nyt tosissasi kuvitellut, että joku saisi CB:llä tehtyä ehdan kääntäjän? ( no, onkai sekin periaatteessa mahdollista, mutta kovasti olen skeptinen )
Tuosta kyllä saisi helposti tehtyä kääntäjän, mikä luo exe + data -tiedostoja. Vain exe:si kääntäminen on kyllä mahdotonta käyttäen tavukoodia. Itse joskus kauan sitten tein CB:llä ehdan kääntäjän, mikä loi exe + data -ohjelmia.

Re: CB Brainfuck

Posted: Sat Jan 26, 2008 11:59 pm
by Guest
koodaaja wrote:
Guest wrote:
Eräs cb koodaaja wrote:1. Lataa koodisi LATAA- komennolla.
2. Aja koodi kirjoittamalla AJA

Paina enteriä komennon kirjoittamisen jälkeen. ;)
Ei se kyl ainakaan mulla käännä. Ainoastaan tulkkaa =(
Siis wtf, tämähän nimenomaan on tulkki eikä kääntäjä. Etkai nyt tosissasi kuvitellut, että joku saisi CB:llä tehtyä ehdan kääntäjän? ( no, onkai sekin periaatteessa mahdollista, mutta kovasti olen skeptinen )
Mä en kuvittele vaan tiedä et CBlläkin voi tehdä kääntäjän. Sitä paitsi tuossa luki et Brainfuck kääntäjä ei tulkki.

Re: CB Brainfuck

Posted: Sun Jan 27, 2008 1:24 pm
by jannepelaa
Offtopic:
Yritin kirjoittaa yhdellä CB-ohjelmalla toisen CB-ohjelman loppuun, joka sitten lukisi sitä, mutta tuli "Executable Error(&FF-23A78DD)". Tämä varmaan johtuu siitä, että CB:kin käyttää tavukoodia, joten CB:n tulkki yritti siis varmaan ymmärtää omaa koodiani, joka ei onnistunut. Eli tuo kääntäjä-homma ei varmaan toimi. :(

Re: CB Brainfuck

Posted: Sun Jan 27, 2008 4:45 pm
by jabanii
jannepelaa wrote:Offtopic:
Yritin kirjoittaa yhdellä CB-ohjelmalla toisen CB-ohjelman loppuun, joka sitten lukisi sitä, mutta tuli "Executable Error(&FF-23A78DD)". Tämä varmaan johtuu siitä, että CB:kin käyttää tavukoodia, joten CB:n tulkki yritti siis varmaan ymmärtää omaa koodiani, joka ei onnistunut. Eli tuo kääntäjä-homma ei varmaan toimi. :(
OFFTOPIC:
En ole vielä testannut, mutta uskon CB:n käyttävän sellaista systeemiä, että 4 viimeistä tavua kertovat tavukoodin alun sijainnin. Tämä estää resurssien pistämisen, koska ne 4 tavua eivät ole enään viimeiset. Lisäksi ei kääntäjän tarvitse luoda stand-alone ohjelmia. Kääntäjä voi luoda myös exe + data ohjelmia.

Re: CB Brainfuck

Posted: Sun Jan 27, 2008 7:38 pm
by Koodiapina
Executable error on tietääkseni Coolbasicin bugi, joka tulee kun muuttujan arvoa korotetaan joissakin tilanteissa. En sitten tiedä tarkoittiko Jabanii sitä. Yhden rivin esimerkki:

Code: Select all

lol + 1
Eli tuon pistät yksinään ja käännät. Ja tämä oli siis puhdasta offtopicia, anteeksi siitä.

Re: CB Brainfuck

Posted: Mon Jan 28, 2008 11:13 am
by jannepelaa
OFFTOPIC:
jabanii wrote:OFFTOPIC:
En ole vielä testannut, mutta uskon CB:n käyttävän sellaista systeemiä, että 4 viimeistä tavua kertovat tavukoodin alun sijainnin. Tämä estää resurssien pistämisen, koska ne 4 tavua eivät ole enään viimeiset.
Sittenhän voisi tehdä tälläisen systeemin:
Joku.exe:n rakenne: |ohjelma|oma tavukoodi|oman tavukoodin aloituspiste|cb:n tavukoodi|cb:n tavukoodin aloituspiste|
Eli kirjoitettaessa oma koodi kirjoitettaisiin cb:n tavukoodin ja ohjelman väliin. Oman koodin jälkeen laitettaisiin tuo kohta, josta oma koodi alkaa. Lopuksi cb:n tavukoodin aloituspisteen paikkaa siirrettäisiin oman koodin ja oman koodin aloituspisteen verran eteenpäin.
Kuulostaa sekavalta, mutta ainahan voi yrittää. :)

EDIT:
Grandi wrote:Executable error on tietääkseni Coolbasicin bugi, joka tulee kun muuttujan arvoa korotetaan joissakin tilanteissa. En sitten tiedä tarkoittiko Jabanii sitä. Yhden rivin esimerkki:

Code: Select all

lol + 1
Eli tuon pistät yksinään ja käännät. Ja tämä oli siis puhdasta offtopicia, anteeksi siitä.
Ehkäpä cb-ohjelma näyttää tuon virheen aina, jos tulkki saa jotain outoa vastaan.

Re: CB Brainfuck

Posted: Mon Jan 28, 2008 4:57 pm
by _jabanii
jannepelaa wrote:OFFTOPIC:
jabanii wrote:OFFTOPIC:
En ole vielä testannut, mutta uskon CB:n käyttävän sellaista systeemiä, että 4 viimeistä tavua kertovat tavukoodin alun sijainnin. Tämä estää resurssien pistämisen, koska ne 4 tavua eivät ole enään viimeiset.
Sittenhän voisi tehdä tälläisen systeemin:
Joku.exe:n rakenne: |ohjelma|oma tavukoodi|oman tavukoodin aloituspiste|cb:n tavukoodi|cb:n tavukoodin aloituspiste|
Eli kirjoitettaessa oma koodi kirjoitettaisiin cb:n tavukoodin ja ohjelman väliin. Oman koodin jälkeen laitettaisiin tuo kohta, josta oma koodi alkaa. Lopuksi cb:n tavukoodin aloituspisteen paikkaa siirrettäisiin oman koodin ja oman koodin aloituspisteen verran eteenpäin.
Kuulostaa sekavalta, mutta ainahan voi yrittää. :)

EDIT:
Grandi wrote:Executable error on tietääkseni Coolbasicin bugi, joka tulee kun muuttujan arvoa korotetaan joissakin tilanteissa. En sitten tiedä tarkoittiko Jabanii sitä. Yhden rivin esimerkki:

Code: Select all

lol + 1
Eli tuon pistät yksinään ja käännät. Ja tämä oli siis puhdasta offtopicia, anteeksi siitä.
Ehkäpä cb-ohjelma näyttää tuon virheen aina, jos tulkki saa jotain outoa vastaan.
Tuo aloituspiste -systeemi on aika huono tapa mielestäni. Itse käytän GB:ssä (Gyber Basic) sellaista systeemiä, että tavukoodin alussa on kahdeksan tavua, mitkä tulkki etsii ja sen jälkeen alkaa lukemaan tavukoodia. Näin ei tule tuota CB:n erroria.

Re: CB Brainfuck

Posted: Mon Jan 28, 2008 5:09 pm
by jannepelaa
OFFTOPIC:
_jabanii wrote: Tuo aloituspiste -systeemi on aika huono tapa mielestäni. Itse käytän GB:ssä (Gyber Basic) sellaista systeemiä, että tavukoodin alussa on kahdeksan tavua, mitkä tulkki etsii ja sen jälkeen alkaa lukemaan tavukoodia. Näin ei tule tuota CB:n erroria.
Entäs jos jossakin kohtaa muualla on samat 8 tavua (voi olla aika harvassa)?

Re: CB Brainfuck

Posted: Mon Jan 28, 2008 9:00 pm
by _jabanii
jannepelaa wrote:OFFTOPIC:
_jabanii wrote: Tuo aloituspiste -systeemi on aika huono tapa mielestäni. Itse käytän GB:ssä (Gyber Basic) sellaista systeemiä, että tavukoodin alussa on kahdeksan tavua, mitkä tulkki etsii ja sen jälkeen alkaa lukemaan tavukoodia. Näin ei tule tuota CB:n erroria.
Entäs jos jossakin kohtaa muualla on samat 8 tavua (voi olla aika harvassa)?
Se mahdollisuus on todella pieni ja jos näin todella käy, niin sen huomaa jo kehittämisvaiheessa. Tällöin vain lisätään pari tavua lisää.