Monday, 15 March 2010
Tuo parseri on uskomaton!
Kun SHaV4 ajaa joka rivin parserin läpi, pystyn kutistamaan tulosta - avainsanan toiminnot neljästäkymmenestä rivistä yhteen. Tästä moottoriversiosta tulee optimoiduin pitkään aikaan.
Oikea parseri
Yoolin SHaV4 - määritelmä tarvitsee jälleen päivityksen :)
Sen sijaan että tulkki palauttaa getwordillä itselleen kaiken toisen ja kolmannen lainausmerkin väliltä, ja etsii siitä muuttujat ja korvaa ne, SHaV4 esittelee oman parserimoduulin. Se tarkastaa jok'ikisen sanan käsiteltävältä riviltä, olettaen että jokainen järjestysluvultaan pariton lainaus sisältää muuttujan tai arvonpalauttavan funktion. Ladattuaan muuttuja-arvot käsiteltävälle riville, se palauttaa rivin runtimen puolelle, jossa tarkistetaan onko parseroitua riviä hyödyntävä avainsana "tulosta" vai "virhe" vai mikä.
Tämä tuo mukanaan sen, että muuttujasyntaksi on seuraava: tulosta "Nimeni on "+nimi+";, ja tuossa mainittu +nimi+ on aiemmin koodissa määritelty str - muuttujaksi."
Tuossa lainauksien välissä oleva nimi siis tunnistetaan muuttujaksi. Ainoa ongelma on, että jos käyttäjä haluaa tulostaa useamman muuttujan, se pitää tehdä näin: tulosta "Sitten seuraa läjä muuttujia: "+muuttuja+""+muuttuja2+""muuttuja4+" eli muuttujien välissä on oltava tyhjät lainaukset tai parseri hämääntyy";
Koodarin ei tarvitse enää huolehtia muuttujan tyypistä tulostaessa. Tulkki päästänee läpi samannimisiä muuttujia, mutta se ei missään nimessä ole A)suositeltavaa eikä B) todellakaan järkevää. Yritän totettaa tarkastuksen muuttujan olemassaolon varalta.
Sen sijaan että tulkki palauttaa getwordillä itselleen kaiken toisen ja kolmannen lainausmerkin väliltä, ja etsii siitä muuttujat ja korvaa ne, SHaV4 esittelee oman parserimoduulin. Se tarkastaa jok'ikisen sanan käsiteltävältä riviltä, olettaen että jokainen järjestysluvultaan pariton lainaus sisältää muuttujan tai arvonpalauttavan funktion. Ladattuaan muuttuja-arvot käsiteltävälle riville, se palauttaa rivin runtimen puolelle, jossa tarkistetaan onko parseroitua riviä hyödyntävä avainsana "tulosta" vai "virhe" vai mikä.
Tämä tuo mukanaan sen, että muuttujasyntaksi on seuraava: tulosta "Nimeni on "+nimi+";, ja tuossa mainittu +nimi+ on aiemmin koodissa määritelty str - muuttujaksi."
Tuossa lainauksien välissä oleva nimi siis tunnistetaan muuttujaksi. Ainoa ongelma on, että jos käyttäjä haluaa tulostaa useamman muuttujan, se pitää tehdä näin: tulosta "Sitten seuraa läjä muuttujia: "+muuttuja+""+muuttuja2+""muuttuja4+" eli muuttujien välissä on oltava tyhjät lainaukset tai parseri hämääntyy";
Koodarin ei tarvitse enää huolehtia muuttujan tyypistä tulostaessa. Tulkki päästänee läpi samannimisiä muuttujia, mutta se ei missään nimessä ole A)suositeltavaa eikä B) todellakaan järkevää. Yritän totettaa tarkastuksen muuttujan olemassaolon varalta.
Friday, 12 March 2010
Edistystä
Koska Skriptihöskä Alpha V4:stä on jotain näytettävääkin, perustin sille mbnetyooliin projektisivun.Sivulla tosin esittelen vasta tämän aiemmin päivällä mainitsemaani latausrituaalin lopputulosta, mutta katson saavutukseksi sen että moottori osaa eriyttää funktiot, pääsorsan ja käskykooditaulun toisistaan. Seuraavaksi väännän muuttujaAPI:n tähän päivään ja keskityn Runtimen kasaamiseen.
Huomautanpa muuten tähän väliin, että Runtime olettaa selvästi että funktiomäärittelyt hoidataan lopuksi. Lienee aika päivittää ShaV4 - syntaksimääritelmä lähipäivinä.
Huomautanpa muuten tähän väliin, että Runtime olettaa selvästi että funktiomäärittelyt hoidataan lopuksi. Lienee aika päivittää ShaV4 - syntaksimääritelmä lähipäivinä.
SHaV4-funktioiden tuoma muutos
Funktiot ovat teoriassa ihan toimivia, mutta kun ennen koodi ajettiin laturin, esikäsittelijän ja "compilerin" läpi, niin SHaV4 pallottelee koodia kolmen esikäsittelyvaiheen ja ainakin kahden kääntövaiheen lävitse.
Tuesday, 9 March 2010
Skriptihöskä elää taas
Sain bussissa idean: Skriptihöskän versiossa 0.3 nähdyt puolipilkut palaavat! Joka rivin, lukuunottamatta foreja ja iffejä ja hienompia rakenteita, on päätyttävä SHaV4 - syntaksissa puolipilkkuun (;). Tuossa vanhassa versiossahan puolipilkuilla välitettiin puolipilkuilla rivien määrä. Nyt suunnittelen sellaista, että jos normaalit komennot lopetetaan puolipilkkuun, on tulkin ja tavuohjeistimen tasolla asiat PALJON paremmin. SHaV3:ssa yksittäiset rivit olivat kokoelman jäseniä, kun taas SHaV4:ssa suunnittelen että koko koodi ladattaisiin yhteen ainoaan muuttujaan. Tätä muuttujaa parseroitaisiin sitten GetWord(koodi,N,";") - funktiolla, jonka parametreissa koodi on muuttuja joka sisältää koodin, N on For - rakenteen hallitsema juokseva numero, ja viimeinen parametri määrittelee erotusmerkin.
Eli. Yksi muuttuja, josta napattaisiin Getwordillä pienempiä paloja käsiteltäväksi. Järjettömästi helpompi koodata kehittyneeksi kuin rivi/kokelman jäsen - ajattelumalli.
Ja toinen uutinen, kun viimeisissä blogiviesteissäni hehkutin että osaan käyttää tiedostoja c++-koodilla, niin pakkohan tätä oli soveltaa. Olen aloittanut Skriptihöskä++ - projektin. Kyseessä on siis ajoympäristö, joka lukee koodin, muodostaa siitä Integertaulukon josta switch() - rakenne lukee että miten toimia, ja siinä sivussa ajaa koodin. Eli käytännössä sama projekti kuin Skriptihöskä, c++:lla vain kirjoitettu.
Suunnitelma olisi että SHa++ söisi SHaV4 - syntaksia, josta kerronkin seuraavaksi.
Kun vanhemmissa versioissa pystyi vain latelemaan komentoja:
SHaV4 odottaakin seuraavanlaista koodia:
Eikä tässä vielä kaikki, tässä oli vasta näkyvin uudistus. Chen suuntautuva syntaksi tuo mukanaan myös funktiot (ainakin suunnittelutasolla). Kun jo SHaV2 esitteli muistaakseni muuttujat C:mäisesti "int muuttuja" tai "str muuttuja", niin SHaV4:n mukanaantuoma funktiomäärittely menisi jotenkin seuraavasti: "int funktio(int yks int kaks)" eli paluuarvo, funktion nimi, ja parametrit. Konepellin alla tuo loisi funktiokokoelmaan uuden jäsenen jonka koodi-kenttään sijoitettaisiin varsinainen koodi ja "kahvana" nimi-kenttä saisi funktiomäärittelyssä määritellyn nimen (yllä olevan perusteella siis "funktio")
Parametreja täytyy vielä miettiä. Yksi vaihtoehto on että teen muistipalakokoelman, josta luon joka funktiolle oman jäsenen, joka omaa osoittimen muistipalaan, johon on tallennettu asciita tai integerejä parametrin tyypistä miettien. Helpomminkin voisi tehdä, mutta pitäähän funktio - käsitteen pinoperinteitä kunnioittaa.
Ja mitäs muuta, ei kait tässä enää enempää. Perustin Yooliin (3.0) projektisivun, johon tulee vielä sisältöä (eli dokumentaatiota) kun projektit ovat julkaisukunnossa. Nauttikaa.
Eli. Yksi muuttuja, josta napattaisiin Getwordillä pienempiä paloja käsiteltäväksi. Järjettömästi helpompi koodata kehittyneeksi kuin rivi/kokelman jäsen - ajattelumalli.
Ja toinen uutinen, kun viimeisissä blogiviesteissäni hehkutin että osaan käyttää tiedostoja c++-koodilla, niin pakkohan tätä oli soveltaa. Olen aloittanut Skriptihöskä++ - projektin. Kyseessä on siis ajoympäristö, joka lukee koodin, muodostaa siitä Integertaulukon josta switch() - rakenne lukee että miten toimia, ja siinä sivussa ajaa koodin. Eli käytännössä sama projekti kuin Skriptihöskä, c++:lla vain kirjoitettu.
Suunnitelma olisi että SHa++ söisi SHaV4 - syntaksia, josta kerronkin seuraavaksi.
Kun vanhemmissa versioissa pystyi vain latelemaan komentoja:
tulosta "Hello world"
odota_painallusta
odota_painallusta
SHaV4 odottaakin seuraavanlaista koodia:
tulosta "Hello World";
odota_painallusta;
odota_painallusta;
Eikä tässä vielä kaikki, tässä oli vasta näkyvin uudistus. Chen suuntautuva syntaksi tuo mukanaan myös funktiot (ainakin suunnittelutasolla). Kun jo SHaV2 esitteli muistaakseni muuttujat C:mäisesti "int muuttuja" tai "str muuttuja", niin SHaV4:n mukanaantuoma funktiomäärittely menisi jotenkin seuraavasti: "int funktio(int yks int kaks)" eli paluuarvo, funktion nimi, ja parametrit. Konepellin alla tuo loisi funktiokokoelmaan uuden jäsenen jonka koodi-kenttään sijoitettaisiin varsinainen koodi ja "kahvana" nimi-kenttä saisi funktiomäärittelyssä määritellyn nimen (yllä olevan perusteella siis "funktio")
Parametreja täytyy vielä miettiä. Yksi vaihtoehto on että teen muistipalakokoelman, josta luon joka funktiolle oman jäsenen, joka omaa osoittimen muistipalaan, johon on tallennettu asciita tai integerejä parametrin tyypistä miettien. Helpomminkin voisi tehdä, mutta pitäähän funktio - käsitteen pinoperinteitä kunnioittaa.
Ja mitäs muuta, ei kait tässä enää enempää. Perustin Yooliin (3.0) projektisivun, johon tulee vielä sisältöä (eli dokumentaatiota) kun projektit ovat julkaisukunnossa. Nauttikaa.
Sunday, 7 March 2010
Saturday, 6 March 2010
C++ FileIO
Tässä on toimivaksi todettu demo C++:n tiedosto-ominaisuuksista:
#include
#include
#include
using namespace std;
using std::string;
using std::fstream;
int lue();
int kirjoita();
int main()
{
cout<<"Haluatko lukea tiedostosta vai kirjoittaa?\n";
cout<<"0=lukea\n1=kirjoittaa\n";
int valinta;
cin>>valinta;
switch (valinta)
{
case 0:
lue();
return 0;
case 1:
kirjoita();
return 0;
}
}
int kirjoita()
{
string line;
fstream f;
f.open("fileio.txt",ios::out | ios::in | ios::ate);
if(f.is_open())
{
getline(cin,line);
getline(cin,line);
f << line<<"\n";
}
return 0;
}
int lue()
{
string line;
fstream f;
f.open("fileio.txt");
if(f.is_open())
{
while(!f.eof())
{
getline(f,line);
cout <<
}
f.close();
}
else cout <<"Huono tiedosto :(";
system("PAUSE");
return 0;
}
#include
#include
#include
using namespace std;
using std::string;
using std::fstream;
int lue();
int kirjoita();
int main()
{
cout<<"Haluatko lukea tiedostosta vai kirjoittaa?\n";
cout<<"0=lukea\n1=kirjoittaa\n";
int valinta;
cin>>valinta;
switch (valinta)
{
case 0:
lue();
return 0;
case 1:
kirjoita();
return 0;
}
}
int kirjoita()
{
string line;
fstream f;
f.open("fileio.txt",ios::out | ios::in | ios::ate);
if(f.is_open())
{
getline(cin,line);
getline(cin,line);
f << line<<"\n";
}
return 0;
}
int lue()
{
string line;
fstream f;
f.open("fileio.txt");
if(f.is_open())
{
while(!f.eof())
{
getline(f,line);
cout <
}
f.close();
}
else cout <<"Huono tiedosto :(";
system("PAUSE");
return 0;
}
Subscribe to:
Posts (Atom)