update pars
authorpimjager <pim@pimjager.nl>
Sun, 19 Jun 2016 11:53:20 +0000 (13:53 +0200)
committerpimjager <pim@pimjager.nl>
Sun, 19 Jun 2016 11:53:20 +0000 (13:53 +0200)
deliverables/report/pars.tex
deliverables/report/report.tex

index 8ed7335..49c4137 100644 (file)
@@ -1,10 +1,10 @@
 \section{Lexing \& parsing}\label{sec:pars}
 \subsection{\Yard}
-For both lexing and parsing we use proof of concept minimal parser combinators
+For both lexing and parsing we use a minimal parser combinator
 library called \Yard. \Yard{} is inspired by the well-known \textsc{Parsec}
-library. Where \Yard{} only has 7 primitive parser (combinators)
-\textsc{Parsec} already has 9 categories of parser combinators with in every
-category there are numerous combinators.
+library. Where \Yard{} only has 7 primitive parser(s) (combinators)
+\textsc{Parsec} already has 9 categories of parser combinators with numerous 
+combinators in every category.
 
 Parsers implemented in Yard parse left to right and are greedy, that is that
 they always try to consume as much input as possible, starting from the left
@@ -37,19 +37,21 @@ The existing \SPL{} grammar was not suitable for parsing and lexing. The
 grammar listed in Listing~\ref{lst:grammar} shows the current and final
 grammar. The grammar for \SPLC{} has been extended to accommodate for the
 syntactic sugar \SPLC{} introduces, such as string and list literals, and for
-anonymous lambda functions. Moreover we have applied transformation on the
+anonymous lambda functions. Moreover we have applied transformations on the
 grammar including eliminating left recursion, fixing operator priority and
 associativity.
 
-To make the parsing more easy we first lex the character input into tokens. In
+To make the parsing easier we first lex the character input into tokens. In
 this way the parser can be simplified a lot and some more complex constructs
 can be lexed as one token such as literal characters.
 
 As said, the lexer uses a \Yard{} parser. The parser takes a list of characters
 and returns a list of \CI{Token}s. A token is a \CI{TokenValue} accompanied
-with a position and the \emph{ADT} used is shown in Listing~\ref{lst:lextoken}.
-Parser combinators make it very easy to account for arbitrary white space and
-it is much less elegant to do this in a regular way.
+with a position. An excerpt of the \emph{ADT} of tokens is shown in 
+Listing~\ref{lst:lextoken}.
+The used parser combinators make it very easy to account for arbitrary white 
+space and in a much more elegant way manipulating the input as a list of
+characters directly.
 Listing~\ref{lst:lexerwhite} shows the way we handle white space and
 recalculate positions. By choosing to lex with parser combinators the speed of
 the phase decreases. However due to the simplicity of the lexer this is barely
@@ -91,16 +93,17 @@ lexProgram line column = lexToken >>= \t->case t of
 
 A lexer written with parser combinators is pretty straight forward and in
 practice it is just a very long list of \texttt{alternative} monadic
-combinators. However the order is very important since some tokens are very
-greedy. Almost all tokens can be lexed trivially with the \CI{list} combinator
+combinators. However the order is very important since some tokens are so
+greedy they might consume other tokens. Almost all tokens can be lexed trivially
+with the \CI{list} combinator
 for matching literal strings. Comments and literals are the only exception that
 require a non trivial parser.
 
 \subsection{Parsing}
 The parsing phase is the second phase of the parser and is yet again a \Yard{}
 parser that transforms a list of tokens to an \emph{Abstract Syntax
-Tree}(\AST). The full abstract syntax tree is listed in Listing~\ref{lst:ast}
-which closely resembles the grammar.
+Tree} (\AST). The full abstract syntax tree is listed in Listing~\ref{lst:ast}
+and closely resembles the grammar.
 
 The parser uses the standard \Yard{} combinators. Due to the modularity of
 combinators it was and is very easy to add functionality to the parser. The
@@ -111,8 +114,8 @@ expressions to real functions representing constant values.
 
 As an example we show the parsing of a \CI{FunDecl} in
 Listing~\ref{lst:fundecl}. The \CI{FunDecl} is one of the most complex parsers
-and is composed of as complex subparsers. A \CI{FunDecl} parser exactly one
-complete function.
+and is composed of complex subparsers. A \CI{FunDecl} parser exactly one
+complete function declaration.
 
 First we do the non consuming \CI{peekPos} to get the position of the first 
 token without consuming it, after that the identifier is parsed
@@ -124,7 +127,7 @@ a yet another helper function to parse comma separated items.
 
 Since the next element of the \ADT{} is a \CI{Maybe} the next parser is
 combined with the optional combinator since the type of a function is optional
-and when not given it will be inferred later.
+and when not given will be inferred later.
 
 A function consists of \emph{many} \CI{VarDecl}s and then \emph{many}
 \CI{Stmt}s. The word \emph{many} in \Yard{} means zero or more while the word
@@ -143,12 +146,12 @@ multiple.
 
 parseFunDecl :: Parser Token FunDecl
 parseFunDecl = liftM6 FunDecl
-       (peekPos)
-       (parseIdent)
-       (parseBBraces $ parseSepList CommaToken parseIdent)
-       (optional (satTok DoubleColonToken *> parseFunType))
-       (satTok CBraceOpenToken *> many parseVarDecl)
-       (flatten <$> (many parseStmt <* satTok CBraceCloseToken))
+       (peekPos) //position of FunDecl
+       (parseIdent) //function name
+       (parseBBraces $ parseSepList CommaToken parseIdent) //list of arguments
+       (optional (satTok DoubleColonToken *> parseFunType)) //optional type
+       (satTok CBraceOpenToken *> many parseVarDecl) //list of VarDecls
+       (flatten <$> (many parseStmt <* satTok CBraceCloseToken)) //list of Stmts
 \end{lstlisting}
 
 \subsection{Sugars} \label{ssec:synsugar}
@@ -178,9 +181,9 @@ pretty print data the number of arguments of the \SI{print} function is not
 fixed and it is expanded at time of compilation. With this sugar the programmer
 can print several different types in one line. Listing~\ref{lst:varprint} shows
 an example of the sugar. In the semantic analysis phase these statements are
-actually refined even more to represent the specific print function per type
-since the compiler allows printing of \SI{Int}, \SI{Bool}, \SI{Char} and
-\SI{[Char]}
+actually refined even more to represent the specific print function per type 
+during the semantical analysis phase, since \SPLC{} allows printing of 
+\SI{Int}, \SI{Bool}, \SI{Char} and \SI{[Char]}
 \begin{lstlisting}[
        language=SPLCode,
        caption={Variable arguments printing},
@@ -195,8 +198,8 @@ print('c');
 print('d':'a':'\n':[]);
 \end{lstlisting}
 
-The last sugar processed in the parsing or lexing phase are the \SI{let}
-constructions. These constructions provide an easy way of defining global
+The last sugar processed in the parsing phase are the \SI{let}
+constructions. These provide an easy way of defining global
 constants without real constants. While we do not allow global variables one
 might want to introduce global constants and with these constructs this can be
 done very easily. Listing~\ref{lst:letgl} shows the expansion of \SI{let}
index de447ea..a82890a 100644 (file)
@@ -1,4 +1,4 @@
-\documentclass[draft]{article}
+\documentclass{article}
 
 \usepackage{listings,clean,spl}  %Sourcecode
 \usepackage[hidelinks]{hyperref} %Clickable references