\begin{slide}{Einleitung}

sablecc ist eine DSL zur Beschreibung/Erzeugung von Parsern.

ist \emph{aufgesetzt} (auf Java):
\begin{itemize}
\item eigene konkrete Syntax
\item benötigt Parser
\item benötigt Interpreter/Compiler
\end{itemize}

\end{slide}

\begin{slide}{Eingebettete DSL}

Bsp: Parser als Java-Objekte
(elementare und Kombinatoren)


können von Gastsprache übernehmen:
\begin{itemize}
\item
  konkrete Syntax
\item
  Modulsystem
\item
  Abstraktionen (Unterprogramme)
\item
  Bibliotheken (Datenstrukturen)
\item
  Ausführungsumgebung (Interpreter/Compiler)
\end{itemize}

\end{slide}

\begin{slide}{Beispiel: Java-Parsec}

Original: Daan Leijen (2000) für Haskell 
\url{http://legacy.cs.uu.nl/daan/parsec.html}
\url{http://www.haskell.org/ghc/docs/latest/html/libraries/parsec/Text-ParserCombinators-Parsec.html}

Hier: Nachbau für Java (Machbarkeitststudie)

Vgl.  Atze Dijkstra, Doaitse S. Swierstra:
Lazy Functional Parser Combinators in Java (2001),
\url{http://citeseer.ist.psu.edu/dijkstra01lazy.html}
\end{slide}

\begin{slide}{Beispiel: Java-Parsec}
\begin{verbatim}
interface Parser<T> {
  Result<T> parse (PushbackReader in) throws IOException;
}

class Arithmetic {
  final static Parser<Integer> product = 
    Combine.transform(
      Combine.sepBy(Atom.expect('*'), Basic.natural), 
        Combine.fold(1,
          new Function<Pair<Integer, Integer>, Integer>() {
            public Integer compute(Pair<Integer, Integer> x) {
              return x.getFirst() * x.getSecond(); } })); }

\end{verbatim}

\end{slide}
