2021-04-18 10:23:24 +00:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< title > YBlog - Parsec Presentation< / title >
< meta name = "keywords" content = "programming, haskell, parsec, parser" / >
< link rel = "shortcut icon" type = "image/x-icon" href = "../../../../Scratch/img/favicon.ico" / >
2021-05-25 20:25:47 +00:00
< link rel = "stylesheet" type = "text/css" href = "/css/y.css" / >
< link rel = "stylesheet" type = "text/css" href = "/css/legacy.css" / >
< link rel = "alternate" type = "application/rss+xml" title = "RSS" href = "/rss.xml" / >
2021-04-18 10:23:24 +00:00
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< link rel = "apple-touch-icon" href = "../../../../Scratch/img/about/FlatAvatar@2x.png" / >
<!-- [if lt IE 9]>
< script src = "http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" > < / script >
<![endif]-->
<!-- IndieAuth -->
< link href = "https://twitter.com/yogsototh" rel = "me" >
< link href = "https://github.com/yogsototh" rel = "me" >
< link href = "mailto:yann.esposito@gmail.com" rel = "me" >
< link rel = "pgpkey" href = "../../../../pubkey.txt" >
< / head >
< body lang = "en" class = "article" >
< div id = "content" >
< div id = "header" >
< div id = "choix" >
< span id = "choixlang" >
< a href = "../../../../Scratch/fr/blog/Parsec-Presentation/" > French< / a >
< / span >
< span class = "tomenu" > < a href = "#navigation" > ↓ Menu ↓< / a > < / span >
< span class = "flush" > < / span >
< / div >
< / div >
< div id = "titre" >
< h1 > Parsec Presentation< / h1 >
< / div >
< div class = "flush" > < / div >
< div id = "afterheader" class = "article" >
< div class = "corps" >
< p > < img src = "http://yogsototh.github.io/parsec-presentation/parsec/img/mp/AST.png" alt = "AST" / > < br / >
< / p >
< div class = "intro" >
< p > < span class = "sc" > < abbr title = "Too long; didn't read" > tl;dr< / abbr > : < / span > Short introduction to Parsec for beginner.< / p >
< / div >
< ul >
< li > The < span class = "sc" > < abbr title = "HyperText Markup Language" > html< / abbr > < / span > presentation is < a href = "http://yogsototh.github.io/parsec-presentation/parsec.html" > here< / a > .< / li >
< / ul >
< div style = "display:none" >
() () () () () (
) (
< p > ) () () () () () () () () ()< / p >
< / div >
<!-- Begin slides. Just make elements with a class of slide. -->
< section class = "slide" >
< div style = "text-align:center; font-size: .9em; width: 100%; line-height: 1.2em" >
< h1 style = "position: relative;" >
Parsec
< / h1 >
< author > < em class = "base1" > by< / em > Yann Esposito< / author >
< div style = "font-size:.5em; margin: 0 1em;" >
< p > < twitter > < a href = "http://twitter.com/yogsototh" > < span class = "citation" data-cites = "yogsototh" > @yogsototh< / span > < / a > , < / twitter > < googleplus > < a href = "https://plus.google.com/117858550730178181663" > +yogsototh< / a > < / googleplus > < / p >
< / div >
< div style = "font-size:.8em" >
< p > < em class = "base1" > for< / em > < a href = "http://www.meetup.com/riviera-scala-clojure" > Riviera Scala Clojure Meetup (Haskell) < / a > < br / > < em class = "base1" > the< / em > < ti style = "font-size: .8em" > 8 Oct 2013< / ti > < / p >
< / div >
< / div >
< / section >
< section class = "slide" >
< h2 id = "parsing" >
Parsing
< / h2 >
< p >
Latin pars (ōrātiōnis), meaning part (of speech).
< / p >
< ul >
< li >
< strong > analysing a string of symbols< / strong >
< / li >
< li >
< strong > formal grammar< / strong > .
< / li >
< / ul >
< / section >
< section class = "slide" >
< h2 id = "parsing-in-programming-languages" >
Parsing in Programming Languages
< / h2 >
< p >
Complexity:
< / p >
< table >
< thead >
< tr class = "header" >
< th align = "left" >
Method
< / th >
< th align = "left" >
Typical Example
< / th >
< th align = "left" >
Output Data Structure
< / th >
< / tr >
< / thead >
< tbody >
< tr class = "odd" >
< td align = "left" >
Splitting
< / td >
< td align = "left" >
CSV
< / td >
< td align = "left" >
Array, Map
< / td >
< / tr >
< tr class = "even" >
< td align = "left" >
Regexp
< / td >
< td align = "left" >
email
< / td >
< td align = "left" >
< ul >
< li > Fixed Layout Tree
< / td >
< / tr >
< tr class = "odd" >
< td align = "left" >
Parser
< / td >
< td align = "left" >
Programming language
< / td >
< td align = "left" >
< ul >
< li > Most Data Structure
< / td >
< / tr >
< / tbody >
< / table >
< / section >
< section class = "slide" >
< h2 id = "parser-culture" >
Parser < span class = "and" > & < / span > culture
< / h2 >
< p >
In Haskell Parser are really easy to use.
< / p >
< p >
Generally:
< / p >
< ul >
< li >
In most languages: < strong > split< / strong > then < strong > regexp< / strong > then < strong > parse< / strong >
< / li >
< li >
In Haskell: < strong > split< / strong > then < strong > parse< / strong >
< / li >
< / ul >
< / section >
< section class = "slide" >
< h2 id = "parsing-example" >
Parsing Example
< / h2 >
< p >
From String:
< / p >
< pre class = "sourceCode haskell" > < code class = "sourceCode haskell" > (< span class = "dv" > 1< / span > < span class = "fu" > +< / span > < span class = "dv" > 3< / span > )< span class = "fu" > *< / span > (< span class = "dv" > 1< / span > < span class = "fu" > +< / span > < span class = "dv" > 5< / span > < span class = "fu" > +< / span > < span class = "dv" > 9< / span > )< / code > < / pre >
< p >
To data structure:
< / p >
< p >
< img src = "http://yogsototh.github.io/parsec-presentation/parsec/img/mp/AST.png" alt = "AST" / > < br / >
< / p >
< / section >
< section class = "slide" >
< h2 id = "parsec" >
Parsec
< / h2 >
< blockquote >
< p >
Parsec lets you construct parsers by combining high-order Combinators to create larger expressions.
< / p >
< p >
Combinator parsers are written and used within the same programming language as the rest of the program.
< / p >
< p >
The parsers are first-class citizens of the languages […]"
< / p >
< p >
< em > < a href = "http://www.haskell.org/haskellwiki/Parsec" > Haskell Wiki< / a > < / em >
< / p >
< / blockquote >
< / section >
< section class = "slide" >
< h2 id = "parser-libraries" >
Parser Libraries
< / h2 >
< p >
In reality there are many choices:
< / p >
< table >
< tbody >
< tr class = "odd" >
< td align = "left" >
attoparsec
< / td >
< td align = "left" >
fast
< / td >
< / tr >
< tr class = "even" >
< td align = "left" >
Bytestring-lexing
< / td >
< td align = "left" >
fast
< / td >
< / tr >
< tr class = "odd" >
< td align = "left" >
Parsec 3
< / td >
< td align = "left" >
powerful, nice error reporting
< / td >
< / tr >
< / tbody >
< / table >
< / section >
< section class = "slide" >
< h2 id = "haskell-remarks-1" >
Haskell Remarks (1)
< / h2 >
< p >
spaces are meaningful
< / p >
< pre class = "sourceCode haskell" > < code class = "sourceCode haskell" > f x < span class = "co" > -- ⇔ f(x) in C-like languages< / span >
f x y < span class = "co" > -- ⇔ f(x,y)< / span > < / code > < / pre >
< / section >
< section class = "slide" >
< h2 id = "haskell-remarks-2" >
Haskell Remarks (2)
< / h2 >
< p >
Don’ t mind strange operators (< code > < *> < / code > , < code > < $> < / code > ).< br / > Consider them like separators, typically commas.< br / > They are just here to deal with types.
< / p >
< p >
Informally:
< / p >
< pre class = "sourceCode haskell" > < code class = "sourceCode haskell" > toto < span class = "fu" > < $> < / span > x < span class = "fu" > < *> < / span > y < span class = "fu" > < *> < / span > z
< span class = "co" > -- ⇔ toto x y z< / span >
< span class = "co" > -- ⇔ toto(x,y,z) in C-like languages< / span > < / code > < / pre >
< / section >
< section class = "slide" >
< h2 id = "minimal-parsec-examples" >
Minimal Parsec Examples
< / h2 >
< pre class = "sourceCode haskell" > < code class = "sourceCode haskell" > whitespaces < span class = "fu" > =< / span > many (oneOf < span class = "st" > " \t " < / span > )
number < span class = "fu" > =< / span > many1 digit
symbol < span class = "fu" > =< / span > oneOf < span class = "st" > " !#$%< span class = "and" > & < / span > |*+-/:< => ?@^_~" < / span > < / code > < / pre >
< pre class = "sourceCode haskell" >
< code class = "sourceCode haskell" > < span class = "st" > " \t "< / span > < span class = "co" > – whitespaces on " \t "< / span > < span class = "st" > ""< / span > < span class = "co" > – whitespaces on “32”< / span > < span class = "st" > “32”< / span > < span class = "co" > – number on “32”< / span > < / li >
< / ul > < / li >
< / ul >
< span class = "co" > – number on "
< / div >
< div id = "afterarticle" >
< div id = "social" >
2021-05-25 20:25:47 +00:00
< a href = "/rss.xml" target = "_blank" rel = "noopener noreferrer nofollow" class = "social" > RSS< / a >
2021-04-18 10:23:24 +00:00
·
< a href = "https://twitter.com/home?status=http%3A%2F%2Fyannesposito.com/Scratch/en/blog/Parsec-Presentation/%20via%20@yogsototh" target = "_blank" rel = "noopener noreferrer nofollow" class = "social" > Tweet< / a >
·
< a href = "http://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fyannesposito.com/Scratch/en/blog/Parsec-Presentation/" target = "_blank" rel = "noopener noreferrer nofollow" class = "social" > FB< / a >
< br / >
< a class = "message" href = "../../../../Scratch/en/blog/Social-link-the-right-way/" > These social sharing links preserve your privacy< / a >
< / div >
< div id = "navigation" >
< a href = "../../../../" > Home< / a >
< span class = "sep" > ¦< / span >
< a href = "../../../../Scratch/en/blog" > Blog< / a >
< span class = "sep" > ¦< / span >
< a href = "../../../../Scratch/en/softwares" > Softwares< / a >
< span class = "sep" > ¦< / span >
< a href = "../../../../Scratch/en/about" > About< / a >
< / div >
< div id = "totop" > < a href = "#header" > ↑ Top ↑< / a > < / div >
< div id = "bottom" >
< div >
Published on 2013-10-09
< / div >
< div >
< a href = "https://twitter.com/yogsototh" > Follow @yogsototh< / a >
< / div >
< div >
< a rel = "license" href = "http://creativecommons.org/licenses/by/3.0/deed.en_US" > Yann Esposito©< / a >
< / div >
< div >
Done with
< a href = "http://www.vim.org" target = "_blank" rel = "noopener noreferrer nofollow" > < strike > Vim< / strike > < / a >
< a href = "http://spacemacs.org" target = "_blank" rel = "noopener noreferrer nofollow" > spacemacs< / a >
< span class = "pala" > & < / span >
< a href = "http://nanoc.ws" target = "_blank" rel = "noopener noreferrer nofollow" > < strike > nanoc< / strike > < / a >
< a href = "http://jaspervdj.be/hakyll" target = "_blank" rel = "noopener noreferrer nofollow" > Hakyll< / a >
< / div >
< hr / >
< div style = "max-width: 100%" >
< a href = "https://cardanohub.org" >
< img src = "../../../../Scratch/img/ada-logo.png" class = "simple" style = "height: 16px ;
border-radius: 50%;
vertical-align:middle;
display:inline-block;" />
ADA:
< / a >
< code style = "display:inline-block;
word-wrap:break-word;
text-align: left;
vertical-align: top;
max-width: 85%;">
DdzFFzCqrhtAvdkmATx5Fm8NPJViDy85ZBw13p4XcNzVzvQg8e3vWLXq23JQWFxPEXK6Kvhaxxe7oJt4VMYHxpA2vtCFiP8fziohN6Yp
< / code >
< / div >
< / div >
< / div >
< / div >
< / div >
< / body >
< / html >