EugenE hat geschrieben:
oder kann man das mit einer anderen componente/unit besser realisieren?^^
Man muss ja nicht gleich mit Kanonen auf Spatzen schiessen
Geh doch einfach durch die Chars, die Nummern sammelst du, wenn das x Kommt ist Zahl eins fertig. Dann geh weiter bis wieder ne Nummer kommt, wenn der String zuende ist, ist Zahl zwei fertig. (Oder so
Ich benutze dazu oft meinen "Allzweck-Tokenizer".
Mit der Demo unten kriegst du schon mal nur die Zahlen raus, egal was sonst noch kommt. Den Code bei Button1Click und die TokenChars musst du vielleicht noch anpassen.
const TokenChars=['0'..'9'];
function Tokenize(S: string; var pos: integer; var isTokenChar:Boolean): string;
var
Len, Start: integer;
begin
Len := length(S);
if pos = 0 then pos := 1 else
if pos > Len then pos := -1;
if Len > 0 then
begin
if not (S[pos] in TokenChars) then
begin
Result := S[pos];
inc(pos);
isTokenChar:=True;
end
else
begin
Start:=pos;
repeat
inc(pos);
until (pos > Len) or not (S[pos] in TokenChars);
isTokenChar:=False;
Result:=Copy(S,Start,Pos-Start);
end;
if pos > Len then pos := 0;
end else
begin
isTokenChar:=False;
Result := '';
pos := 0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var isTC:boolean;
Pos:integer;
Token:String;
begin
pos:=0;
repeat
Token:=Tokenize(Edit1.text, pos, IsTC);
if not isTC then
begin
Memo1.lines.add(Token);
end;
until pos<=0;
end;
EugenE hat geschrieben:
Geh doch einfach durch die Chars, die Nummern sammelst du, wenn das x Kommt ist Zahl eins fertig. Dann geh weiter bis wieder ne Nummer kommt, wenn der String zuende ist, ist Zahl zwei fertig. (Oder so
Oder lese alle Zahlen aus dem String aus und unterscheide sie, wenn ein Operator (+,-,...) dazwischen liegt.
Bei verschachtelten Termen wirst du um einen Parser nicht drumrum kommen...
a) Die erste schliessende Klammer suchen
b) von dort aus die öfnnende suchen.
c) nächste schliesssnede
d) nächste öffnende
....
Der Trick ist, die schliessenden nach rechts, die öffnenden nach links zu suchen. Zähl aber am Anfang mal nach ob die Anzahl öffnender = schliessender, sonst kanst du gleich abbrechen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
EugenE hat geschrieben:Ja wie kann man von rechts die position bekommen?
Kannst du mal sagen, worauf du eigentlich hinaus willst?
Der Tokenizer den ich dir geschickt habe könnte schon gute Dienste leisten.
Statt der Rekursion die du eingeführt hast, würde ich mir einen eigenen Stack halten, das ist übersichtlicher.
Rekursionen können zu Kopfschmerzen führen http://de.wikipedia.org/wiki/Rekursion" onclick="window.open(this.href);return false;
Christian hat geschrieben:Es gibt 100derte parser also sowas zu schreiben is nu wirklich unsinnig
Gibt es eigentlich quelloffene Pascal-Parser?
Einen dieser 100derte Parser hab ich für Lexart geschrieben. Die Programmierung hat mir Spaß gemacht - man kann da wirklich viel lernen. Gerade Leuten, die sich für Rekursion oder für die Analyse mathematischer Terme interessieren, möchte ich das empfehlen.