home *** CD-ROM | disk | FTP | other *** search
- {---------------------------------------------------------------------------}
- { fkplot3.pas }
-
- { Klammerueberschuss berechnen - rueckwaerts: }
-
- PROCEDURE U1 (VAR i, ue, st: INTEGER; q2: Str);
-
- VAR k: INTEGER;
-
- BEGIN
- FOR k := i-1 DOWNTO 1 DO
- CASE q2[k] OF
- ']': ue := ue+1;
- '[': BEGIN
- ue := ue-1;
- IF (st = 0) AND (ue = 0) THEN st := k;
- END;
- END;
- END;
-
- { Klammerueberschuss berechnen - vorwaerts: }
-
- PROCEDURE U2 (VAR i, ue, st: INTEGER; q2: Str);
-
- VAR k: INTEGER;
-
- BEGIN
- ue := 0;
- st := 0;
- FOR k := i+1 TO Length(q2) DO
- CASE q2[k] OF
- '[': ue := ue+1;
- ']': BEGIN
- ue := ue-1;
- IF (st = 0) AND (ue = 0) THEN st := k;
- END;
- END;
- END;
-
- { Funktion, die den zweiten Teil der Uebersetzung des Strings q2 vornimmt: }
-
- FUNCTION translat2 (q2: Str): Str;
-
- TYPE Str = STRING[255];
-
- VAR ins: STRING[2];
- i, j, ue, st: INTEGER;
-
- BEGIN
- {******************1.Teil*********************}
- REPEAT { Umwandeln der Funktionen A-S in a-s, }
- ue := 0; { gleichzeitig Setzen der Klammern }
- st := 0; { (hoechste Prioritaet) }
- i := 1;
- REPEAT
- IF q2[i] IN ['A'..'S'] THEN
- BEGIN
- q2[i] := Chr(Ord(q2[i])+32);
- Insert('[', q2, i);
- j := i+1;
- U2(j, ue, st, q2);
- Insert(']', q2, st);
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- REPEAT { Umwandeln ( ^ -> v ) und Setzen der Klammern }
- ue := 0; { (zweithoechste Prioritaet) }
- st := 0;
- i := 1;
- REPEAT
- IF q2[i] = '^' THEN
- BEGIN
- q2[i] := 'v';
- U1(i, ue, st, q2);
- Insert('[', q2, st);
- U2(i, ue, st, q2);
- Insert(']', q2, st);
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- REPEAT { Umwandeln der Vorzeichen +,- in 0+.. bzw. 0-.. }
- ue := 0; { und Setzen der Klammern(dritthoechste Prioritaet) }
- st := 0;
- i := 1;
- REPEAT
- IF ((q2[i] = '+') OR (q2[i] = '-')) AND (q2[i-1] = '[') THEN
- BEGIN
- Insert('0]', q2, i);
- i := i+2;
- CASE q2[i] OF
- '+': q2[i] := 'z';
- '-': q2[i] := 'y';
- END;
- U1(i, ue, st, q2);
- Insert('[', q2, st);
- U2(i, ue, st, q2);
- Insert(']', q2, st);
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- REPEAT { Umwandeln ( *,/ -> x,w ) und Setzen der Klammern }
- ue := 0; { (vierthoechste Prioritaet) }
- st := 0;
- i := 1;
- REPEAT
- IF (q2[i] = '*') OR (q2[i] = '/') THEN
- BEGIN
- CASE q2[i] OF
- '*': q2[i] := 'x';
- '/': q2[i] := 'w';
- END;
- U1(i, ue, st, q2);
- Insert('[', q2, st);
- U2(i, ue, st, q2);
- Insert(']', q2, st);
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- REPEAT { Umwandeln ( T,U -> t,u) und Setzen der Klammern }
- ue := 0; { (fuenfthoechste Prioritaet) }
- st := 0;
- i := 1;
- REPEAT
- IF (q2[i] = 'T') OR (q2[i] = 'U') THEN
- BEGIN
- CASE q2[i] OF
- 'T': q2[i] := 't';
- 'U': q2[i] := 'u';
- END;
- U1(i, ue, st, q2);
- Insert('[', q2, st);
- U2(i, ue, st, q2);
- Insert(']', q2, st);
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- REPEAT { Umwandeln ( +,- -> z,y ) und Setzen der Klammern }
- ue := 0; { (niedrigste Prioritaet) }
- st := 0;
- i := 1;
- REPEAT
- IF (q2[i] = '+') OR (q2[i] = '-') THEN
- BEGIN
- CASE q2[i] OF
- '+': q2[i] := 'z';
- '-': q2[i] := 'y';
- END;
- U1(i, ue, st, q2);
- Insert('[', q2, st);
- U2(i, ue, st, q2);
- Insert(']', q2, st);
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- {******************2.Teil*********************}
- REPEAT { Umwandeln [2]z[3] in Z([2],[3]) }
- ue := 0;
- st := 0;
- i := 1;
- REPEAT
- IF q2[i] IN ['t'..'z'] THEN
- BEGIN
- U1(i, ue, st, q2);
- ins := UpCase(q2[i])+'(';
- Insert(ins, q2, st);
- j := i+2;
- U2(j, ue, st, q2);
- Insert(')', q2, st+1);
- q2[i+2] := ',';
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- REPEAT { Umwandeln a[[4]] in A([[4]]) }
- ue := 0;
- st := 0;
- i := 1;
- REPEAT
- IF q2[i] IN ['a'..'s'] THEN
- BEGIN
- q2[i] := UpCase(q2[i]);
- Insert('(', q2, i+1);
- j := i+1;
- U2(j, ue, st, q2);
- Insert(')', q2, st+1);
- END
- ELSE
- i := i+1;
- UNTIL (i > Length(q2)) OR (st > 0);
- UNTIL st = 0;
-
- {******************3.Teil*********************}
- i := 1; { Alle eckigen Klammern loeschen }
- REPEAT
- IF q2[i] IN ['[',']'] THEN
- Delete(q2, i, 1)
- ELSE
- i := i+1;
- UNTIL i = Length(q2)+1;
- translat2 := q2;
- END;