+
+\section{Introduction}
+\begin{frame}
+ \frametitle{\textsc{SPL}}
+ \begin{block}{Features}
+ \begin{itemize}
+ \item Implementation language:
+ Clean ({\tiny\url{http://clean.cs.ru.nl}})
+ \pause
+ \begin{itemize}
+ \item Pure language
+ \item Higher order functions
+ \item Monads
+ \item Using parser combinator library \textsc{Yard}
+ \end{itemize}
+ \pause
+ \item Positional data available for easy locating of errors.
+ \pause
+ \item Standardized parser errors. This means you can set it as
+ \texttt{buildprg} in \texttt{vim} and you can then use the
+ quickfix window!
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\textsc{YARD}}
+ \framesubtitle{A minimal home grown monadic parser combinator library}
+ \begin{itemize}
+ \item Inspired by \textsc{parsec}: $1pc=3.375\cdot10^{16}yd$~\footnote{
+ A yard is exactly $36$ inch and an inch is exactly the length
+ of $3$ barleycorns}.
+ \item Definitons:
+ \begin{CleanCode}
+:: Error = PositionalError Int Int String | Error String
+:: Parser a b = Parser ([a] -> (Either Error b, [a]))
+ \end{CleanCode}
+ \pause
+ \item Result is either Error or \texttt{b}, not a \texttt{[b]} as
+ described Hutton \& Meijer \footnote{G. Hutton and E. Meijer.
+ Monadic parser combinators. 1996.}
+ \pause
+ \item Matches longest left-most parser
+ \pause
+ \item Stops immediately on error\pause\\
+ By design!
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\textsc{YARD} Combinators}
+ \framesubtitle{Designed to be minimal, just 14 parsers/combinators}
+ YARD is designed to be minimal and defines just 14 primitives:
+ \begin{columns}[t]
+ \begin{column}{0.5\textwidth}
+ \begin{CleanCode}
+top :: Parser a a
+peek :: Parser a a
+fail :: Parser a b
+eof :: Parser a Void
+(until) :: (Parser a b)
+ (Parser a c)
+ -> Parser a [b]
+satisfy :: (a -> Bool)
+ -> Parser a a
+check :: (a -> Bool)
+ -> Parser a a
+item :: a -> Parser a a
+list :: [a] -> Parser a [a]
+ \end{CleanCode}
+ \end{column}
+ \begin{column}{0.5\textwidth}
+ \begin{CleanCode}
+(>>=) :: (Parser a b)
+ (b -> Parser a c)
+ -> Parser a c
+(<|>) :: (Parser a b)
+ (Parser a b)
+ -> Parser a b
+some :: (Parser a b)
+ -> Parser a [b]
+many :: (Parser a b)
+ -> Parser a [b]
+optional :: (Parser a b)
+ -> Parser a (Maybe b)
+ \end{CleanCode}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{\textsc{YARD} Combinators}
+ \framesubtitle{Designed to be minimal, just \textbf{7} parsers/combinators}
+ Actually, scrap that, just \textbf{7} primitives:
+ \begin{columns}[t]
+ \begin{column}{0.5\textwidth}
+ \begin{CleanCode}
+top :: Parser a a
+peek :: Parser a a
+fail :: Parser a b
+eof :: Parser a Void
+ \end{CleanCode}
+ \end{column}
+ \begin{column}{0.5\textwidth}
+ \begin{CleanCode}
+(>>=) :: (Parser a b)
+ (b -> Parser a c)
+ -> Parser a c
+(<|>) :: (Parser a b)
+ (Parser a b)
+ -> Parser a b
+ \end{CleanCode}
+ \end{column}
+ \end{columns}
+ All others can be (and are) derived from these. e.g.
+ \begin{lstlisting}
+satisfy :: (a -> Bool) -> Parser a a
+satisfy f = top >>= \c -> if (f c) (return c) fail
+ \end{lstlisting}
+\end{frame}
+
+\section{Design choices}
+\begin{frame}
+ \frametitle{Adapting the grammar}
+ \begin{itemize}
+ \item Remove left recursion
+ \item Fixing associativity
+ \item Added small features such as escape characters \texttt{
+ \textbackslash n\textbackslash b}
+ \pause
+ \item Show grammar now\ldots
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Two-phase design}
+ \framesubtitle{Lexing}
+ Also done with \textsc{YARD} because
+ \begin{itemize}
+ \item Multiline comments
+ \item Alternatives
+ \item Positions
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Two-phase design}
+ \framesubtitle{Parsing}
+ Read from stdin, write to stdout\\
+ Added some handy primitives
+ \begin{CleanCode}
+parseBlock :: Parser Token [Stmt]
+
+parseOpR :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr
+parseOpL :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr
+
+trans2 :: TokenValue (TokenValue -> a) -> Parser Token a
+trans1 :: TokenValue a -> Parser Token a
+
+peekPos :: Parser Token Pos
+ \end{CleanCode}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Statistics}
+ \framesubtitle{Lines of code}
+ \lstinputlisting{|"wc -l ../../*.[di]cl"}
+ \pause
+ \begin{block}{}
+ \emph{``Measuring programming progress by lines of code is like
+ measuring aircraft building progress by weight.''}\\
+ {---} Bill Gates
+ \end{block}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Statistics}
+ \framesubtitle{Hours of work}
+ We have no clue how much time we have worked on it\ldots
+ \pause
+ \begin{block}{}
+ \emph{``Choose a job you love, and you will never have to work a day in
+ your life.''}\\
+ {---} Confucius
+ \end{block}
+\end{frame}
+
+\section{Examples}
+\begin{frame}
+ \frametitle{Weird inputs}
+ \begin{itemize}
+ \item \pause Heap full
+ \pause\ldots Increase heap\\
+ \texttt{\$ ./spl -h 2000M}
+ \item \pause Stack full
+ \pause\ldots Increase stack\\
+ \texttt{\$ ./spl -s 200M}
+ \item \pause Segmentation fault
+ \pause\ldots Enable memory overcommitting\\
+ \texttt{\# echo 1 > /proc/sys/vm/overcommit\_memory}
+ \item \pause Still segmentation fault
+ \pause\ldots Buy more \textsc{RAM}
+ \item \pause Still segmentation fault?
+ \pause\ldots Divide into modules and parse separatly~\footnote{To be
+ implemented}
+ \item \pause Thus, we are only limited by hardware\ldots
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Learned lessons}
+ \begin{itemize}
+ \item \pause Parser combinators are elegant!
+ \item \pause Positional errors are a must!
+ \item \ldots
+ \end{itemize}
+\end{frame}