\begin{slide}{Operator-Präzendenz-Parser}

\begin{verbatim}
data Operator a = Operator 
    { precedence :: Int
    , semantics :: a -> a -> a }
operator_precedence_parser 
    :: Map String ( Operator a ) 
    -> Parser Char a -> Parser Char a
\end{verbatim}
  
\begin{small}
\begin{verbatim}
arithmetic :: Parser Char Integer
arithmetic = operator_precedence_parser ( M.fromList 
    [ ( "+", Operator { precedence = 1 
                      , semantics = (+) } )
    , ( "*", Operator { precedence = 2 
                      , semantics = (*) } 
    ] ) 
        ( zahl <|> parens arithmetic )
\end{verbatim}
\end{small}  

\end{slide}

\begin{slide}{Op-P-P (Implementierung)}

Benutzt zwei Keller:
\begin{itemize}
\item Werte
\item Operatoren
\end{itemize}
Bei Lesen eines
\begin{itemize}
\item Atoms: push auf Wertkeller
\item Operators: 
  \begin{itemize}
  \item ggf. Ausführung von top-of-opkeller
  \item push auf Operatorkeller
  \end{itemize}
\end{itemize}

\end{slide}
