Tässä on yksinkertainen ohjelma, joka kääntää QB:llä tehdyn ohjelman C++:lle. Kääntäjä on tosin vasta alkutekijöissä, eikä tämä osaa kääntää kuin käskyt: CLS, PRINT, INPUT ja DIM ja nekin puutteellisesti. Kaikki QB-ohjelman muuttujat on DIMmattava, jotta käännetystä ohjelmasta tulisi toimiva. PRINT ei osaa tulostaa kuin tekstivakioita, sisennyksiäkään ei saa olla, eli ei tällä oikeastaan tee vielä mitään, mutta antakaa ehdotuksia, niin pyrin kehittämään ja lisäilemään asioita. Jonain päivänä tästä voi jopa olla jotain hyötyä. (olisikohan tämä kääntäjä pitänyt tehdä C++:lla...?)
Muokkaa ohjelman hakemistopolkua, ja pistä siihen BAS-tiedoston hakemisto ja nimi, niin ohjelma lukee tiedot ja tulostaa näytölle saman C++:lla. Kannattaa kokeilla ainoastaan tätä tarkoitusta varten tehtyihin tiedostoihin.
DECLARE SUB DDL () DECLARE SUB Define (Vari AS STRING) DECLARE SUB Include (Lib AS STRING) DECLARE FUNCTION Port$ (rivi AS STRING) DECLARE FUNCTION Porttaa! (rivi AS STRING) COMMON SHARED InLib() AS STRING, LibIndex AS INTEGER COMMON SHARED DefVar() AS STRING, VarIndex AS INTEGER DIM NewCode(100) AS STRING DIM InLib(1 TO 100) AS STRING LibIndex = 1 DIM DefVar(1 TO 100) AS STRING VarIndex = 1 d$ = "C:\hakemisto\tiedosto.bas" 'vaihda t?h?n k??nnett?v? bas-tiedosto 'huom! pit?? olla tekstimuodossa CLS OPEN d$ FOR INPUT AS #1 WHILE NOT EOF(1) INPUT #1, a$ NewCode(i) = Port(a$) i = i + 1 WEND CLOSE #1 DDL 'Delete Duplicate Librarys FOR a = 1 TO LibIndex - 1 'Alkuun k?ytett?v?t kirjastot IF InLib(a) <> "" THEN PRINT "#include <" + InLib(a) + ">" END IF NEXT a PRINT PRINT "main()" PRINT "{" FOR a = 1 TO i 'Sitten k??nnetty koodi PRINT " "; NewCode(a) NEXT a PRINT "}"
FUNCTION Port$ (rivi AS STRING) IF rivi = "CLS" THEN Port = "ClrScr();" Include "conio.h" END IF IF LEFT$(rivi, 5) = "PRINT" THEN Port = "cout << " + CHR$(34) + MID$(rivi, 8, LEN(rivi) - 8) + "\n" + CHR$(34) + ";" Include "iostream.h" END IF IF LEFT$(rivi, 5) = "INPUT" THEN var$ = MID$(rivi, 7, LEN(rivi) - 6) Define var$ Port = "cin >> " + var$ + ";" Include "iostream.h" END IF IF LEFT$(rivi, 3) = "DIM" THEN a = 5 DO a = a + 1 LOOP UNTIL MID$(rivi, a, 1) = " " IF MID$(rivi, a + 4, 7) = "INTEGER" THEN typ$ = "int" IF MID$(rivi, a + 4, 7) = "LONG" THEN typ$ = "long" IF MID$(rivi, a + 4, 7) = "DOUBLE" THEN typ$ = "double" IF MID$(rivi, a + 4, 7) = "STRING" THEN typ$ = "char" var$ = MID$(rivi, 5, a - 5) IF typ$ = "char" THEN var$ = var$ + "[255]" Port = typ$ + " " + var$ + ";" END IF ''Ei viel? valmis FOR a = 1 TO LEN(rivi) IF MID$(rivi, a, 9) = "INPUT$(1)" THEN MID$(rivi, a, 9) = "getch();" Include "conio.h" END IF NEXT a END FUNCTION
SUB Define (Vari AS STRING) DefVar(VarIndex) = Vari VarIndex = VarIndex + 1 END SUB SUB Include (Lib AS STRING) InLib(LibIndex) = Lib LibIndex = LibIndex + 1 END SUB
SUB DDL FOR a = 1 TO LibIndex - 1 FOR b = 1 TO LibIndex - 1 IF InLib(a) = InLib(b) AND a <> b THEN InLib(b) = "" END IF NEXT b NEXT a END SUB
Esimerkkikoodi, jonka ohjelma osaa kääntää:
CLS DIM a AS INTEGER DIM jee AS STRING PRINT "Heihei!!" INPUT a PRINT "Jee"
Entäs jos on monta komentoa samalla rivillä, kuten:
PRINT "eka printtaus": PRINT "toka printtaus"
:P
Noh... vastaus siihen on yksinkertainen:
Sitten se ei toimi. :)
Mutta valittaa tosiaan niin paljon kuin haluatte, niin parantelen kääntäjää.
Hyvä alku, mutta ehkäpä laitoit turhan aikaisin koodivinkiksi?
Pienellä jatkokehittelyllä (lue: kymmeniä tunteja työtä) voit saada siitä jopa hyvän!
"bad file name" ei tottavie toimi, ääh tää kopiointihomma windows-dos on täys susi kun se alkaa jakamaan näitä rivejä :(
No joo... saattoihan tämä hieman aikaista olla. Tästä vaan sitten parantelemaan. :) Nyt vain tarvittaisiin sitä "juuri muokatut koodivinkit"-listaa, tai tätä ei kohta huomaa enää kukaan.
Heikki kirjoitti:
Hyvä alku, mutta ehkäpä laitoit turhan aikaisin koodivinkiksi?
Näidenhän kuuluu olla koodivinkkejä ei valmiita ohjelmia.
Hauska idea. Itsekkin olen joskus ajatellut tekeväni QB->C-kääntäjän, mutten ole jaksanut.
Heikki kirjoitti:
Pienellä jatkokehittelyllä (lue: kymmeniä tunteja työtä) voit saada siitä jopa hyvän!
Sitä mäkin sanon. Tässä on vielä aika vähän ominaisuuksia mutta kun teet niitä lisää niin tästä jopa tulee hyvä!
Hei tostahan tulee jotain! :D
Tee vain kunnolla loppuun, niin minun ei tarvitse opetella C++:aa =D.
Jääköhän tämä tänne olemaan, vaikka poistankin?
No poistan nyt kuitenkin, koska ei tällä mitään vielä tee, mutta teen kyllä uuden, mutta tajusin juuri, ettei mitään tekstin tulostamista tai grafiikkaa tai muuta kannata ruveta C:lle porttamaan, koska ne ovat asoita, joita voidaan tehdä niin monella tavalla, eivätkä periaatteessa ole mitenkään riippuvaisia itse kielestä, eli seuraava versio kääntää vain perusrakenteet, muuttujat, silmukat, ehtolausekkeet yms.
Edit: No jäihän se tänne tietokantoihin.
**TÄMÄ ON POISTETTU, EI KANNATA KOMMENTOIDA**
Aihe on jo aika vanha, joten et voi enää vastata siihen.