Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Probleme mit der Umgekerten Polnischen Notation... (https://www.delphipraxis.net/136709-probleme-mit-der-umgekerten-polnischen-notation.html)

Teekeks 6. Jul 2009 17:24


Probleme mit der Umgekerten Polnischen Notation...
 
Hallo!
Ich habe ein Problem mit dieser procedure:
Delphi-Quellcode:
procedure SortTokensToUPN;
var tmp:array of string;
    i:integer;
begin
  // gleiche Länge wie Tokens:
  SetLength(tmp,Length(Tokens));
  // ersten beiden übernemen:
  tmp[0]:=Tokens[0];
  tmp[1]:=Tokens[1];
  // rest durchgehen und Sortieren:
  for i:=2 to High(Tokens) do
  begin
    // Steht i am Ende der Funktion?
    if i<High(Tokens) then
    // Ist es eine Zahl und steht links vom Operator?
      if TryStrToInt(Tokens[i],hallo) and (not TryStrToInt(Tokens[i+1],hallo)) then
        tmp[i]:=Tokens[i] else
      // steht i am Anfang der Funktion?
      if i>2 then
      begin
        if TryStrToInt(Tokens[i],hallo) and TryStrToInt(Tokens[i-1],hallo) then
          tmp[i-1]:=Tokens[i];
      end else
      // Ist es ein Operrator?
      if not TryStrToInt(Tokens[i],hallo) then
        if i=High(Tokens) then
        begin
        // Ein Operrator ist am ende der Funktion => Syntax Error!
          Writeln('Unerwarteter Opperator: "'+Tokens[i]+'" => Syntax Error!');
          exit;
        end else
        tmp[i+1]:=Tokens[i];
  end;
  for i:=0 to High(Tokens) do
    Tokens[i]:=tmp[i];
end;
Das Ziel dieser Procedure ist es das ein array in dem z.b. folgendes steht:
tst
=
1
+
2

( jede Zeile ein Eintrag)
Es in das hier umzuwandeln:
tst
=
1
2
+

Doch unerklärlicherweise steht in dem array danach anscheinend nur folgendes:
tst
=
1

Hat einer von euch eine ahnung warum das so ist???

gruß Teekeks

Khabarakh 6. Jul 2009 17:50

Re: Probleme mit der Umgekerten Polnischen Notation...
 
Dein Code sieht mir für den allgemeinen Fall etwas zu simpel gestrickt aus. Wenn im Ausdruck auch mehr als + und - vorkommen kann, wirst du um einen richtigen Hier im Forum suchenMatheparser nicht herumkommen.

Teekeks 6. Jul 2009 18:04

Re: Probleme mit der Umgekerten Polnischen Notation...
 
Mein Problem ist das ich wirklich nur ein Parser zur Polnischen Notation brauche... es soll nichts gerechnet werden.
Wobei ein richtiger Parser besser währe da dies ein Teil eines von mir momentan entwickelten Compiler ist.
(Ja ich weiß das ist eine menge Arbeit...)
Könntet ihr mir in dem falle etwas speziell empfehlen?
Ich werde jetzt mich weiter auf die suche begeben...

danke schonmal...

Teekeks 6. Jul 2009 18:17

Re: Probleme mit der Umgekerten Polnischen Notation...
 
Ich sollte dazu sagen: Ich benutze Lazarus v0.9.26b

Khabarakh 6. Jul 2009 18:38

Re: Probleme mit der Umgekerten Polnischen Notation...
 
Zitat:

Zitat von Teekeks
Mein Problem ist das ich wirklich nur ein Parser zur Polnischen Notation brauche... es soll nichts gerechnet werden.

Der Rechenteil ist ja der kleinste und simpelste Teil an einem Matheparser. Genauer gesagt kannst du den Teil direkt durch einen UPN-Generator austauschen: Das eine ist eine Preorder, das andere eine Postorder Traversal des Syntaxbaumes.
Du kannst dir also auf jeden Fall einen Matheparser als Vorlage nehmen, auch Lazarus sollte da kein großes Hindernis sein.

Zitat:

Zitat von Teekeks
Wobei ein richtiger Parser besser währe da dies ein Teil eines von mir momentan entwickelten Compiler ist.

Uff :D . Bist du denn mit der Theorie vertraut, quasi mit LL und LR per du? Ansonsten solltest du dir erst einmal entsprechende Literatur anschaffen.
Für mathematische Ausdrücke und weitere simple Grammatiken genügt ein handgestrickter Recursive Descent Parser, für Höheres würde ich persönlich nach einem geeigneten Parser-Generator suchen.

Teekeks 6. Jul 2009 18:53

Re: Probleme mit der Umgekerten Polnischen Notation...
 
Auf du noch nicht direkt, ich bin aber momentan schon dabei mich damit näher zu beschäftigen...

Eigentlich sollte das Oben sowas in der richtung werden (nur momentan noch simpler gestrickt) deswegen frage ich ja wo mein fehler in der Logik ist das der nicht alles einliest...

wenn ihr mir da helfen könntet...

gruß Teekeks

Blup 7. Jul 2009 14:10

Re: Probleme mit der Umgekerten Polnischen Notation...
 
Sorry, aber deine Prozedur ist mir zur verkorkst bei der Hitze, da schreib ich lieber schnell eine neue.
Delphi-Quellcode:
function IsOperator(const AValue: string);
var
  dummy: Integer;
begin
  Result := not TryStrToInt(AValue, dummy);
end;

procedure Swap(var AValue1, AValue2: string);
var
  temp: string;
begin
  temp   := AValue1;
  AValue1 := AValue2;
  AValue2 := tmp;
end;

procedure SortTokensToUPN;
var
  i:integer;
begin
  i := High(Tokens);
  if (i > 2) and IsOperator(Tokens[i]) then
  begin
    // Ein Operrator ist am ende der Funktion => Syntax Error!
    Writeln('Unerwarteter Opperator: "' + Tokens[i] + '" => Syntax Error!');
    Exit;
  end;
  Dec(i);
  while i > 2 do
  begin
    if IsOperator(Tokens[i]) then
      Swap(Tokens[i], Tokens[i + 1]);
    Dec(i);
  end;
end;

Teekeks 8. Jul 2009 18:30

Re: Probleme mit der Umgekerten Polnischen Notation...
 
Hallo!
Danke!
Du hast mir schonmal sehr geholfen.
Ich kann gerade das nur nicht ausprobieren weil ich grade nur am Schleptop bin...
Werde aber noch berichten ob das so alles gleich klappte oder ich noch was umändern musste.
Du hast mir aufjeden Fall schonmal aus meinen Verkorksten Gedankengängen geholfen.

Nochmals Danke!

Gruß Teekeks


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz