Page 1 of 2
CB Brainfuck
Posted: Sat Jan 19, 2008 12: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 4: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 7: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 3: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 9: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 11:11 am
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 4: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 8:05 pm
by Guest
Eikö kukaan tiedä?
Re: CB Brainfuck
Posted: Thu Jan 24, 2008 8: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 4: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 11:01 am
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 8: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 10: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 12: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 3: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 6: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:
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 10: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:
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 3: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:
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 4: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 8: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ää.