Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - problem bei Parser programierung


*Eldorado - Mi 27.07.11 22:59
Titel: problem bei Parser programierung
Hi,
Ich versuche gerade einen eigenen mathe parser zu programieren.
Jetzt habe ich aber das problem, das ich immer einen Fehler bekomme, wobei ich keine ahnung habe, wie der zustande kommen kann.
Vllt. weiß einer von euch ja mehr.

Diese Funktion soll die Multiplikationen und Divisionen lösen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
function Punkloesung(Rechnung:string):string;
var i,l,k,n:integer;
var hold1,hold2,res,op1,op2:string;
var erg:real;
begin
hold1:=#0;
hold2:=#0;
k:=1;
l:=1;
for i:=1 to length(Rechnung) do
 begin
  if (Rechnung[i] = '*'or (Rechnung[i] = '/'then
   begin
    while (Rechnung[i-l] <> '+'and (Rechnung[i-l] <> '-'and (Rechnung[i-l] <> '*'and (Rechnung[i-l] <> '/'and (l <> 0)
     do inc(l);
    while (Rechnung[i+k] <> '+'and (Rechnung[i+k] <> '-'and (Rechnung[i+k] <> '*'and (Rechnung[i+k] <> '/'and (k <> length(Rechnung))
     do inc(k);                   //Erkennung der länge der Zahlen vor und nach Operator
   end;
   if (i-l > 1then
    begin
     for n:=1 to i-l
      do hold1[n]:=Rechnung[n];
    end;
   if (length(Rechnung)-(i+k) > 1then
    begin
     for n:=1 to length(Rechnung)-(i+k)         //Restliche Funktion wird gespeichert
      do hold2[n]:=Rechnung[i+k+n];
    end;                                  
   for n:=1 to l
    do op1[n]:=Rechnung[i-l+n-1];
   for n:=1 to k
    do op2[n]:=Rechnung[i+n];            //Zu rechnende Zahlen werden in neue Variablen gesetzt
   if (Rechnung[i] = '*')
    then erg:=StrToFloat(op1)*StrToFloat(op2)
    else erg:=StrToFloat(op1)/StrToFloat(op2); //Berechnen der Operation
   for n:=1 to i-l
    do res[n]:=Rechnung[n];
   res:=res+FloatToStr(erg);
   for n:=i+k to length(Rechnung)
    do res[length(res)+1]:=Rechnung[n];  //Zusammensetzten der bearbeiteten Funktion
  end;
result:=res;
end;

Ich bekomme folgenden Fehler: http://vvcap.net/db/PpfdaiUlG9mZyoNfT6XK.htp
Und werde auf Zeile 29 Rausgeschmissen : /

grüße
Eldorado

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt


jaenicke - Mi 27.07.11 23:06

op1 ist in Zeile 30 noch leer, du versuchst aber auf Buchstaben in dem (nicht existenten) String zuzugreifen. Das kann nicht gut gehen.

Du kannst z.B. vorher die Länge setzen, damit die Buchstaben schon existieren.


Delete - Do 28.07.11 00:04

Was ist ein Paser?


elundril - Do 28.07.11 01:20

Ein ägyptischer Wesir [http://de.wikipedia.org/wiki/Paser] der im 13. Jahrhundert vor Christus lebte. :P


*Eldorado - Do 28.07.11 09:20

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Ein ägyptischer Wesir [http://de.wikipedia.org/wiki/Paser] der im 13. Jahrhundert vor Christus lebte. :P


Ihr wisst genau was ich meine :roll:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
op1 ist in Zeile 30 noch leer, du versuchst aber auf Buchstaben in dem (nicht existenten) String zuzugreifen. Das kann nicht gut gehen.

Du kannst z.B. vorher die Länge setzen, damit die Buchstaben schon existieren.


Stimmt, hätte ich auch selber bemerken können : /


ssb-blume - Do 28.07.11 09:57

Hallo,
wenn Du alleMöglichkeiten (Klammern usw) nutzen willst, mache folgendes:
1. Umwandeln in polnische Notation (mittels Stack leicht)
2. Trennung von Rechenzeichen und Variablen auslesen
3. auswerten und rechnen.

Geht ganz leicht, allerdings machen unäre Operanden etwas Probleme.


mandras - Do 28.07.11 12:27

Was genau soll der Parser tun?
Ich hab hier noch einen selbstgebauten den ich mal
für Formeln in Edits geschrieben habe


BenBE - Do 28.07.11 13:48

Eine kleinge Einführung zu stackbasierten Parsern hätte ich hier [http://blog.benny-baumann.de/?p=1002] im Angebot. Alternativ gibt's auch bei den Leuten von DelphiGL [http://wiki.delphigl.com/index.php/Tutorial_Scriptsprachen_Teil_1] ein kleines Todorial.


Delete - Do 28.07.11 14:15

user profile icon*Eldorado hat folgendes geschrieben Zum zitierten Posting springen:
Ihr wisst genau was ich meine :roll:

Wir schon, aber die Suche nicht. Die Suche würde deinen Beitrag nie finden, wenn man nach Parser sucht.