Autor Beitrag
Philipp_Reitter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: Di 04.09.07 15:45 
hi

ich will nen parser schreiben (nen simplen)
und zwar dass ich den namen der prozedur bekomm das hab ich
aber ich will dann ned hunderte zeilen If sätze schreiben

ausblenden Delphi-Quelltext
1:
2:
if str = 'Close;' then Close;
if str= beep; then....


kann ich das nicht irgendwie geschikter machen?
so was wie ne stringlist für prozeduren oder so...

mfg
Philipp
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 04.09.07 16:25 
Schau Dir mal Prozedur-Zeiger an. Damit kannst Du das (teilweise) lösen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
type TProcData = record
    Name: String;
    Proc: Procedure;
end;


Davon nen Array bilden; alles andere sollte klar sein ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Philipp_Reitter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: Di 04.09.07 16:36 
ah... ich wusste nicht dass Proc: Procedure; überhaubts geht!
danke!
Philipp_Reitter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: Mi 05.09.07 08:00 
ok das geht ja aber wenn ich mir ne Procedur zum adden schreib sieht da so aus:

ausblenden Delphi-Quelltext
1:
procedure AddProcedure(vName : String; vProc : Procedure);					


aber dann Kommt irgedwas erwarted aber Procedure gefunden!!
wie kan ich das anstellen?!

Mfg
philipp
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 05.09.07 09:10 
Das Problem ist, dass verschiedene Prozeduren auch verschiedene Parameter haben. Es ginge sowas:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TProcData = record
    Name: String;
    Proc: Pointer;
  end;

const
  a: array[0..1] of TProcData = ((Name: 'Beep'; Proc: @Beep),
    (Name: 'Sleep'; Proc: @Sleep));

Jetzt müssen die Parameter manuell per Assembler in die richtigen Register bzw. bei mehr als drei Parametern die restlichen in den Stack und dann kann man die Methode ebenfalls per Assembler aufrufen. Die Parameter müssen aber auch noch in das richtige Format gebracht werden, etc...
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 05.09.07 09:36 
user profile iconPhilipp_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:
ausblenden 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.:
ausblenden 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.
ausblenden 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');
// Ergibt 4
  MyVar := 3;
  MyEngine.Execute ('X*2');
// Ergibt 6
...

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.
Philipp_Reitter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: Mi 05.09.07 10:31 
d.h. ich solls einfach lassen oder?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 05.09.07 12:16 
user profile iconPhilipp_Reitter hat folgendes geschrieben:
d.h. ich solls einfach lassen oder?

Jupp. Außer, du willst viel lernen und hast viel Zeit.

_________________
Na denn, dann. Bis dann, denn.
Philipp_Reitter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: Mi 05.09.07 16:31 
ich nehm Pascal Script 3 her... das is irgendwie so das was ich proggen wollte ^^