Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB / C++ -kääntäjä

Sivun loppuun

hunajavohveli [09.05.2004 18:23:42]

#

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

hunajavohveli [09.05.2004 18:33:35]

#

Esimerkkikoodi, jonka ohjelma osaa kääntää:

CLS

DIM a AS INTEGER
DIM jee AS STRING

PRINT "Heihei!!"
INPUT a

PRINT "Jee"

Gwaur [10.05.2004 18:36:08]

#

Entäs jos on monta komentoa samalla rivillä, kuten:

PRINT "eka printtaus": PRINT "toka printtaus"

:P

hunajavohveli [10.05.2004 18:50:43]

#

Noh... vastaus siihen on yksinkertainen:
Sitten se ei toimi. :)
Mutta valittaa tosiaan niin paljon kuin haluatte, niin parantelen kääntäjää.

Heikki [10.05.2004 20:30:36]

#

Hyvä alku, mutta ehkäpä laitoit turhan aikaisin koodivinkiksi?

Pienellä jatkokehittelyllä (lue: kymmeniä tunteja työtä) voit saada siitä jopa hyvän!

mamaze [10.05.2004 20:36:12]

#

"bad file name" ei tottavie toimi, ääh tää kopiointihomma windows-dos on täys susi kun se alkaa jakamaan näitä rivejä :(

hunajavohveli [10.05.2004 21:22:24]

#

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.

KimmoKM [10.05.2004 21:34:43]

#

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.

sooda [11.05.2004 08:56:27]

#

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ä!

tgunner [11.05.2004 13:42:57]

#

Hei tostahan tulee jotain! :D

herkko [24.06.2004 15:15:57]

#

Tee vain kunnolla loppuun, niin minun ei tarvitse opetella C++:aa =D.

hunajavohveli [13.10.2004 18:09:50]

#

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**


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta