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 FUNCTIONSUB 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 SUBEsimerkkikoodi, 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.