Befehls-Interpreter

Gast #122041
Lesenswert?

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
Gast #122042
Lesenswert?

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
Gast #122043
Lesenswert?

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
Gast #122044
Lesenswert?

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
Gast #122046
Lesenswert?

@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
Gast #122048
Lesenswert?

@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
Gast #122049
Lesenswert?

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 ...
Gast #122050
Lesenswert?

@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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren