X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=deliverables%2Fp1%2Fp1.tex;h=27c30d160b6dad7690a119bf7759744b8e7ed6dd;hb=285d41abeaa5a7c9297009da26b83b0236390c02;hp=67a14b0494814ce514b5a3d2779db8797d0080ac;hpb=f622bae746c1b5b970e7171a2df8f0e6e3fcc5b8;p=cc1516.git diff --git a/deliverables/p1/p1.tex b/deliverables/p1/p1.tex index 67a14b0..27c30d1 100644 --- a/deliverables/p1/p1.tex +++ b/deliverables/p1/p1.tex @@ -5,7 +5,6 @@ \section{Introduction} \begin{frame} \frametitle{\textsc{SPL}} - \framesubtitle{Acronym for: \textsc{SPL}: Parser and Lexer} \begin{block}{Features} \begin{itemize} \item Implementation language: @@ -35,10 +34,14 @@ A yard is exactly $36$ inch and an inch is exactly the length of $3$ barleycorns}. \item Definitons: - \begin{lstlisting} + \begin{CleanCode} :: Error = PositionalError Int Int String | Error String :: Parser a b = Parser ([a] -> (Either Error b, [a])) - \end{lstlisting} + \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 @@ -49,23 +52,73 @@ \begin{frame}[fragile] \frametitle{\textsc{YARD} Combinators} - \begin{lstlisting} -instance Functor (Parser a) -instance Applicative (Parser a) -instance Monad (Parser a) -instance Alternative (Parser a) - -runParser :: (Parser a b) [a] -> (Either Error b, [a]) -() :: (Parser a b) Error -> Parser a b + \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 -satisfy :: (a -> Bool) -> Parser a a -check :: (a -> Bool) -> Parser a a -(until) infix 2 :: (Parser a b) (Parser a c) -> Parser a [b] -item :: a -> Parser a a | Eq a -list :: [a] -> Parser a [a] | Eq 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} @@ -96,8 +149,9 @@ eof :: Parser a Void \begin{frame}[fragile] \frametitle{Two-phase design} \framesubtitle{Parsing} + Read from stdin, write to stdout\\ Added some handy primitives - \begin{lstlisting} + \begin{CleanCode} parseBlock :: Parser Token [Stmt] parseOpR :: (Parser Token Op2) (Parser Token Expr) -> Parser Token Expr @@ -107,7 +161,7 @@ trans2 :: TokenValue (TokenValue -> a) -> Parser Token a trans1 :: TokenValue a -> Parser Token a peekPos :: Parser Token Pos - \end{lstlisting} + \end{CleanCode} \end{frame} \begin{frame}[fragile] @@ -136,7 +190,7 @@ peekPos :: Parser Token Pos \section{Examples} \begin{frame} - \frametitle{Wierd inputs} + \frametitle{Weird inputs} \begin{itemize} \item \pause Heap full \pause\ldots Increase heap\\