(C++) Eigene kleine Skriptsprache schreiben



  • Abend Leute

    Ich hab mal wieder eine Frage, dieses mal ist es was bissl komplexeres(nach meiner meinung;-) )
    Es geht um eine eigene Skript-Sprache. Ihr wisst ja was ich meine.
    Aber ich hab wirklich Null-Ahnung wie ich das anstellen soll.
    Wäre super wenn ihr mir ein Tut dafür postet. Oder gebt euer Wissen an mich weiter;-)
    Wäre wirklich sehr nett. Vielleicht auch noch ein Beispiel.
    Hier hab ich mal ein Beispiel von einem Skript:

    NewWindow("Hallo Welt!! Das ist mein erstes Fenster")
    Wait(2,SECONDS)
    Write("Testmessage")

    Dieses Skript soll zum Beispiel ein neues Fenster öffnen und die Titelleiste "Hallo Welt!! Das ist mein erstes Fenster" benennen.
    Dann wartet es zwei Sekunden.
    Anschließend wird in das Fenster "Test" geschrieben.

    So stell ich mir das ungefähr vor.

    Suche um dazu auch nen Editor zu schreiben ein Tutorial zu Syntaxhighlighting.
    Oder eine Erklärung dazu.

    Thx

    N
    M



  • in der windows konsole geht sowas nur mit winapi

    wie man eine neue konsole erstellt weiß ich nicht.
    <windows.h> inkludieren
    titel der konsole ändern : SetConsoleTitle("Titel");
    2 Sekunden warten: Sleep(2000);
    Ausgabe in der Konsole: normal mit printf oder cout. bzw auch mit Winapi mit WriteFile() (oder so ähnlich)

    einfach in der msdn nachgucken. oder im winapi forum fragen.



  • Neue Konsole erstellen, geht nur wenn der derzeitige Prozess keine Konsole hat - oder man macht einfach einen neuen Prozess. Konsole bekommt man dann mit AllocConsole(). Braucht man sie nicht mehr: FreeConsole().

    Soll diese Skript-Sprache eigentlich wie C++ funktionieren, oder ist sie eine komplett eigene Sprache für die Win32-Konsole?

    Wenn sie nämlich nur Funktionen für C++ enthält, wär die Sache weitaus einfacher ;).

    Aber sowas willst du wahrscheinlich nicht...

    Wo genau soll denn eigentlich der Sinn dieser Skript-Sprache liegen?

    MfG SideWinder



  • Ich würde gerne einen editor machen mit dem man seine eigenen kleinen Spiele machen kann, einfach nur zur übung halber.
    Da soll es dann Funktionen wie "SetStartPosition(x,y)", "GoMap(map)" und solch kleine dinge geben, die skripte sprache soll normale c++ funktionen aufrufen.
    Bei SetStartPosition(x,y) soll zum Beispiel ein Sprite an die geünschte stelle gesetzt werden.
    Allerdings muss dann erkannt werden was zu tun ist.
    Also Sprite an x, y setzen.

    So ähnlich soll das ganze aussehen: http://forum.gamesweb.com/forums/showthread.php?s=&threadid=163628&perpage=40&pagenu mber=1

    Ich bin schon am verzweifelln , und hab im inet nix darüber gefunden, hab sowas aber schon sehr oft gesehen, deshalb würde ich gerne wissen wie sowas funktioniert.

    [ Dieser Beitrag wurde am 25.08.2002 um 19:03 Uhr von Nitromaus editiert. ]



  • <sorry ausversehen auf zitieren geklickt> 😕

    [ Dieser Beitrag wurde am 25.08.2002 um 19:03 Uhr von Nitromaus editiert. ]



  • Tja, wie du siehst brauchst du erstmal eine Engine, falls deine Spiele nicht auf Ascii-Basis ablaufen sollen. Dann baust du eben viele viele Funktionen die der User dann aufrufen kann (manche, die aufgerufen werden müssen, sind besser als Teil von Projekteinstellungen aufgehoben). Dann drückt der User auf kompilieren, oder was auch immer und du musst was draus machen!

    Aber wo du dafür Infos herbekommst weis ich nicht, schon mal bei Amazon nach Büchern in die Richtung gesucht?

    MfG SideWinder



  • Es geht mir gar nicht um die funktionen und so, es geht wirklich nur darum die skripte zu parsen und in echte kommandos umzuwandeln. 😞
    Die Funktionen sind erstmal egal.

    SetName("Name");

    soll dann z.B.
    eine c++
    Funktion aufrufen namens blabla(char * lala);
    und lala soll dann der string "Name" sein.

    Und hast du dir mal die Seitte angeschaut, dann weißt du was ich meine.



  • Achso. Na, dann würde ich alles in einen String speichern (oder Blockweise). Danach suchst du nach Befehlen die in deiner Skriptsprache enthalten sind (parst den String). In einer Datei hast du zu SetPlayer(x,y) das entsprechende Gegenstück und änderst alles zu Code um.

    Vielleicht wäre es gut, wenn du deine Gegenstücke in C++-Code umwandelst, du kannst ja einen Freeware-Compiler mitliefern und den dann deinen C++-Code zu einem Programm kompilieren und linken.

    MfG SideWinder



  • Bisjetzt hab ich schon ein bissl was gemacht, also ich speichere das ganze skript in einem string, daraus lese ich den jede zeile aus und übergebe sie einen funktion CheckCommand() die überprüft ob der befehl gültig ist. Aber ein kleinen Beispiel wär nicht so schlecht, denn so leicht ist das nicht.
    Ich habs halt leider nicht mit der logik;-)



  • std::string code; // Hier ist das Skript zwischengespeichert.
    
    // Solange noch Code zu verarbeiten ist...
    unsigned long int zeilennr ( 0 );
    
    while ( ! code.empty () && ++zeilennr )
    {    
        // ...nach Befehl-Beendigungszeichen sehen:
        unsigned long int pos ( code.find_first_of ( ';' ) );
        // Den Befehl in einem String speichern:
        std::string zeile ( code.begin () , code.begin () + pos );
    
        // Befehl auf Synthax prüfen ( liefert 0 zurück, wenn alles okay ist, ansonsten einen Fehlercode und die Zeilennummer ):
        unsigned long int checksum ( 0 );
    
        if ( checksum = CheckCommand ( zeile ) );
        {
            SynthaxError ( zeilennr , checksum );
            break;
        }
    
        // Falls kein Fehler vorhanden ist, in Code compilieren:
        CompileCommand ( zeile );
    
        // Und den Befehl aus dem Code-String löschen:
        code.erase ( code.begin () , code.begin () + pos );
    }
    

    SynthaxError() gibt dann eine Meldung am Bildschirm aus und bricht den Compile-Vorgang ab.

    CheckCommand() prüft mit einer Datei ob der Befehl vorhanden ist.

    CompileCommand() übersetzt den Befehl (ebenfalls mithilfe einer Datei) in den dazugehörigen Code.

    MfG SideWinder



  • Aha, sehr interessant, danke. So was ähnliches, aber nicht sowas ordentliches hab ich auch ausprobiert und hat in Ordnung gklappt.

    Hast du vielleicht eine Idee wie Ich das mit der Parameter übergabe und der möglichekeit von klammer bei 'if'-abfragen realisieren könnte.



  • Versteh ich nicht. Welche Parameter? Und welche Klammern bei if-Abfragen?

    MfG SideWinder



  • Ok es soll bei den befehelnen(also funktionen) auch parameter, geben, allerdings hab ich da jetzt schon ne idee, also ich probier jetzt mal weiter und wenn ich probleme habe meld ich mich 😃



  • Eine Frage mal: Was hat dieser Thread überhaupt im DOS und Win32 Konsole Forum zu suchen? Irgendwie garnichts. 😃



  • Hast recht, direkte Frage zur DOS oder zur Konsole ist hier nicht vorhanden. Standard dürfte auch noch alles sein.

    Ich verschiebs mal nach Std-C++.

    MfG SideWinder


Anmelden zum Antworten