Philipp_Reitter hat folgendes geschrieben: |
hi
ich will nen parser schreiben (nen simplen) |
Ein
Parser analysiert einen Satz einer Sprache (hier: Ein Skript/Programm der Sprache 'Delphi/Pascal') und erstellt daraus eine Struktur, die die Syntax des Satzes wiederspiegelt (normalerweise ein Syntaxbaum). Er führt aber nichts aus. Ihm ist es völlig schnurz, was der tiefere Sinn der Eingabe ist oder was man damit anstellen kann.
Danach kann ein
Compiler die Struktur in eine Zielsprache (i.a. Assembler oder Maschinencode) übersetzen.
Ein Translator wird sie in eine andere gleichwertige Zielsprache übersetzen (z.B. in VB oder C oder als hübsch formatierten Text in HTML/RTF).
Ein
Interpreter wird die Struktur abarbeiten sowie die Befehle ausführen, berechnen etc.
Natürlich kann das auch alles schon während der Analysephase ('parsen') passieren.
Da Du die VCL vollständig in deinem Interpeter aufrufbar haben willst, benötigst Du wohl oder übel eine Brücke zwischen den beiden Systemen. Um eine Lookup-Tabelle, die dir für das Symbol 'Beep' die notwendigen Informationen (Adresse, Parameter etc.) ermittelt, wirst Du nicht umhin kommen. Dann kannst Du versuchen, anhand der Information die Parameter auf den Stack zu schieben und dann die Routine aufzurufen.
Oder Du lässt es und verwendest stattdessen lieber fertige Interpreter / Skript-Engines (ist ja das Gleiche), die das alles schon fix und fertig implementiert haben.
Ich würde zu Letzterem tendieren, auch wenn ich es mir durchaus zutraue, so eine Engine zu basteln. Das ist aber wirklich nicht trivial, also vielleicht doch (nicht böse sein) ein, zwei Nummern zu hoch für Dich.
Fang doch erstmal mit einem "Mathe-Parser" an, der also arithmetische Ausdrücke berechnen kann:
Delphi-Quelltext
1:
| MyEngine.Execute ('2+3*4') |
Sollte dann 14 ergeben. Wenn Du das 'korrekt' bzw. klassisch nach der Lehre implementierst (mit Scanner und Parser und Syntaxbaum und so), erweiterst Du dein System um Variablen, also z.B.:
Delphi-Quelltext
1: 2:
| MyEngine.AddConst ('X',2); MyEngine.Execute ('X*2'); |
ergibt dann 4. Anschließend noch den Zugriff auf Variablen, die im Delphi-Code deklariert sind.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Var MyVar : Integer;
Begin MyEngine.AddInteger ('X',@MyVar); MyVar := 2; MyEngine.Execute ('X*2'); MyVar := 3; MyEngine.Execute ('X*2'); ... |
Damit wärst Du schon ganz schön weit. Anschließend Kontrollstrukturen (If..Then) sowie Schleifen (While..., Repeat, For). Danach noch Prozeduren und Funktionen.
Und wenn Du das alles hast, dann versuche das von mir oben erwähnte Zeugs (oder hab eine bessere Idee).
Eine gute Verbindung zwischen Symbolen und Code ist z.B. eine DLL. Dort kannst Du die Einsprungsadresse anhand eines Prozedurnamens (als String) ermitteln.
Na denn, dann. Bis dann, denn.