Befehls-Interpreter

Gast #122041
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
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
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
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 #122045
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
Gast #122046
@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
@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
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
@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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.