PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Consolen Befehle umsetzen


Einfachkrank
2004-03-17, 09:48:43
Hi,

ich hab mir jetzt ne kleine Console für meine OGL Programme gebastelt, die mir dann den Befehl als char* zurückliefert. Jetzt müssen die Befehle übersetzt werden. Wie mache ich das am besten?
Zum Beispiel will ich so einen Befehl eingeben können:
"set GL_FOG 1" und dieser soll dann bewirken: glEnable(GL_FOG)
Ich muss also erst einen Befehl im String erkennen und dann noch die dazu gehörigen Werte...

MFG Einfachkrank

aths
2004-03-17, 13:09:57
Ja.

1. Leerzeichen vorne und hinten abschneiden

2. Multiple Leerzeichen auf ein Leerzeichen kürzen

3. Anhand der Leerzeichen die Zeile stückeln

4. Die Stücke auswerten.

Du brauchst noch ein paar Funktionen, um z. B. Befehle in Kleinschreibung umzuwandeln, oder um zu testen, ob ein Substring eine Zahl ist.

Trap
2004-03-17, 14:52:35
Nimm einen Parsergenerator.

aths
2004-03-17, 15:00:16
Original geschrieben von Trap
Nimm einen Parsergenerator. Was soll der machen? Einen Parser generieren?

ScottManDeath
2004-03-17, 15:13:55
Oder quick n' dirty "strtok" , einfach mal in der MSDN / <insert any documentation> gucken.

Flex / Bison wäre doch wohl 'etwas' Overkill ;) aber eine gute Übung anyways......

Trap
2004-03-17, 15:37:14
Einen Parser braucht man dafür sowieso. Die Frage ist nur ob man ihn selbst schreibt oder aus der Grammatik automatisch erzeugen lässt.
Automatisch erzeugte haben den Vorteil, dass sie einfacher änderbar sind und sicher korrekt funktionieren.

Für Java find ich gut www.sablecc.org
Für C++ gibt es bei www.boost.org einen, der einfacher als Bison/Yacc zu benutzen ist

marco42
2004-03-17, 16:05:00
Original geschrieben von Einfachkrank
Hi,

ich hab mir jetzt ne kleine Console für meine OGL Programme gebastelt, die mir dann den Befehl als char* zurückliefert. Jetzt müssen die Befehle übersetzt werden. Wie mache ich das am besten?
Zum Beispiel will ich so einen Befehl eingeben können:
"set GL_FOG 1" und dieser soll dann bewirken: glEnable(GL_FOG)
Ich muss also erst einen Befehl im String erkennen und dann noch die dazu gehörigen Werte...

MFG Einfachkrank

Wie waere es wenn du eine dynamische Sprache einbettest. Ich benutzte fuer solche Zwecke Python. Hab mir dazu noch meine eigenen OpenGL wrapper geschrieben, aber es gibt da auch schon PyOpenGL.

Einfachkrank
2004-03-17, 16:28:13
Original geschrieben von aths
Ja.

1. Leerzeichen vorne und hinten abschneiden

2. Multiple Leerzeichen auf ein Leerzeichen kürzen

3. Anhand der Leerzeichen die Zeile stückeln

4. Die Stücke auswerten.

Du brauchst noch ein paar Funktionen, um z. B. Befehle in Kleinschreibung umzuwandeln, oder um zu testen, ob ein Substring eine Zahl ist.
Wie würde denn das Stücke auswerten aussehen? Hast du da auch en spontanen Vorschlag?

aths
2004-03-17, 16:58:37
Original geschrieben von Einfachkrank
Wie würde denn das Stücke auswerten aussehen? Hast du da auch en spontanen Vorschlag? aTuner hat auch eine Konsole :naughty:. Das ist ein langer Entscheidungsbaum mit vielen "if"s. Fast alle Befehle haben bei aTuner das Format <Befehl> = <Wert>, oder <Befehl> <Wert>. Das ist relativ einfach auszuwerten. Fand eine Auswertung statt, wird die Variable, dass der Befehl ausgeführt wurde, auf "true" gesetzt, damit der User eine entsprechende Rückmeldung bekommt. (Beim aTuner heißt das in der Regel, dass ein nicht gültiger Befehl, oder ein Befehl mit nicht validem Wert gar nicht erst entgegengenommen wird.)

Was die aTuner-Konsole kann, ist hier beschrieben: http://ds80-237-203-42.dedicated.hosteurope.de/vbulletin/showthread.php?threadid=124113

Trap
2004-03-17, 18:06:39
Guck dir mal den Parsergenerator in boost an und überleg dann nochmal ob du es selbst programmieren willst.
http://www.boost.org/libs/spirit/index.html

Wenn man es von Hand programmiert wird es Code der überall gleich aussieht und sich dauernd wiederholt. Ziemlich langweilig zu schreiben außerdem. Bei nur 1 Befehl ist es allerdings noch weniger Arbeit.