Infix Expression to Binary Tree
FUNCTION Exp_to_Tree (X : VString) RETURN Tree IS
------------------------------------------------------------------------
--| Function to Convert Infix Expression to Expression Tree
--| Author: Michael B. Feldman, The George Washington University
--| Last Modified: January 1996
------------------------------------------------------------------------
  C         : Character;
  T         : VString(MaxLength(X)) := X;
  OpStack   : Stack(Capacity => Length(T));
  NodeStack : Stack(Capacity => Length(T));
  Temp      : Tree := NULL;

  PROCEDURE PopConnectPush IS
  BEGIN
    Temp := Top (OpStack);
    Pop (OpStack);
    Temp.Right := Top (NodeStack);
    Pop (NodeStack);
    Temp.left := Top (NodeStack);
    Pop (NodeStack);
    Push (NodeStack, Temp);
  END PopConnectPush;

BEGIN -- Exp_to_Tree
  IF IsEmpty (T) THEN
    RETURN NULL;
  END IF;
  LOOP
    C := Head (T);

    CASE C IS
      WHEN 'A' .. 'Z' | 'a' .. 'z' | '0' .. '9' =>
        Push (NodeStack, MakeNode (C));

      WHEN '+' | '-' | '*' | '/' =>
        IF IsEmpty (OpStack) THEN
          Push (OpStack, MakeNode (C));
        ELSIF Top (OpStack).Info = '(' THEN
          Push (OpStack, MakeNode (C));
        ELSIF Priority (Top (OpStack).Info) < Priority (C) THEN
          Push (OpStack, MakeNode (C));
        ELSE
          LOOP -- clear stack of higher priority operators
            PopConnectPush;
            EXIT WHEN IsEmpty (OpStack)
              OR ELSE Top (OpStack).Info = '('
              OR ELSE Priority (Top (OpStack).Info) < Priority (C);
          END LOOP;
          Push (OpStack, MakeNode (C));
        END IF;

      WHEN '(' =>
        Push (OpStack, MakeNode (C));

      WHEN ')' =>
        WHILE Top (OpStack).Info /= '(' LOOP
          PopConnectPush;
        END LOOP;
        Pop (OpStack); -- throw away the '('

      WHEN OTHERS =>
        NULL;
    END CASE;

    T := Tail (T);
    EXIT WHEN IsEmpty (T);
  END LOOP;

  WHILE NOT IsEmpty (OpStack) LOOP
    PopConnectPush;
  END LOOP;

  RETURN Top (NodeStack);

END Exp_to_Tree;