Hallo, wie kann ich in C für einen 8051er einen "Befehls-Interpreter" schreiben? Ich hab mir jetzt schon ein bisschen den Kopf heissgedacht, aber egal was mir einfällt, entweder würde es ein riesiges if... else if... Wirrwar geben, oder einen recht komplexen switch...case Baum! Ein weiteres Problem an der Sache wird auch sein, das ich String-Funktionen in der gegenwärtigen Form (sprintf, usw.) nicht verwende, sondern selbstgeschriebene Routinen für die serielle Schnittstelle, die auch mit Parity-Check arbeiten, allerdings nur byteweise. Mit den üblichen String-Funktionen wird so ein Interpreter wohl einfacher zu lösen sein, oder? Kann mir jemand auf die Sprünge helfen? Danke Gruß Ralf
Was genau möchtest du interpretieren? Bytecode oder irgendeine Skriptsprache? Bytecode wird vermutlich ein riesiges switch (hab ich aber noch nie ausprobiert); bei einer Skriptsprache gibt es geschicktere Möglichkeiten. Die musst du nämlich zuerst einmal parsen und einen syntax tree aufbauen. Erst dann gehts ans Interpretieren, was dank des syntax trees nicht mehr allzu kompliziert ist. Zu allererst musst du aber die Grammatik definieren. Wie man einen Parser/Compiler schreibt ist aber nicht in ein paar Sätzen zu erklären. Diese FAQ könnte dir helfen: http://www.c-plusplus.de/forum/viewtopic.php?t=41470
Das mit dem syntax tree ist zwar im Prinzip richtig, aber mir scheint, daß z.B. Bascom darauf verzichtet. Das führt dann dazu, daß man keine komplizierten Ausdrücke schreiben kann (Bascom kann z.B. kein x = a + b + c, sondern nur x = a + b, x = x + c). Das macht die Sache wesentlich einfacher (und natürlich auch weniger leistungsfähig). Das mit den vielen if bzw. switch ist normal, insbesondere wenn man das mit einer Statemachine realisiert. Markus
Mhm... okay, mal sehen. Wenn ich die Begriffe von euch richtig verstehe, ist meine Anwendung dann ein Byte-Code Interpreter. Jeder Befehl ist 1 Byte groß. Je nach Befehl gibt es dann entweder eine festgelegte oder eine variable Datenmenge hinten dran. @Markus: Dann war mein Ansatz mit den if bzw. switch schon richtig? Dann werd ich mir das nochmal genauer überlegen. Gruß Ralf
Hi bitte? Bascom kann sowas wie x = x + a + b nicht? Dann ist das Ding ja wirklich so übel wie mir meine Vorurteile bisher nahelegten. Matthias
@Matthias: Wie gesagt, ich vermute, daß er das ohne Parsetree macht, denn dann wird das Verarbeiten von solchen Ausdrücken sofort wahnsinnig kompliziert. Deswegen wurde bei Bascom wohl darauf verzichtet. Die Stärken von Bascom liegen halt woanders: Während die Frischlinge beim WinAVR noch suchen, wie sie das Ganze überhaupt zum Laufen bringen, da haben Bascom-User das Programm schon geschrieben, Simuliert und zum MC übertragen. Markus
...und wissen überhaupt nicht, was der Codewizard denn jetzt alles "gezaubert hat"...
@Oldbug: Natürlich nicht, aber das ist auch nicht nötig. Am Anfang interessieren ganz andere Dinge. Natürlich will man langfristig nicht mit Bascom arbeiten, aber für die ersten 10 Projekte ist das ideal und danach verstehen die Leute auch soviel davon, daß der Umstieg auf eine andere Sprache nicht allzuschwer fallen sollte. Markus
Bytecode muss übrigens kein gigantisches switch-Statement implizieren - da lässt sich ein (Funktions-)Pointerarray auch sehr schön verwenden. Als Abfallprodukt erhält man ausserdem enorme Geschwindigkeit, da zum Aufruf einer durch Bytecode definierten Funktion nur ein zusätzlicher Arrayzugriff erforderlich ist. Das Pointerarray muss aber 256 Einträge groß sein, sonst muss vor Zugriff der Wertebereich der Bytecodes überprüft werden. Unbenutzte Einträge sind im Array mit NOP oder vergleichbarem zu belegen (natürlich ist nicht der NOP-Opcode gemeint, sondern eine Funktion, die nichts tut). Nullpointer dürften hier spannende Resultate liefern ...
@Rufus: Als Anfänger habe ich mich gewundert, warum switch überhaupt existiert (if-else ist ja nicht soviel komplizierter) und warum es nur mit ordinalen Werten arbeitet. Mittlerweile vermute ich, daß der Sinn darin besteht, daß man dann mit Sprungtabellen arbeiten kann und sich somit sogar den Vergleich spart. Letztendlich ist es das gleiche wie Dein Pointerarray, nur eleganter. Markus
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.