program compiler;

uses crt;

VAR i    : INTEGER;
    next : CHAR;
    s    : STRING;

PROCEDURE Faktor; FORWARD;

PROCEDURE Ausgabe(n:INTEGER ; c:STRING);
BEGIN
   CASE n OF
      1: Write('ADD');
      2: Write('SUB');
      3: Write('MULT');
      4: Write('DIV');
      5: BEGIN Write('LOAD ');Write(c) END;
      6: BEGIN Write('STORE ');Write(c) END
   END;
   WriteLn
END;

PROCEDURE Lese;
BEGIN
   INC(i);
   if i<=length(s)
      then next:=s[i]
      else next:='#' {Die Raute wird als String-Ende Kennung benutzt!}
END;

PROCEDURE Fehler;
BEGIN
   WriteLn;
   Write('Fehler in Position ');
   Write(i);
   HALT
END;

PROCEDURE Term;
BEGIN
   Faktor;
   REPEAT
      CASE next OF
         '#','+','-',')': break;
         '*'            : BEGIN Lese; Faktor; Ausgabe(3,'') END;
         '/'            : BEGIN Lese; Faktor; Ausgabe(4,'') END;
         ELSE Fehler
      END;
   UNTIL false
END;

PROCEDURE Ausdruck;
BEGIN
   Term;
   REPEAT
      CASE next OF
         '#',')' : break;
         '+'     : BEGIN Lese; Term; Ausgabe(1,'') END;
         '-'     : BEGIN Lese; Term; Ausgabe(2,'') END;
         ELSE Fehler
      END;
   UNTIL false
END;

PROCEDURE Faktor;
BEGIN
   CASE next OF
      'a'..'z': BEGIN Ausgabe(5,next); Lese END;
      '('     : BEGIN Lese; Ausdruck;
                   IF next<>')'
                      THEN Fehler
                      ELSE Lese
                END;
       ELSE Fehler
   END
END;

PROCEDURE Wertzuweisung;
VAR ch:CHAR;
BEGIN
   CASE next OF
      'a'..'z': BEGIN ch:=next;
                   Lese;
                   IF next <> ':'
                      THEN Fehler;
                   Lese;
                   IF next <> '='
                      THEN Fehler;
                   Lese;
                   Ausdruck;
                   Ausgabe(6,ch)
                   END;
       ELSE Fehler
   END
END;

BEGIN (* Hauptprogramm *)
   ClrScr;
   write('Wertzuweisung: ');
   Read(s);
   i:=0;
   Lese;
   WriteLn;
   Wertzuweisung;
   IF next <> '#'
      THEN Fehler;
   writeln;write('beliebige Taste');
   REPEAT UNTIL keypressed
END.



