Cross Platform Basic

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2

Worklogs Cross Platform Basic

*dance* Funktionen *dance*

Mittwoch, 14. Juli 2010 von coolo
Hoi,
gestern und heute habe ich die Funktionen zum laufen gebracht. Diese können wie normale Funktionen verwendet werden. Das heißt sie können einen Rückgabewert haben, beliebig viele Parameter bekommen.
Doch halt! So einfach ist das mit den Parametern nicht, diese können leider noch nicht vordefiniert werden, daran arbeite ich noch (wird wohl ein bisschen schwieriger :/....).

Nebenbei habe ich noch Select - Case - Default - EndSelect implementiert. War im Prinzip kein besonders schweres unterfangen, ich bin jedoch doch froh diese nun von meiner Liste streichen zu können Smile.

Hier ist der Code:
Code: [AUSKLAPPEN]
Print("Hallo"+(2*(5+4)+(5*(8+10))))

Global HalloGlobal:Int
HalloGlobal=100

Print "Zweite Zeile"
Local Hallo:Int=40, Blub:Float=20.4 ;Es gibt Int(%),Float(#),String($),Nichts(int)
Hallo=100+5*10
Hallo=Hallo+100.0

Print "Text: "+Hallo


If 10*10
   Print "Hallo ist gleich 10"
ElseIf 10
   If 1
      Print "hallo"
   ElseIF 2
      Print "Blub"
   Else 3
      Print "Gaga"
   EndIf
   Print "In Elseif"
Else
   Print "Blub"
EndIf

While 10+2
   Print "In While - Wend"
Wend

Repeat
   Print "In Repeat Until"
   Break
Until 5-2

Select 10
   Case 5
      Print "Hallo"
   case 7
      Print "blub"
   Default
      Print "in Default"
EndSelect

For Local i:int=0 to 10
   Print "Zahl: "+i
Next

Blub(10,200)

Function Blub:Int(X:Int,Y:Int)
   Print "X: "+X+" Y: "+Y
EndFunction

XML:
<?xml version="1.0"?>
<CPB version="0.1">
  <global>
    <defvar name="halloglobal" type="int"/>
  </global>
  <function name="print" type="void" userfunc="0">
    <param name="text" type="string"/>
  </function>
  <function name="blub" type="int" userfunc="1">
    <param name="x" type="int"/>
    <param name="y" type="int"/>
    <code>
      <line number="53">
        <call name="print">
          <param>
            <stringadd>
              <left>
                <string value="X: "/>
              </left>
              <right>
                <cast from="int" to="string">
                  <var name="y"/>
                </cast>
              </right>
            </stringadd>
          </param>
        </call>
      </line>
    </code>
  </function>
  <code>
    <line number="0">
      <call name="print">
        <param>
          <stringadd>
            <left>
              <string value="Hallo"/>
            </left>
            <right>
              <cast from="int" to="string">
                <add>
                  <left>
                    <mul>
                      <left>
                        <int value="2"/>
                      </left>
                      <right>
                        <add>
                          <left>
                            <int value="5"/>
                          </left>
                          <right>
                            <int value="4"/>
                          </right>
                        </add>
                      </right>
                    </mul>
                  </left>
                  <right>
                    <mul>
                      <left>
                        <int value="5"/>
                      </left>
                      <right>
                        <add>
                          <left>
                            <int value="8"/>
                          </left>
                          <right>
                            <int value="10"/>
                          </right>
                        </add>
                      </right>
                    </mul>
                  </right>
                </add>
              </cast>
            </right>
          </stringadd>
        </param>
      </call>
    </line>
    <line number="2">
      <local>
        <defvar name="halloglobal" type="int"/>
      </local>
    </line>
    <line number="3">
      <set name="halloglobal">
        <int value="100"/>
      </set>
    </line>
    <line number="5">
      <call name="print">
        <param>
          <string value="Zweite Zeile"/>
        </param>
      </call>
    </line>
    <line number="6">
      <local>
        <defvar name="hallo" type="int"/>
        <defvar name="blub" type="float"/>
      </local>
      <set name="hallo">
        <int value="40"/>
      </set>
      <set name="blub">
        <float value="20.3999996"/>
      </set>
    </line>
    <line number="7">
      <set name="hallo">
        <add>
          <left>
            <int value="100"/>
          </left>
          <right>
            <mul>
              <left>
                <int value="5"/>
              </left>
              <right>
                <int value="10"/>
              </right>
            </mul>
          </right>
        </add>
      </set>
    </line>
    <line number="8">
      <set name="hallo">
        <cast from="float" to="int">
          <add>
            <left>
              <cast from="int" to="float">
                <var name="hallo"/>
              </cast>
            </left>
            <right>
              <float value="100.000000"/>
            </right>
          </add>
        </cast>
      </set>
    </line>
    <line number="10">
      <call name="print">
        <param>
          <stringadd>
            <left>
              <string value="Text: "/>
            </left>
            <right>
              <cast from="int" to="string">
                <var name="hallo"/>
              </cast>
            </right>
          </stringadd>
        </param>
      </call>
    </line>
    <line number="13">
      <if>
        <condition>
          <mul>
            <left>
              <int value="10"/>
            </left>
            <right>
              <int value="10"/>
            </right>
          </mul>
        </condition>
        <line number="14">
          <call name="print">
            <param>
              <string value="Hallo ist gleich 10"/>
            </param>
          </call>
        </line>
        <if>
          <condition>
            <int value="10"/>
          </condition>
          <line number="16">
            <if>
              <condition>
                <int value="1"/>
              </condition>
              <line number="17">
                <call name="print">
                  <param>
                    <string value="hallo"/>
                  </param>
                </call>
              </line>
              <if>
                <condition>
                  <int value="2"/>
                </condition>
                <line number="19">
                  <call name="print">
                    <param>
                      <string value="Blub"/>
                    </param>
                  </call>
                </line>
                <else>
                  <line number="20">
                    <int value="3"/>
                  </line>
                  <line number="21">
                    <call name="print">
                      <param>
                        <string value="Gaga"/>
                      </param>
                    </call>
                  </line>
                </else>
              </if>
            </if>
          </line>
          <line number="23">
            <call name="print">
              <param>
                <string value="In Elseif"/>
              </param>
            </call>
          </line>
          <else>
            <line number="25">
              <call name="print">
                <param>
                  <string value="Blub"/>
                </param>
              </call>
            </line>
          </else>
        </if>
      </if>
    </line>
    <line number="28">
      <while>
        <condition>
          <add>
            <left>
              <int value="10"/>
            </left>
            <right>
              <int value="2"/>
            </right>
          </add>
        </condition>
        <line number="29">
          <call name="print">
            <param>
              <string value="In While - Wend"/>
            </param>
          </call>
        </line>
      </while>
    </line>
    <line number="32">
      <repeat>
        <line number="33">
          <call name="print">
            <param>
              <string value="In Repeat Until"/>
            </param>
          </call>
        </line>
        <line number="34">
          <break/>
        </line>
        <condition>
          <sub>
            <left>
              <int value="5"/>
            </left>
            <right>
              <int value="2"/>
            </right>
          </sub>
        </condition>
      </repeat>
    </line>
    <line number="37">
      <select>
        <condition>
          <int value="10"/>
        </condition>
        <case>
          <condition>
            <int value="5"/>
          </condition>
          <line number="39">
            <call name="print">
              <param>
                <string value="Hallo"/>
              </param>
            </call>
          </line>
          <casebreak/>
        </case>
        <case>
          <condition>
            <int value="7"/>
          </condition>
          <line number="41">
            <call name="print">
              <param>
                <string value="blub"/>
              </param>
            </call>
          </line>
          <casebreak/>
        </case>
        <default>
          <line number="43">
            <call name="print">
              <param>
                <string value="in Default"/>
              </param>
            </call>
          </line>
        </default>
      </select>
    </line>
    <line number="46">
      <for>
        <forvar>
          <var name="i"/>
        </forvar>
        <start>
          <int value="0"/>
        </start>
        <to>
          <int value="10"/>
        </to>
        <step>
          <int value="1"/>
        </step>
        <line number="47">
          <call name="print">
            <param>
              <stringadd>
                <left>
                  <string value="Zahl: "/>
                </left>
                <right>
                  <cast from="int" to="string">
                    <var name="i"/>
                  </cast>
                </right>
              </stringadd>
            </param>
          </call>
        </line>
      </for>
    </line>
    <line number="50">
      <call name="blub">
        <param>
          <int value="10"/>
        </param>
        <param>
          <int value="200"/>
        </param>
      </call>
    </line>
    <line number="52"/>
  </code>
</CPB>

Sing mir das Lied der Konstrukte!

Montag, 12. Juli 2010 von coolo
Guten Abend!

Bei Cross Platform Basic hat sich nun viel geändert. Unter anderem wurden nun Fallunterscheidungen, Schleifen und neue Operatoren eingebaut. Außerdem arbeitet Jo0oker an einem C# Interface. Das Interface ist mittlerweile schon zu allen Syntax Elementen von CPB kompatibel (Variablen, Fallunterscheidungen, etc). Das bedeutet dass CPB auch auf der XBox360 läuft (sofern er XNA implementiert). Als kleinen Test hat er auch Teile der WinAPI implementiert. Ganz "nebenbei" hat er auch gleich eine IDE geschrieben.

Ich habe natürlich auch nicht geschlafen Wink. Die Hauptveränderungen sind wohl:
Fallunterscheidungen:
Code: [AUSKLAPPEN]
If 10*10
   Print "Hallo ist gleich 10"
ElseIf 10
   If 1
      Print "hallo"
   ElseIF 2
      Print "Blub"
   Else 3
      Print "Gaga"
   EndIf
   Print "In Elseif"
Else
   Print "Blub"
EndIf

Wird zu:
<?xml version="1.0"?>
<CPB version="0.1">
  <global/>
  <function name="print" type="void" userfunc="0">
    <param name="text" type="string"/>
  </function>
  <code>
    <line number="13">
      <if>
        <condition>
          <mul>
            <left>
              <int value="10"/>
            </left>
            <right>
              <int value="10"/>
            </right>
          </mul>
        </condition>
        <line number="14">
          <call name="print">
            <param>
              <string value="Hallo ist gleich 10"/>
            </param>
          </call>
        </line>
        <if>
          <condition>
            <int value="10"/>
          </condition>
          <line number="16">
            <if>
              <condition>
                <int value="1"/>
              </condition>
              <line number="17">
                <call name="print">
                  <param>
                    <string value="hallo"/>
                  </param>
                </call>
              </line>
              <if>
                <condition>
                  <int value="2"/>
                </condition>
                <line number="19">
                  <call name="print">
                    <param>
                      <string value="Blub"/>
                    </param>
                  </call>
                </line>
                <else>
                  <line number="20">
                    <int value="3"/>
                  </line>
                  <line number="21">
                    <call name="print">
                      <param>
                        <string value="Gaga"/>
                      </param>
                    </call>
                  </line>
                </else>
              </if>
            </if>
          </line>
          <line number="23">
            <call name="print">
              <param>
                <string value="In Elseif"/>
              </param>
            </call>
          </line>
          <else>
            <line number="25">
              <call name="print">
                <param>
                  <string value="Blub"/>
                </param>
              </call>
            </line>
          </else>
        </if>
      </if>
    </line>
  </code>
</CPB>


Ganz nebenbei sind nun auch Repeat - Until, While - Wend und For - Next Schleifen drinnen. Die Repeat - Forever Schleife spare ich mir (ein While true - Wend tut es genauso). Tja was gibt es dazu zu sagen?
Break, Continue gibts auch...
Code: [AUSKLAPPEN]
While 10+2
   Print "In While - Wend"
Wend

Repeat
   Print "In Repeat Until"
   Break
Until 5-2



For Local i:int=0 to 10
   Print "Zahl: "+i
Next

<CPB version="0.1">
  <global/>
  <function name="print" type="void" userfunc="0">
    <param name="text" type="string"/>
  </function>
  <code>
    <line number="12">
      <while>
        <condition>
          <add>
            <left>
              <int value="10"/>
            </left>
            <right>
              <int value="2"/>
            </right>
          </add>
        </condition>
        <line number="13">
          <call name="print">
            <param>
              <string value="In While - Wend"/>
            </param>
          </call>
        </line>
      </while>
    </line>
    <line number="16">
      <repeat>
        <line number="17">
          <call name="print">
            <param>
              <string value="In Repeat Until"/>
            </param>
          </call>
        </line>
        <line number="18">
          <break/>
        </line>
        <condition>
          <sub>
            <left>
              <int value="5"/>
            </left>
            <right>
              <int value="2"/>
            </right>
          </sub>
        </condition>
      </repeat>
    </line>
    <line number="23">
      <for>
        <forvar>
          <var name="i"/>
        </forvar>
        <start>
          <int value="0"/>
        </start>
        <to>
          <int value="10"/>
        </to>
        <step>
          <int value="1"/>
        </step>
        <line number="24">
          <call name="print">
            <param>
              <stringadd>
                <left>
                  <string value="Zahl: "/>
                </left>
                <right>
                  <cast from="int" to="string">
                    <var name="i"/>
                  </cast>
                </right>
              </stringadd>
            </param>
          </call>
        </line>
      </for>
    </line>
  </code>
</CPB>


Außerdem wurden nun die Operatoren: <>,==,<=,>= implementiert.

Tja als nächstes kommen wohl die Funktionen dran. Also die vom Programmierer definierten Funktionen.

Variablen!!

Sonntag, 11. Juli 2010 von coolo
Hallo,
nun gestern war ich recht produktiv. Eines der Hauptfeatures welches nun eingebaut ist, sind Variablen. Diese können im Gegensatz zu BlitzMax nur drei Datentypen: Integer, Float und String. Wieso habe ich mich nur für diese Datentypen entschieden? Weil auf sehr vielen ARM Prozessor basierten Geräten eine FPU fehlt, welche für die Gleitkommaberechnung zuständig ist. Wodurch zahlen wie Double sehr langsam sind. Außerdem braucht man für die Spieleentwicklung nur diese 3 Datentypen.

Nebenbei (also quasi ein Nebenprodukt) habe ich nun eine statische Typisierung implementiert. Doch, halt? Wie funktionieren dann Dinge wie :Local IntVar:Int="Hallo Welt"? Ganz einfach. Der String "Hallo Welt" wird intern in eine zahl gecastet. Es gibt eine Warnung, aber es ist nicht explizit untersagt.

Code: [AUSKLAPPEN]
Global HalloGlobal:Int
HalloGlobal=100


Local Hallo:Int=40, Blub:Float=20.4 ;Es gibt Int(%),Float(#),String($),Nichts(int)
Hallo=100+5*10
Hallo=Hallo+100.0

Print "Text: "+Hallo


Dieser Code wird in folgende XML Datei kompiliert:
Code: [AUSKLAPPEN]
<?xml version="1.0"?>
<CPB version="0.1">
  <global>
    <defvar name="halloglobal" type="int"/>
  </global>
  <function name="print" type="void" userfunc="0">
    <param name="text" type="string"/>
  </function>
  <code>
    <line number="2"/>
    <line number="3">
      <set name="halloglobal">
        <int value="100"/>
      </set>
    </line>
    <line number="6">
      <local>
        <defvar name="hallo" type="int"/>
        <defvar name="blub" type="float"/>
      </local>
      <set name="hallo">
        <int value="40"/>
      </set>
      <set name="blub">
        <float value="20.3999996"/>
      </set>
    </line>
    <line number="7">
      <set name="hallo">
        <add>
          <left>
            <int value="100"/>
          </left>
          <right>
            <mul>
              <left>
                <int value="5"/>
              </left>
              <right>
                <int value="10"/>
              </right>
            </mul>
          </right>
        </add>
      </set>
    </line>
    <line number="8">
      <set name="hallo">
        <cast from="float" to="int">
          <add>
            <left>
              <cast from="int" to="float">
                <var name="hallo"/>
              </cast>
            </left>
            <right>
              <float value="100.000000"/>
            </right>
          </add>
        </cast>
      </set>
    </line>
    <line number="10">
      <call name="print">
        <param>
          <stringadd>
            <left>
              <string value="Text: "/>
            </left>
            <right>
              <cast from="int" to="string">
                <var name="hallo"/>
              </cast>
            </right>
          </stringadd>
        </param>
      </call>
    </line>
  </code>
</CPB>

Tokenizetime: 1
Analysetime: 0
Parsetime: 36
Generatetime: 0
Total: 37


Wie man sieht braucht der Compiler im Moment 37ms um diese Datei zu parsen usw.

Versuch 2.0

Samstag, 10. Juli 2010 von coolo
Hey,

vielleicht errinnert sich der ein oder andere an meinen Versuch ein BASIC zu schreiben, welches auf verschiedenen Konsolen läuft? Nunja damals hatte ich arge Probleme mit dem Compiler (der hatte sehr komische Fehler) weswegen ich es erstmal links liegen habe lassen.

Doch nun habe ich alles neu geschrieben und konzeptioniert. Was das heißt werdet ihr später erfahren. Erstmal, vorweg. Das Grundkonzept ist dasselbe (viele Platformen und vorallem exotische Platformen). Doch dieses mal sind es viieel mehr Platformen (Ja nun sind es nicht nur mehr Konsolen). Sehr wichtig ist mir ausserdem die Möglichkeit (beim Einhalten diverser Regeln) denselben Code auf *fast* allen Platformen ausführen zu lassen.
Die Syntax ist diesmal an BB angelehnt, allerdings mit einigen Elementen aus BlitzMax. Es wird mit ziemlich hoher Wahrscheinlichkeit keine Objekt Orientierte Programmierung geben.

Wie viele und welche Platformen werden unterstützt?
Nunja wünschenswert sind 12 Platformen. Also diese Anzahl wird im Idealfall implementiert sein. Doch welche werden das sein?
* Windows: War ja klar oder?
* Linux: Wird jetzt nicht sooo das Problem sein
* Mac OS X: Ist mir persönlich sehr wichtig
* Pandora: Kennen die wenigsten, ist ein sehr leistungsstarker Handheld der ein komplettes Linux System beinhaltet: http://www.open-pandora.org/. Wird unterstützt sobald ich die entsprechende Hardware mein eigen nenne
* GP2X Wiz: Ein auf Linux basierender Handheld mit Touchscreen. Habe ich gestern bestellt.
* Nintendo Wii/Gamecube (sind ja beide diesselbe Hardware): Mit dem Homebrew Channel kann man auch nicht zertifzierte Programme von Big N starten lassen - SDL

So diese Platformen werden mit ziemlicher Sicherheit unterstützt werden (bis Version 1.0).
Folgende Platformen werden wahrscheinlich auch eingebaut werden, hierbei gibt es allerdings noch keine Tests meinerseits:
* Nintendo DS: Mit Flashkarten hat man ein volles SDL System zur Hand, die Homepage von PALib (Die 2D Lib welche ich vor hatte zu verwenden) ist seit geraumer Zeit offline - keine Ahnung weswegen, ausserdem gibt es bald den Nachfolger Nintendo3DS
* Handys: Leider eine sehr schwache Hardware, ausserdem ist die J2ME sehr ungenau von manchen Herstellern implementiert
* Browser: In Verbindung mit einem Java Applet. Hierbei gibt es noch keine Tests meinerseits
* iPhone/iPod Touch: Keine Tests meinerseits, ausserdem gibt es Lizenzprobleme
* Android: Ich besitze kein Telefon mit Android als Betriebssystem
* Sony PSP: Ich besitze auch keine PSP

Wie wird das erreicht?
Nunja ursprünglich war ConsoleBASIC gedacht um auf div. Konsolen lauffähig zu sein. Auf diesen Geräten gibt es nur C/C++ Compiler für. Aber da nun auch andere Geräte unterstützt werden sollen werden nun auch andere Sprachen unterstützt.
* C: Ist ja klar dass das die Haupt Sprache ist in welche kompiliert wird
* Java: Um im Browser, Handy und Android lauffähig zu sein
* Lua: Um auf der Sony PSP lauffähig zu sein (ich weiß es gibt auch C Compiler für, aber mit Lua scheint es leichter zu sein) und damit es als Skriptsprache verwenbar ist.

Um in soviele mögliche Sprachen kompilieren zu können braucht man ein effektives Zwischenformat. Hierbei ist meine Wahl auf XML gefallen. Dieses ist perfekt um einen ordentlichen Syntax Baum darzustellen und ist für den Menschen noch einigermaßen lesbar.

Der Kompilerprozess
* Der gesamte Code wird durchgegangen und in sogenannte Token zerteilt außerdem (um einen weiteren Durchgang zu ersparen) werden alle Includes eingefügt (=Tokenizer/Lexer). (erledigt)
* Alle Tokens werden wiederum durchgegangen, hierbei werden nun Funktionen, Globale Variablen und Types heraussondiert und zwischengespeichert (Analyser) (erledigt, außer Types)
* Nun wird der Syntaxbaum erzeugt. Hierbei wird XML zur Datenspeicherung verwendet. Dabei verwende ich einen Rekursiven TopDown Parser. (hierbei arbeite ich gerade)
* Nun werden alle Import's eingefügt
* Aus diesem XML Code kann dann wahlweise C, Java oder Lua Code erzeugt werden.

Wie man sieht ist es ein 4 pass Compiler.

Was kann der Compiler bisher?
Nicht viel, da ich erst seit drei Tagen daran werkle. Aber der Matheparser und Funktionsparser arbeiten bereits rudimentär, aus:
Code: [AUSKLAPPEN]
Print "Hallo"+(2*(5+4)+(5*(8+10)))

wird:
Code: [AUSKLAPPEN]
<?xml version="1.0"?>
<CPB version="0.1">
  <global/>
  <function name="print" type="int" userfunc="0"/>
  <code>
    <line number="0"/>
    <call name="print">
      <param>
        <add>
          <left>
            <add>
              <left>
                <mul>
                  <left>
                    <add>
                      <left>
                        <int value="10"/>
                      </left>
                      <right>
                        <int value="8"/>
                      </right>
                    </add>
                  </left>
                  <right>
                    <int value="5"/>
                  </right>
                </mul>
              </left>
              <right>
                <mul>
                  <left>
                    <add>
                      <left>
                        <int value="4"/>
                      </left>
                      <right>
                        <int value="5"/>
                      </right>
                    </add>
                  </left>
                  <right>
                    <int value="2"/>
                  </right>
                </mul>
              </right>
            </add>
          </left>
          <right>
            <string value="Hallo"/>
          </right>
        </add>
      </param>
    </call>
  </code>
</CPB>


Wie es mit dem Modulsystem, der Sprache und der IDE aussieht werde ich beim nächsten mal Erläutern.

PS: Für die Admins, der Compiler ist in BlitzMax geschrieben.

Ich hasse es...

Mittwoch, 4. November 2009 von coolo
Ihr kennt es doch auch?

Ihr arbeitet an eurem Projekt und im halbschlaf verändert/löscht ihr eine sehr wichtige Code Zeile und geht danach schlafen. Am nächsten Tag, wundert ihr euch warum das alles nicht mehr funktioniert...
..nun ja genau das ist mir heute passiert, rein gar nichts mehr funktioniert (lauter Fehler, kein Token wird mehr erkannt, und falls doch wird er einfach als "Fehlerhaft" bezeichnet...)

Außerdem habe ich der Syntax Überprüfung ein wenig mehr Aufmerksamkeit gewidmet. Ich werde wohl die Syntaktischen Fehler mit RegEx Termen überprüfen und anhand dieser dann entscheiden was weiter gemacht werden soll (leider gibts keinen EBNF Parser für BlitzMax Sad )

Die restlichen Fehler (falsche Parametertypen, ...) werden dem C Compiler entdeckt und dann dem ConsoleBASIC Compiler übergeben. Dieser verwertet sie und gibt sie aus.
Ich denke, dass das die sinnvollste und am leichtesten umsetzbare Möglichkeit ist...
Falls jemand bessere/schlechtere Vorschläge hat, ich würde sie sehr gerne hören Smile.

Weiter gehts!

Dienstag, 27. Oktober 2009 von coolo
Hallo,

da ich im Moment noch ein zweites Projekt am laufen habe, kommen nun etwas seltener Updates, aber das Projekt lebt DEFINITIV noch. Also keine Angst Wink.

Nunja, was habe ich in den letzten Tagen so gemacht?

Hauptsächlich wollte ich das Fehlermeldungssystem implementieren. Was ist das? Es sollte die Syntaxfehler und Analyse Fehler (falsche Parameter, ungültige Operatoren Verwenden) erkennen und ausgeben. Doch leider habe ich genau GAR keinen Plan wie man das implementiert. Natürlich könnte ich 1000e If Abfragen reintun, um wirklich jeden Fall abzudecken, doch das kanns doch nicht sein? Ich werd' da wohl noch ein wenig recherchieren müssen. Vllt. werde ich die gesamte Grammatik in einem RegEx Term wiederspiegeln, wenn mir nichts Besseres einfällt Sad.

Und was habe ich noch gemacht? Hauptsächlich habe ich den PArser zerschossen... Er erzeugt keinen lauffähigen C Code mehr, irgendwo hab ich eine Konstante geändert, die die Keywords verwaltet... Diesen Fehler muss ich noch suchen, da er essentiell ist.

Bis dann, euer Coolo Wink

String String STRINGS

Sonntag, 18. Oktober 2009 von coolo
Hallo,

heute habe ich mich mit zwei Dingen beschäftigt, welche essentiell für ConsoleBASIC sind.

Strings
Zum einen wurden Strings halbwegs eingebaut (das heißt sehr verbuggt und noch nahezu unbrauchbar). Aber warum war es denn so ein Problem die einzubauen? Naja das Hauptproblem war ja, das sobald der Tokenizer fertig war, konnten keine Tokens mehr hinzugefügt werden, warum das so war? Naja ganz einfach, ich hatte die Tokens in einem 2 Dimensionalem Array gespeichert, und doe Folge war, dass ich es nicht redimensionieren konnte. Das heißt: Mir blieben nur zwei Möglichkeiten:

1. Einen mega Workaround, da hätte ich einen PrePreParser implementieren müssen, wo VOR dem Tokenizer der Stringverbindungsoperator (&) erkannt wird, und dann mit einem Stringfunktionen Massaker der String richtig gestellt wird.

2. ODER das System komplett umkrempeln und auf LinkedLists in Verbindung mit Types setzen. Das hatte natürlich viele Vorteile war halt nur mehr arbeit. Ich habe mich für diese Variante entschieden, da sie mir auch sonst mehr Freiheiten gab.

Strings in Action:
Code: [AUSKLAPPEN]
LOCAL Var:INT
LOCAL VarFloat:FLOAT
Var=100*20+90-80
VarFLOAT=100.9

PRINT ("Hallo Welt " & Var & " Hallo? " & VarFLOAT & " Funktion: " & Rechne())

FUNCTION rechne:INT
   
   RETURN 10
ENDFUNCTION


Was muss noch entfixt werden? Funktionen dürfen nur INT als Rückgabewert haben, während sie in Funktionen aufgerufen werden, Funktionen dürfen selber keine Strings als Parameter enthalten, uvm.

Operatoren:

Alle für die Spieleprogrammierung relevanten Operatoren sind nun implementiert, sowie ein flexibles Operatoren System welches mir erlaubt mit 3 Zeilen Code einen neuen Operator hinzuzufügen.
Folgende Operatoren sind implementiert:
Code: [AUSKLAPPEN]
+,-,*,/,(,),++,--,",",=,AND,NOT,OR,<,>,<=,>=,<>,XOR,>>,<<


Bis dann
euer Coolo

Inline C!

Samstag, 17. Oktober 2009 von coolo
Hallo,

heute habe ich ein sehr nützliches Feature eingebaut. Es nennt sich "Inline C". Was heißt das? Nunja, im Grunde genommen heißt das nur dass man C Code innerhalb vom BASIC Code schreiben kann. Doch wenn man ein wenig weiter denkt, erscheinen ungeahnte Möglichkeiten! Von Inline Assembler bis hin zu jeder erdenktlichen Lib, kann man alles machen. Ich finde dieses Feature sehr praktisch Smile

Außerdem schreibe ich gerade die IDE neu, da die B+ IDE sehr verbuggt war und auch nicht Plattformunabhängig. Ich verwende (leider) die MaxGUI (Bin zu dumm für wxMax). Somit halte ich mir die Option das ganze doch Plattformunabhängig zu machen offen. Im Moment ists Windows Only, es wäre aber eine Leichtigkeit das ganze auch für Linux/MacOS X zu veröffentlichen.

Tja was gibts noch zu sagen? Die Strings machen immer noch nicht das, was ich will das sie machen. Aber das wird schon.

Das implementieren der Grafik Engine kommt erst dann wenn die Syntax 100% implementiert und (nahezu) bugfrei läuft (wurde schon mehrmals gefragt wann die Grafik Engine implementiert wird, der HalloWelt Test war nur da um zu sehen obs auch wirklich so funkt wie ichs haben möchte).

Hier ist das InlineC Code Beispiel:
Code: [AUSKLAPPEN]
STARTC
   printf("Hallo");
ENDC
PRINT "Hallo in BASIC"

Arrays und Strings

Donnerstag, 15. Oktober 2009 von coolo
Hallo,

Gestern und heute habe ich mich mit den mehrdimensionalen Arrays beschäftigt. Ich kann sagen, sie funktionieren wunderbar und man kann sie sogar als Parameter an Funktionen übergeben. Ich hätte nicht gedacht dass das so "einfach" geht.

Außerdem arbeite ich noch an den Strings. Diese bereiten mir richtige Kopfschmerzen, da chars in C recht primitiv sind Sad. Das heißt es sind üble Hacks erforderlich um dieses Feature zu implementieren. Dabei wäre es so einfach wenn ich C++ verwenden würde, da gäbe es schönes Operator überladen. Aber ich bleibe bei C, da die Libs in C sind und es einfach schneller ist, und somit es am NintendoDS viel schneller läuft.

Mhmm und jetzt erzähle ich über den Compilierablauf:

Als erstes werden Tokens erstellt. diesen habe ich komplett aus ThunderScript übernommen. Das heißt aus:
Code: [AUSKLAPPEN]
PRINT("HALLO WELT")

wird:
Code: [AUSKLAPPEN]
TOKEN: PRINT
TOKEN: (
TOKEN: "HALLO WELT"
TOKEN: )

Danach kommt der Analyser der wurde teils verändert:
Code: [AUSKLAPPEN]
COMMAND: PRINT
OPERATOR: (
STRING: "HALLO WELT"
OPERATOR: )

Nun wird der Syntaxbaum erstellt (den habe ich stark verändert, da die Punkt vor Strich implementierung unnötig war):
Code: [AUSKLAPPEN]

-PRINT
(
-----"HALLO WELT"
-)

(Weiß nicht wir ich es richtig dartellen soll Sad )
Daraus wird dann C Code erstellt:
Code: [AUSKLAPPEN]
printf("Hallo Welt");


Dies klingt vllt. etwas kompliziert, ist aber im Grunde genommen recht simpel.

Spieleprogrammierung für Konsolen leicht gemacht!

Dienstag, 13. Oktober 2009 von coolo
Hallo,
seit einiger Zeit versuche ich mein gesammeltes Wissen von Simple Script 2 und ThunderScript in ein völlig neues Projekt zu investieren. Doch was versuche ich da zu erreichen?

Vor langer Zeit, ca. ein halbes Jahr her, wollte ich mich mit der Spieleentwicklung für den NintendoDS beschäftigen. Gesagt getan, erster Pong Klon geschrieben, weiter programmiert, doch auf die Dauer fand ich C extrem nervig und hab mir schon so kleinere gedanken gemacht wie so ein Compiler aussehen würde (Ich war gerade in der Entwicklung von SimpleScript2). Also hab ich mir so kleine Konzepte gemacht und es wie ein Puzzle zusammengefügt. Doch dann verblass der Gedanke, ich hatte andere Dinge zutun (die OOP Unterstützung von SS2 schrieb sich ja nicht von allein).

Doch jetzt vor 3 Wochen hat mich das Fieber wieder gepackt, und hab sofort begonnen zu Programmieren. Das Grundgerüst konnte ich ja glücklicherweise vom ThunderScript Compiler übernehmen (SyntaxBaum, AST,...) und hatte nach kurzer Zeit den ersten lauffähig C Code zur Hand. Nach einigen Tagen wurde es erweitert und verbessert. Jetzt vor ein paar Stunden habe ich auch die erste lauffähige NintendoDS ROM auf meinem NintendoDS gestartet und ein wunderhübsches "Hallo Welt" zu Gesicht bekommen Smile, dies war ein tolles Gefühl.

Also wieder zurück auf den Boden, welche Zielplattformen wird es geben?
    Windows PC

    Nintendo DS

    Nintendo Wii

    Nintendo GameCube

    vllt. Nintendo GameBoy Advance (wenn mich die Motivation nicht in Stich lässt)


Wie wird diese Plattformunabhängigkeit erreicht?
Dadurch das C verwendet wird, kann ich den gcc verwenden und somit vollkommen Plattformunabhängig bleiben (Fast jede Plattform besitzt mittlerweile einen C Compiler).

Was funktioniert bereits?
Also im Grunde genommen schon genug um ein Spiel damit zu Programmieren (von den Konstrukten her):
If Abfragen: 100%
Select Case: 100%
Variablen: 100% (Sowohl Local/global/Static/Const)
For Schleife: 100%
While - Wend Schleife: 100%
Repeat - Until Schleife: 100%
Goto: 100%
Subs: 100%
Funktionen mit Rückgabewert und Parameter:100%
Funktionsreferenzen: 100%
Mehrdimensionale Arrays: 90% (müssen noch entbuggt werden)
Types:60% (Brauchen noch eine renovierung, da die Syntax nicht das Gelbe vom Ei ist) Wird auch irgendwann mal OOP sein
Strings: 50% (Da fehlen noch die BASIC Like String Verknüpfungen)

Todo:
    Alle Opeatoren implementieren

    OOP weiter ausbauen (Wird am Ende trotzdem recht simpel bleiben)

    Strings

    Libs und Plattformen implementieren

    Syntax Fehler ausfindig machen und Ausgeben


Tja was gibts noch zu sagen?
Ja ne Beta mit einer IDE folgt bald (Habe die von SimpleScript2 genommen)

Und folgender Code wird schon richtig Kompilert:

Code: [AUSKLAPPEN]
//NDSBasic
//Variablen Test
LOCAL MeineInt:INT=100
LOCAL MeineFloat:FLOAT=100.5
GLOBAL GlobalVar:INT=100
LOCAL I:INT=0

//Geht auch ohne Klammern
PRINT "HALLO WELT\n"

//FOR Schleife
FOR i=0 to 5
   Print("Hallo Welt %d\n",I)
NEXT
i=0
//WHILE Schleife
WHILE i<5
   i++
   LOCAL Var:INT=i*i
   PRINT("Ich bin dumm %d\n",Var)
WEND
i=0
//REPEAT Schleife
REPEAT
   i++
   PRINT("Hallo Welt %d\n",i)
   IF i>20
      EXIT
   ENDIF
UNTIL i>100

//IF Abfragen
IF 1=0
   Print ("Eins ist Null!\n")
ELSEIF 1=1
   IF 4=5
      Print("4==5\n")
   ELSEIF 8=10
      PRINT("ouhdf")
   ELSE
      Print("Eins ist Eins\n")
   ENDIF
ELSE
   Print("Eins ist nicht Null!\n")
ENDIF

//SELECT CASE
SELECT 5
   CASE 1
      PRINT("1\n")
   CASE 3
      PRINT("3\n")
   CASE 5
      PRINT("In Case ist 5\n")
ENDSELECT

//String Test
GLOBAL Text:STRING
Text="Hallo Welt in String\n"
PRINT(Text)
//GOTO Test
GOTO label1
PRINT("ICH WERDE NIE ANGEZEIGT!!!")
LABEL label1

TYPE TType
   FIELD X:INT
   FIELD Y:INT
   FIELD Z:INT
   METHOD GetPosition

   FUNCTION GetPosition
      PRINT "POSITION!!!"
   ENDFUNCTIOn
ENDTYPE

LOCAL TT:TTYPE
NEW TTYPE TT //Nur benötigt wenn es als Klasse verwendet wird (um den Konstruktor aufzurufen)


TT->X=20
PRINT("%d\n",TT.X)

TT->GetPosition()
 :shock:


DIM MeinArray:INT[10][10]

MeinArray[5][6]=100
PRINT "Array Inhalt: %d",MeinArray[5][6]

//Sub
GOSUB Sub1

//Funktion
PRINT "Rueckgabe: %d.\n",Func1(100,19)

//RefTest
RefTest(Func1)

SUB Sub1
   PRINT("Ich bin eine Subfunktion!\n")
   LOCAL VarTest:INT=100
   PRINT("Variablen Test: %d\n",VarTest)
   PRINT(Text)
ENDSUB

FUNCTION Func1:INT (MeineVar:INT, Hallo:INT)
   PRINT("In Funktion %d\n",MeineVar)
   
   RETURN Hallo
ENDFUNCTION

FUNCTION RefTest (MeineRef:REF_Func1)
   MeineRef(510,40)
ENDFUNCTION


Wird zu zugegeben hässlichen C Code:
Code: [AUSKLAPPEN]
#include <stdio.h>
#include <string.h>
int GLOBALVAR=100;

const char * TEXT;

void GETPOSITION ();
typedef void(*REF_GETPOSITION) ();
void  SUB1
 ();
typedef void(*REF_SUB
 ) ();
int FUNC1 (int MEINEVAR, int HALLO);
typedef int(*REF_FUNC1) (int MEINEVAR, int HALLO);
void REFTEST (REF_FUNC1 MEINEREF);
typedef void(*REF_REFTEST) (REF_FUNC1 MEINEREF);
int main(void) {
int MEINEINT=100;

float MEINEFLOAT=100.5;

;

int I=0;

printf ("HALLO WELT\n");
for (I=0;
 I<=5;
 I++) {printf("Hallo Welt %d\n",I);

};

I=0;

while (I<5) {I++;

int VAR=I*I;

printf("Ich bin dumm %d\n",VAR);

};

I=0;

do {;

I++;

printf("Hallo Welt %d\n",I);


if (I>20) {break;
;

}
} while (!(I>100));

if (1==0) {printf("Eins ist Null!\n");


}else{ if (1==1) {
if (4==5) {printf("4==5\n");


}else{ if (8==10) {printf("ouhdf");

}else{;

printf("Eins ist Eins\n");

}
}
}else{;

printf("Eins ist nicht Null!\n");

}
}
switch (5) {break;
 case 1:1;

printf("1\n");

break;
 case 3:3;

printf("3\n");

break;
 case 5:5;

printf("In Case ist 5\n");

};

;

TEXT="Hallo Welt in String\n";

printf(TEXT);

goto LABEL1;

printf("ICH WERDE NIE ANGEZEIGT!!!");

LABEL1:;


typedef struct STRUCT_TTYPE {int X;

int Y;

int Z;

REF_GETPOSITION GETPOSITION;
} TTYPE;
void NEW_TTYPE ( TTYPE *createstruct ) {createstruct->GETPOSITION= GETPOSITION;
;
}TTYPE TT;

NEW_TTYPE(&TT);
TT.X=20;

printf("%d\n",TT.X);

TT.GETPOSITION();

int MEINARRAY[10][10];

MEINARRAY[5][6]=100;

printf ("Array Inhalt: %d",MEINARRAY[5][6]);
SUB1();
printf ("Rueckgabe: %d.\n",FUNC1(100,19));
REFTEST(FUNC1);

return 0; }
void GETPOSITION () {
printf ("POSITION!!!");
}
void SUB1() {printf("Ich bin eine Subfunktion!\n");

int VARTEST=100;

printf("Variablen Test: %d\n",VARTEST);

printf(TEXT);

};

int FUNC1 (int MEINEVAR, int HALLO) {
printf("In Funktion %d\n",MEINEVAR);

return (HALLO);
}
void REFTEST (REF_FUNC1 MEINEREF) {
MEINEREF(510,40);

}




Wär nett wenn ihr eure Meinung in den Kommentaren ablässt Smile.

Gehe zu Seite Zurück  1, 2